Joomla! Версии 2.5 и выше построена с применением подхода MVC (Model, View, Controller), когда подразумевается, что надо выделять 3 основных сущности:
- модель - работает с данными;
- представление - отображают контент, соответственно его типу (error, feed, html, json, raw, xml) и шаблону, выбранном контроллером;
- контроллер - выполняет задачи, устанавливают и получают состояния моделей и определяют представления, которые необходимо отобразить.
Точка входа в фронтенд компонента
В ядре Joomla! класс для управления контроллерами - JController. Для реализации собственного контроллера надо унаследоваться от этого класса (или от его производных). Файл точка входа в компонент site/helloworld.php должен содержать следующие строки:
<?php // Предотвращает прямой доступ к этому файлу defined('_JEXEC') ordie('Restrictedaccess'); // Подключение описания класса JController jimport('joomla.application.component.controller'); // Получает объект класса контроллера, префикс которого HelloWorld $controller = JController::getInstance('HelloWorld'); // Исполнение задачи (заданной переменной task) $input = JFactory::getApplication()->input; $controller->execute($input->getCmd('task')); // Вызывает перенаправление, если такое действие было установлено $controller->redirect(); ?>
Создаём контроллер по умолчанию(фронтенд)
Статический метод getInstance класса JController создаёт контроллер. Это будет объект класса HelloWorldController. По умолчанию Joomla! будет искать в корневой папке компонента файл с именем controller.php.
Поскольку мы работаем с фронтендом, то будем наследоваться от класса JControllerLegacy, который, в свою очередь, наследуется от класса JController и не имеет никакой дополнительной функциональности (это сделано для совместимости с дальнейшими версиями Joomla!).
Создадим этот файл. Код файла:
< p><?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.controller'); class HelloWorldController extends JControllerLegacy { } ?>
Пока что оставим тело нашего контроллера пустым.
Мы помним, что контроллер обрабатывает полученную с запроса задачу. По умолчанию, если задача не установлена, то контроллер выполнит задачу с именем display, которая отвечает за отображение. Задача - это переменная запроса с именем task, значение которой выглядит следующим образом:
<имя контроллера>.<имя метода>
Это означает, что будет создан объект класса контроллера с заданным именем, от имени которого будет вызван указанный метод. Также по умолчанию будет отображено представление с именем, соответствующем префиксу контроллера (в нашем случае - HelloWorld).
Создаём представление по умолчанию(фронтенд)
Когда контроллер решает отобразить представление, производиться поиск файла по пути component/com_<имя компонента>/views/<имя представления>.
Название директории с представлением по умолчанию - такое как и название компонента. В нашем случае путь - component/com_helloworld/views/helloworld/.
Файл, в котором храниться код представления имеет имя view.<режим отображения>.php. По умолчанию режим отображения и, скорее всего, вы будете использовать только этот режим, - html. Тогда, файл с кодом представления будет называться view.html.php.
Создадим этот файл site/views/helloworld/view.html.php:
<?php defined('_JEXEC') or die('Restricted access'); //подключение объявления класса представления jimport('joomla.application.component.view'); class HelloWorldViewHelloWorld extends JViewLegacy { // Переопределение метода отображения function display($tpl = null) { $this->msg = "Hello World from FRONTEND"; // Отображение представления parent::display($tpl); } }
Метод display вызывается, когда установлена одноимённая задача в контроллере. Класс представления, по сути, состоит из двух частей:
- Собственно, класс, унаследованный от JView.
- Файл шаблона.
Создадим шаблон отображения для нашего представления. По умолчанию представления используют как шаблон файл (если явно не установлено иное значение в переменной запроса layout)
component/com_<имя компонента>/views/<имя представления>/tmpl/default.php.
<?php defined('_JEXEC') or die('Restricted access'); ?> <h1><?php echo $this->msg; ?></h1> ?>
Заметим, что переменные, объявленные в классе, доступны также и в шаблоне - таким образом, мы установили значение переменной msg в классе и, соответственно, можем использовать эту переменную в шаблоне.
Теперь только осталось составить установочный архив из файлов и папок, созданных в предыдущем уроке, и созданных в текущем, а также в файл манифеста записать строку:
<folder>views</folder>
В секцию files со значением атрибута folder=”site”. Также в файле манифеста поменяйте номер версии расширения.
Успехов в разработке.