В Joomla 1.5 разработчиками реализован собственный API, работающий по принципу Model-View-Controller.
Model-View-Controller (в дальнейшем - MVC) является схемой-паттерном для создания гибких и легко расширяемых приложений с пользовательским интерфейсом. Эта схема была разработана создателями Smalltalk-80 ещё в 1980 г.
В компоненте, построенном с помощью технологии MVC, используются три основные части:
Модель (Model) - это часть компонента, которая оперирует данными приложения. В общем случае модель содержит методы добавления, удаления, и обновления информации. Таким образом, если программа сохраняет данные в файлы, а нужно сохранять их в БД, то для этого нужно изменить только модель, не трогая остальной код.
Вид (View) – это часть компонента, которая берет данные из модели и выводит их в пользовательский интерфейс. Для простых веб-приложений, Вид генерирует html-страницу, с входными данными. Т.е. вид берет данные из модели, и вносит их в шаблон, который в конечном итоге и видит пользователь. Вид не изменяет данные, он только отображает их из модели.
Контроллер (Controller) - отвечает за действия пользователя. По сути, действие пользователя - это запрос страницы. Контроллер в зависимости от запроса, вызывает модель, для управления данными, и управляет переходом Модели на Вид. Таким образом, контроллер не отображает данные, а лишь вызывает модель, которая изменяет данные, а затем передает модель в вид, который отображается на экране. Схема принципа работы технологии MVC представлена на рисунке 1.6.
Рис. 1.6 – Принцип работы технологии Model-View-Controller
Такое разделение удобно для групповой работы над проектом, дисциплинирует и дает отличное качество получаемого кода.
MVC позволяет избежать зависимости модели от интерфейса, появилась дополнительная возможность к повторному использованию кода без его изменения.
В Joomla 1.5, технология MVC использует три класса: JModel , JView и JController .
В этой главе будут рассмотрены основные принципы проектирования и реализации компонентов для JoomlaCMSверсии 1.5 на примере разработки простого компонента “Hello”, использующего основные методы и функции внутреннего интерфейса программирования системы.
Каждый компонент Joomla, реализованный по технологии MVC, имеет структуру расположения файлов, представленную на рисунке 2.1.
Рис. 2.1 – Начальная структура компонента Joomla 1.5
Директория «admin» содержит файлы по настройке и управлению компонента из административной панели JoomlaCMS.
Директория «site» содержит файлы для лицевой части компонента, видимой посетителями сайта. Рассмотрим наиболее важные файлы этой директории:
· /site/{componentname}.php
Точка входа (или точка отправления) для лицевой части компонента. Является обязательным исполнительным файлом.
· /site/controller.php
Является основным управлением компонента, либо подключает дополнительные файлы, в зависимости от переданных внешних данных.
· /site/views/{viewname}/view.html.php
Обработчик полученных данных. После обработки передает данные для вывода на сайте.
· /site/views/{viewname}/tmpl
Шаблон вывода полученных данных от обработчика.
· /site/models
Директория содержит модели, используемые компонентов в процессе работы.
· /site/controllers
Директория содержит расширяющие контроллеры для основного, либо набор необходимых компоненту контроллеров.
Файловая структура директории «admin» в точности повторяет структуру лицевой части компонента, описанной выше. Необходимо учитывать, что директории «site» и «admin» не пересекаются в процессе работы компоненты. По большому счету, эти две директории можно рассматривать как два различных подкомпонента одного большого компонента.
Joomla CMS обрабатывает компонент в следующей последовательности:
· Joomla интерпретирует полученные значения в URL.
· Ищет составляющую таблицу компонента в базе данных.
· Затем определяет директорию компонента.
· В этой директории запускает исполнительный файл компонента. В данном случае – это файл hello.php.
· Исполняет этот файл.
2.2. Создание точки входа компонента (файл hello.php)
Joomla всегда обрабатывает ссылку в корневом файле index.php для страниц лицевой части сайта или administrator/index.php для страниц административного интерфейса системы. Функция обработки URL загружает требуемый компонент, основанный на значении 'option' в URL (используется метод передачи данных GET) или переданных данных методом POST.
Для разрабатываемого компонента, URL будет выглядеть следующим образом:
index.php? option=com_hello&view=hello
Эта ссылка запускает выполнение файла, являющего точкой входа в компонент: components/com_hello/hello.php.
Ниже приведен листинг файла hello.php:
<?php
// Защита от прямого обращения к скрипту
defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключениефайлаконтроллера.
require_once( JPATH_COMPONENT.DS.'controller.php' );
// Проверка на дополнительные контроллеры
if($controller = JRequest::getVar( 'controller' )) {
require_once( JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php' );
}
// Созданиеклассаконтроллера компонента
$classname = 'HelloController'.$controller;
$controller = new $classname( );
// Выполнитьзадачузапроса
$controller->execute( JRequest::getVar( 'task' ) );
// Переадресация
$controller->redirect();
Рассмотримкодболееподробно:
1) defined( '_JEXEC' ) or die( 'Restricted access' );
Первая строка предотвращает прямой доступ к исполнительному файлу в целях общей безопасности сайта:
2) require_once( JPATH_COMPONENT.DS.'controller.php' );
Следующая строка подключает основной контроллер компонента.
JPATH_COMPONENT - абсолютный путь к текущему компоненту, в данном случае - это components/com_hello.
DS - автоматический выбор слеша (разделителя директорий) '\' или '/', в зависимости от ОС. Таким образом, разработчик не должен волноваться о том, на какой системе установлена Joomla.
3) if($controller = JRequest::getVar( 'controller' ))
Проверка на наличие вспомогательных контроллеров для компонента. Если таковые присутствуют, то подключаются из директории /controllers компонента. В рассматриваемом случае контроллер всего один.
4)$classname = 'HelloController'.$controller;
$controller = new $classname( );
Создание класса основного контроллера компонента.
5) $controller->execute( JRequest::getVar( 'task' ) );
Получение контроллером текущей задачи из полученного URLвида: index.php?option=com_hello&task=Задача. Если значение taskв переданном URLпустое, по умолчанию используется задача «display», предназначенная для вывода данных. При использовании задачи сохранения или удаления страницы контроллер компонента вызывает перенаправление на другую страницу с помощью строки $controller->redirect();
Фактически, точка входа компонента передает управлению контроллеру компонента для выполнения задачи, которая была определена в полученном запросе.
2.3. Создание контроллера компонента (файл controller.php)
Поскольку разрабатываемый компонент предназначен лишь для представления основ реализации компонентов под Joomla, контроллер этого компонента – очень простой. В некоторых больших компонентах число строк контроллера достигает до нескольких тысяч. В контроллере компонента «Hello» используется только один метод - display(). Большая часть необходимых функций уже встроена в класс JController, так что все, что требуется, это вызвать метод JController::display() .
Ниже представлен листинг файла controller.php:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');
class HelloController extends JController
{
// метод вывода данных компонента
functiondisplay()
{
parent::display();
}
}
display () - это первый по приоритету метод, он вызывает родительский конструктор. JController :: display () метод определяет название шаблонов вывода запроса и загрузки, которые определяют и устанавливают выбор ветки в дереве задач.
2.4. Создание модели компонента (файл /models/hello.php)
Модель - часть компонента, которая передает данные Виду компонента по его запросу, отправленному через Контроллер компонента. Такой метод часто освобождает от рутинной работы и от хаоса в коде, предоставляет возможность управлять данными удобным способом в дополнение к коду, который посылает запрос данных из Модели.
В Joomla 1.5, Модель содержит классы функций: добавить, удалить и модернизировать информацию в таблицах базы данных. Также содержит методы восстановления списка таблиц базы данных.
Наименование моделей строятся следующим образом: название компонента, model, название модели.
В рассматриваемом случае это название приобретет вид HelloModelHello.
Другими словами, основная структура доступа к данным должна быть кратко описана в модели.
Таким способом, если обработку запроса данных необходимо изменить, Модель компонента будет единственным элементом, в который будут внемены изменения , не затрагивая код Вида или Контроллера компонента.
При переносе точки запроса данных в общем алгоритме компонента, изменения будут внесены только в код Вида компонента.
В модели разрабатываемого компонента, будет использовано моделирование события компонента "Hello", которое сгенерирует приветствие. Таким образом, в компоненте будет содержаться один запрос к модели getGreeting () и БД, который возвратит строку "Hello, World!".
Листингфайла/models/hello.php:
<?php
// Защита от прямого обращения к скрипту
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.model' );
class HelloModelHello extends JModel