Буду разбираться как в Закрытой части сайта вывести список записей из базы данных посредством класса 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&task=user.edit&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&task=user.edit&id=' . $item->id; }
Интересно также, что массив $items
перебирается по ссылке и дополняет сам себя новой записью url
.
Как видно, задача task
в ссылке указывается как user.edit
. Это означает, что через класс контроллера SimpleControllerUser
будет обращение к методу edit()
.
Файл шаблона компонента default.php
<?php defined( '_JEXEC' ) or die; ?> <form action="index.php?option=com_simple&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-ю очередь следует обратить внимание на следующие параметры:
action="index.php?option=com_simple&view=users"
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: getListQuery(), JController, JController Joomla 1.7, JHtml, JHtml Joomla 1.7, JHtmlJGrid, JHtmlJGrid Joomla 1.7, JModel, JModelList, JModelList Joomla 1.7, joomla 1.7, Joomla 1.7 backend, Joomla backend, _getList(), _getListQuery()
Запись опубликована
Среда, Июнь 6, 2012 в
09:20 и находится в
Joomla, Программирование .
Вы можете следить за ответами к этой записи через
RSS 2.0 ленту.
Вы можете оставить комментарий, или обратиться к записи со своего сайта.