Интерфейс администратора
Для интерфейса администратора потребуется создать практически такую же MVC структуру, как и для публичной части. Сначала изменим точку входа администраторской части нашего компонента admin/helloworld.php:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
// Устанавливаем обработку ошибок в режим использования Exception.
JError::$legacy = false;
// Подключаем библиотеку контроллера Joomla.
jimport('joomla.application.component.controller');
// Получаем экземпляр контроллера с префиксом HelloWorld.
$controller = JControllerLegacy::getInstance('HelloWorld');
// Исполняем задачу task из Запроса.
$input = JFactory::getApplication()->input;
$controller->execute($input->getCmd('task', 'display'));
// Перенаправляем, если перенаправление установлено в контроллере.
$controller->redirect();
Создаем общий контроллер
Теперь точка входа получает экземпляр класса контроллера с префиксом HelloWorld
. Давайте создадим базовый контроллер admin/controller.php для административной части:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
// Подключаем библиотеку контроллера Joomla.
jimport('joomla.application.component.controller');
/**
* Общий контроллер компонента Hello World.
*/
class HelloWorldController extends JControllerLegacy
{
/**
* Задача по отображению.
*
* @param boolean $cachable Если true, то представление будет закешировано.
* @param array $urlparams Массив безопасных url-параметров и их валидных типов переменных.
*
* @return void
*/
public function display($cachable = false, $urlparams = array())
{
// Устанавливаем представление по умолчанию, если оно не было установлено.
$input = JFactory::getApplication()->input;
$input->set('view', $input->getCmd('view', 'HelloWorlds'));
parent::display($cachable);
}
}
По умолчанию этот контроллер будет отображать представление HelloWorlds
, которое будет выводить список сообщений.
Создаем представление
Создаем представление для списка сообщений admin/views/helloworlds/view.html.php:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
// Подключаем библиотеку представления Joomla.
jimport('joomla.application.component.view');
/**
* HTML представление списка сообщений компонента HelloWorld.
*/
class HelloWorldViewHelloWorlds extends JViewLegacy
{
/**
* Сообщения.
*
* @var array
*/
protected $items;
/**
* Постраничная навигация.
*
* @var object
*/
protected $pagination;
/**
* Отображаем список сообщений.
*
* @param string $tpl Имя файла шаблона.
*
* @return void
*
* @throws Exception
*/
public function display($tpl = null)
{
try
{
// Получаем данные из модели.
$this->items = $this->get('Items');
// Получаем объект постраничной навигации.
$this->pagination = $this->get('Pagination');
// Отображаем представление.
parent::display($tpl);
}
catch (Exception $e)
{
throw new Exception($e->getMessage());
}
}
}
Обратите внимание, что в случае ошибок при получении данных из модели, мы не логируем их (как это делалось для публичной части), а генерируем исключение. И опять же, тут выбор за вами: выводить на экран, логировать или генерировать исключения.
Настало время вывести данные, поэтому создаем шаблон admin/views/helloworlds/tmpl/default.php с кодом:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
// Загружаем тултипы.
JHtml::_('behavior.tooltip');
?>
<form action="<?php echo JRoute::_('index.php?option=com_helloworld'); ?>" method="post" name="adminForm" id="adminForm">
<table class="adminlist">
<thead><?php echo $this->loadTemplate('head');?></thead>
<tbody><?php echo $this->loadTemplate('body');?></tbody>
<tfoot><?php echo $this->loadTemplate('foot');?></tfoot>
</table>
</form>
Этот шаблон вызывает несколько суб-шаблонов (head, body и foot). Каждый суб-шаблон хранится в файле, префикс названия которого состоит из названия главного шаблона (в нашем случае default) и нижнего подчеркивания. То есть в нашем случае названия будут: default_head, default_body и default_foot.
Создаем файл admin/views/helloworlds/tmpl/default_head.php:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
?>
<tr>
<th width="1%">
<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
</th>
<th>
<?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING'); ?>
</th>
<th width="1%">
<?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_HEADING_ID'); ?>
</th>
</tr>
В этом файле мы выводим заголовки списка. checkAll
- это javascript функция, которая позволяет выбрать все записи.
Создаем файл admin/views/helloworlds/tmpl/default_body.php:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
foreach ($this->items as $i => $item) : ?>
<tr>
<td>
<?php echo JHtml::_('grid.id', $i, $item->id); ?>
</td>
<td>
<?php echo $item->greeting; ?>
</td>
<td>
<?php echo $item->id; ?>
</td>
</tr>
<?php endforeach; ?>
В этом файле мы выводим непосредственно список записей. Напомним, что JHtml::_
- это хелпер функция, которая позволяет отобразить различные HTML элементы. В нашем случае она отображает чекбокс для записей.
Создаем файл admin/views/helloworlds/tmpl/default_foot.php:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
?>
<tr>
<td colspan="3"><?php echo $this->pagination->getListFooter(); ?></td>
</tr>
Здесь мы выводим постраничную навигацию.
Создаем модель
Представление HelloWorlds
запрашивает данные у модели. В Joomla есть специальный класс, который управляет списком данных - JModelList. Наследуемые от JModelList
классы по сути могут включать только:
- метод getListQuery - конструирует SQL запрос
list.start
- состояние модели для определения смещения спискаlist.limit
- состояние модели для определения длины списка
Методы getItems (для получения списка записей) и getPagination (для получения постраничной навигации) определены в классе JModelList
, поэтому их необязательно определять в классе HelloWorldModelHelloWorlds.
Создаем файл admin/models/helloworlds.php:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
// Подключаем библиотеку modellist Joomla.
jimport('joomla.application.component.modellist');
/**
* Модель списка сообщений компонента HelloWorld.
*/
class HelloWorldModelHelloWorlds extends JModelList
{
/**
* Метод для построения SQL запроса для загрузки списка данных.
*
* @return string SQL запрос.
*/
protected function getListQuery()
{
// Создаем новый query объект.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
// Выбераем поля.
$query->select('id, greeting');
// Из таблицы helloworld.
$query->from('#__helloworld');
return $query;
}
}
Собираем пакет установки компонента
Не забудьте поменять номер версии в файле helloworld.xml:
<version>0.0.5</version>
И добавить поддержку контроллера и представления в разделе основных файлов администрирования:
<filename>controller.php</filename>
<folder>views</folder>
helloworld.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
<name>Hello World!</name>
<!-- Следующие элементы необязательны -->
<creationDate>Июль 2012</creationDate>
<author>Вася Пупкин</author>
<authorEmail>Ваш e-mail</authorEmail>
<authorUrl>Ваш сайт</authorUrl>
<copyright>Информация о копирайте</copyright>
<license>Информация о лицензии</license>
<!-- Версия записывается в таблицу компонентов -->
<version>0.0.5</version>
<!-- Описание необязательно -->
<description>Описание компонента Hello World! ...</description>
<!-- Запускается при установке -->
<install>
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<!-- Запускается при удалении -->
<uninstall>
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<!-- Запускается при обновлении -->
<update>
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Раздел основных файлов сайта -->
<!-- Обратите внимание на значение аттрибута folder: Этот аттрибут описывает папку нашего пакета-установщика из которой должны копироваться файлы.
Поэтому указанные в этом разделе файлы будут скопированы из папки /site/ нашего пакета-установщика в соответствующую папку установки. -->
<files folder="site">
<filename>index.html</filename>
<filename>controller.php</filename>
<filename>helloworld.php</filename>
<folder>models</folder>
<folder>views</folder>
</files>
<!-- Администрирование -->
<administration>
<!-- Раздел Меню -->
<menu>Hello World!</menu>
<!-- Раздел основных файлов администрирования -->
<!-- Обратите внимание на значение аттрибута folder: Этот аттрибут описывает папку нашего пакета-установщика из которой должны копироваться файлы.
Поэтому указанные в этом разделе файлы будут скопированы из папки /admin/ нашего пакета-установщика в соответствующую папку установки. -->
<files folder="admin">
<filename>index.html</filename>
<filename>controller.php</filename>
<filename>helloworld.php</filename>
<folder>models</folder>
<folder>sql</folder>
<folder>tables</folder>
<folder>views</folder>
</files>
</administration>
</extension>
Содержимое директории с кодом:
helloworld.xml
site/index.html
site/helloworld.php
site/controller.php
site/models/index.html
site/models/helloworld.php
site/views/index.html
site/views/helloworld/index.html
site/views/helloworld/view.html.php
site/views/helloworld/tmpl/index.html
site/views/helloworld/tmpl/default.xml
site/views/helloworld/tmpl/default.php
admin/index.html
admin/controller.php
admin/helloworld.php
admin/models/index.html
admin/models/helloworlds.php
admin/models/fields/index.html
admin/models/fields/helloworld.php
admin/sql/index.html
admin/sql/install.mysql.utf8.sql
admin/sql/uninstall.mysql.utf8.sql
admin/sql/updates/index.html
admin/sql/updates/mysql/index.html
admin/sql/updates/mysql/0.0.1.sql
admin/sql/updates/mysql/0.0.4.sql
admin/tables/index.html
admin/tables/helloworld.php
admin/views/index.html
admin/views/helloworlds/index.html
admin/views/helloworlds/view.html.php
admin/views/helloworlds/tmpl/index.html
admin/views/helloworlds/tmpl/default.php
admin/views/helloworlds/tmpl/default_body.php
admin/views/helloworlds/tmpl/default_foot.php
admin/views/helloworlds/tmpl/default_head.php
Запакуйте директорию в архивный файл (zip, tar, tar.gz, bz2) или скачайте его напрямую c GitHub. Далее установите его, используя менеджер расширений Joomla. Теперь зайдите в компонент "hello-world" через меню "Компоненты" - вы увидите список записей, который сосоит из двух колонок, двух рядов и чекбоксов.
В следущей части мы разберем добавление языковой поддержки.