JHtml

’tag’

Вывод списка записей через класс JModelList в Закрытой части сайта в Joomla 1.7

Июнь 6, 2012

Буду разбираться как в Закрытой части сайта вывести список записей из базы данных посредством класса JModelList с тем отличием от Открытой части сайта, что будут доступны элементы редактирования записей, такие как выделение, публикация и другие по желанию.

За основу беру компонент com_simple Открытой части сайта.

Файл simple.php

<?php
defined( '_JEXEC' ) or die;

jimport('joomla.application.component.controller');

$controller = JController::getInstance('Simple');
$controller->execute(JRequest::getCmd('task'));
$controller->redirect();

Подключаем класс SimpleController.

Файл контроллера controller.php

<?php
defined( '_JEXEC' ) or die;

jimport('joomla.application.component.controller');

class SimpleController extends JController
{
}

Функционал без изменений наследуется из класса JController.

Файл модели users.php

<?php
defined( '_JEXEC' ) or die;

jimport('joomla.application.component.modellist');

class SimpleModelUsers extends JModelList
{
	public function getListQuery()
	{
		$query = parent::getListQuery();

		$query->select('*');
		$query->from('#__users');

		return $query;
	}

	public function getItems()
	{
		$items = parent::getItems();

		foreach ($items as &$item) {
			$item->url = 'index.php?option=com_simple&amp;task=user.edit&amp;id=' . $item->id;
		}

		return $items;
	}
}

Принцип работы модели компонента

Вновь идет задействование класса JModelList, как это было при получении и выводе списка записей в компоненте Открытой части сайта:

Сначала через метод getListQuery() класса JModelList формируется запрос, который в последствии вызывается через метод getItems(), который в свою очередь обращается к методу _getListQuery().

Таким образом, в переменную $items помещается список объектов, которые возвращает метод _getList() класса JModel.

Главная особенность и отличие метода getItems() класса SimpleModelUsers Закрытой части сайта заключается в цикле, в котором составляются ссылки на редактирование для каждой записи:

foreach ($items as &$item) {
	$item->url = 'index.php?option=com_simple&amp;task=user.edit&amp;id=' . $item->id;
}

Интересно также, что массив $items перебирается по ссылке и дополняет сам себя новой записью url.

Как видно, задача task в ссылке указывается как user.edit. Это означает, что через класс контроллера SimpleControllerUser будет обращение к методу edit().

Файл шаблона компонента default.php

<?php defined( '_JEXEC' ) or die; ?>
<form action="index.php?option=com_simple&amp;view=users" method="post" name="adminForm" id="adminForm">
	<table class="adminlist">
		<thead>
			<tr>
				<th width="10">
					<input type="checkbox" name="checkall-toggle" value="" onclick="checkAll(this)" />
				</th>
				<th><?php echo JText::_('COM_SIMPLE_USER_NAME_LABEL'); ?></th>
				<th><?php echo JText::_('COM_SIMPLE_USER_BLOCK_LABEL'); ?></th>
			</tr>
		</thead>
		<tbody>
			<?php foreach ($this->items as $i => $item) : ?>
				<tr class="row<?php echo $i % 2 ?>">
					<td class="center">
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					</td>
					<td>
						<a href="<?php echo $item->url; ?>"><?php echo $this->escape($item->name); ?></a>
					</td>
					<td class="center">
						<?php echo JHtml::_('jgrid.published', $item->block, $i, 'users.', true, 'cb'); ?>
					</td>
				</tr>
			<?php endforeach; ?>
		</tbody>
	</table>
</form>

В данной форме в 1-ю очередь следует обратить внимание на следующие параметры:

  1. action="index.php?option=com_simple&amp;view=users"
  2. name="adminForm"

Оба параметра обязательны. 1-й образуется от текущего вида, 2-й постоянный.

Поле для ввода checkall-toggle при нажатии вызывает функцию JavaScript checkAll(), которая является частью CMS Joomla 1.7. Однако, в таком виде, в каком находится сейчас компонент, данная функция не будет работать.

Для работы функции необходимо обязательное подключение Панели с кнопками в верхней части экрана через класс JToolBarHelper из вида компонента.

Классы строк чередуются как row0 и row1, цвет их ячеек будет отличаться. Стили заданы в стандартном CSS Закрытой части Joomla 1.7:
/administrator/templates/bluestork/css/template.css 

table.adminlist tbody tr.row1 td {
	background: #f0f0f0;
	border-top: 1px solid #FFF;
}

Но это все мелочи, по сравнению с возможностями, которые предоставляет Joomla для отображения данных. Речь идет про эту строчку:

<?php echo JHtml::_('grid.id', $i, $item->id); ?>

и эту:

<?php echo JHtml::_('jgrid.published', $item->block, $i, 'users.', true, 'cb'); ?>

Вызывается статический метод _() класса JHtml. Данный метод подгружает дополнительный класс и его метод. В обоих случаях идет обращение к классу JHtmlJGrid.

Параметры, которые передаются в метод _() обрабатываются внутри метода следующим образом:

list($key, $prefix, $file, $func) = self::extract($key);

Строка с точкой ".", которая передается в метод _() обрабатывается следующим образом:

$prefix = (count($parts) == 3 ? array_shift($parts) : 'JHtml');
$file	= (count($parts) == 2 ? array_shift($parts) : '');
$func	= array_shift($parts);

prefix – имя префикса подгружаемого файла.

file – имя подгружаемого файла.

По-другому, в метод extract() передается строка вида (prefix).(class).function, где prefix и class передавать необязательно. Если они не будут переданы, то будет вызван метод класса JHtml.

При строке jgrid.published, подключается класс JHtmlJGrid и вызывается метод published().

Таким образом, следующий код в файле шаблона вида users Закрытой части сайта default.php:

<?php echo JHtml::_('jgrid.published', $item->block, $i, 'users.', true, 'cb'); ?>

превращается в:

<a class="jgrid" href="javascript:void(0);" onclick="return listItemTask('cb0','users.publish')" title="Publish Item">
	<span class="state unpublish">
		<span class="text">Unpublished</span>
	</span>
</a>

Как видно, при нажатии на ссылку сработает функция JavaScript listItemTask().

Следующий код:

<?php echo JHtml::_('grid.id', $i, $item->id); ?>

превращается в:

<input type="checkbox" id="cb0" name="cid[]" value="42" onclick="isChecked(this.checked);" title="Checkbox for row 1" />

В следующих записях я по возможности рассмотрю доступные методы класса JHtml и его подклассов.

Tags: , , , , , , , , , , , , , ,
Записано в Joomla, Программирование    |    Постоянная ссылка