getListQuery()

’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, Программирование    |    Постоянная ссылка

Добавление модели и вида с шаблоном к компоненту в Joomla 1.7

Май 27, 2012

Для начала в папке с компонентом в открытой части сайта необходимо создать папку models.

В папке models должен быть файл с именем равным виду. Например:
http://localhost/index.php?option=com_simple&view=users

В данном случае в папке models должен быть файл users.php.

В то же время необходимо создать папку views с подпапкой users, которая должна содержать файл view.html.php и папку tmpl с файлом default.php.

Файл users.php должен содержать класс модели, имя которого начинается с названия компонента и заканчивается на название модели:
SimpleModelUsers

Судя по содержимому следующей папки:
/libraries/joomla/application/component

у нас в распоряжении имеется несколько классов модели, от которых может быть создан класс модели нашего компонента:

К сожалению, во-первых нет русской документации по данным классам, а также нормального объяснения принципа работы от самих разработчиков на английском. Есть официальная документация, но примеры использования только по самой Джумле нужно искать и самому себе объяснять их.

Класс JModelList позволяет быстро сделать выборку нужных значений запросом из базы данных.

Импортируем класс и определяем наследование класса:

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

class SimpleModelUsers extends JModelList

Теперь через родителя вызываем функцию getListQuery, которая всего лишь создаст почву для нового запроса:

public function getListQuery()
{
	$query = parent::getListQuery();

Теперь добавляем запрос и возвращаем его:

public function getListQuery()
{
	$query = parent::getListQuery();

	$query->select('name');
	$query->from('#__users')
		->where('id > 42');
	return $query;
}

Значения из базы данных могут быть получены посредством вызова функции getItems класса JModelList. Вызов производится из вида, а именно файла view.html.php:

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

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

class SimpleViewUsers extends JView
{
	protected $items;

	public function display($tpl = null)
	{
		$this->items = $this->get('Items');

		parent::display($tpl);
	}
}

Видно, что изначально импортируется файл с классом JView:

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

Файл находится здесь:
/libraries/joomla/application/component/view.php

Класс вида только один – JView.

Метод display класса JView всего лишь загружает файл шаблона из папки tmpl:

function display($tpl = null)
{
	$result = $this->loadTemplate($tpl);
	if (JError::isError($result)) {
		return $result;
	}
		echo $result;
}

В классе компонента сначала в переменную $items записываются данные из базы данных, полученные через запрос, созданный в модели компонента и выполненный посредством функции getItems класса JModelList.

Функция getItems вызывается через $this->get('Items'). Метод get класса вида JView сначала ищет метод, образованный через слияние "get" и передаваемого названия. В нашем случае "get + Items". Если метод не найден, то метод get класса вида JView обращается к своему родительскому классу JObject.

Полученные данные записываются в переменную $items класса вида компонента:

protected $items;

В завершение вызывается родительский метод display:

parent::display($tpl);

Теперь в файле default.php в папке с шаблонами tmpl можно вывести данные из переменной $items:

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

<?php foreach ($this->items as $item) : ?>
	<?php echo $this->escape($item->name); ?><br />
<?php endforeach; ?>

После запуска в стоке браузера следующего url:
http://localhost/joomla17/index.php?option=com_simple&view=users

На экране будет виден список пользователей.

Заключение

Вид view.html.php:

  • обращается к модели;
  • загружает шаблон.

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