Архитектура MVC в компонентах Joomla
Рассмотрены принципы реализации архитектуры MVC в компоненте и классы Joomla, использующиеся для этого.
Цель лекции:Ознакомиться с основами применения архитектуры MVC при разработке компонентов.
Взаимодействие элементов архитектуры MVC в Joomla
MVC("Model - View - Controller") - это набор паттернов проектирования, который предполагает разделение программного кода на три группы:
модели(model) используются для хранения данных. В Joomla модели реализуются с помощью абстрактного класса JModel;
представления(view) генерируют вывод для заданной информации с помощью шаблона. В Joomla реализуются с помощью абстрактного класса JView;
контроллеры(controller) получают команды от пользователя и управляют моделями и представлениями для выполнения этих команд. В Joomla реализуются с помощью абстрактного класса JController.
Приблизительно схема взаимодействия этих групп в коде Joomla представлена на следующей диаграмме последовательности (рис. 6.1 на основе иллюстрации из книги [4, p.246]).
Рис. 6.1. Взаимодействие контроллера, модели и представления
В файле /components/com_<имя компонента>/<имя компонента>.phpнаходится код для создания контроллера, например:
$controller = new MyComponentController(); $controller->execute(JRequest::getVar('task')); $controller->redirect();
В HTTP-запросе задается задача, представление и, при необходимости, другие данные. Метод execute() вызывает метод вашего контроллера, который называется так же, как и заданная задача. Если задача не указана, то ей будет присвоено значение "display", следовательно, будет выполнен метод display(). Для этой и всех остальных задач, которые должен выполнять ваш компонент, необходимо создать в классе контроллера одноименные методы. Наконец, метод redirect() перенаправляет пользователя к другому URL, если такой URL был задан в каком-либо методе при выполнении контроллера.
В простейшем случае класс контроллера описан в файле /components/com_<имя компонента>/controller.php, в более сложных случаях этих классов может быть несколько. Каждый из них должен быть производным от JController:
class MyComponentController extends JController { … function display() { … parent::display(); … } … }
Вы можете переопределить метод JController::display() в своем классе контроллера. Метод display() базового класса вызывает методы getView(), getModel(), а также метод display() заданного представления. getView() возвращает объект-представитель заданного представления, getModel() - заданной модели. По умолчанию используются те представление и модель, название которых совпадает с именем контроллера.
Далее нас будет интересовать работа метода display() заданного представления.
Каждый класс представления описан в файле /components/com_<имя компонента>/views/<имя представления>/view.html.phpи является производным от JView. В этом классе может быть перегружен метод display(), чтобы вызвать метод класса модели для загрузки данных:
class MyComponentViewMyView extends JView { function display($tpl=null) { $model=&$this->getModel(); $list=$model->getList(); $this->assignRef('list', $list); parent::display($tpl); } }
Каждый класс модели описан в файле /components/com_<имя компонента>/models/<имя модели>.phpи является производным от JModel. В этом классе может находиться метод для загрузки данных из базы данных или другого источника:
class ModelMyComponentMyModel extends JModel { var $_somelist = null; function getList() { if (!$this->_somelist) { $query = "SELECT * FROM #__mycomponent"; $this->_somelist = $this->_getList($query, 0, 0); } return $this->_somelist; } }
Итак, метод класса представления display() вызывает метод класса модели для загрузки данных и сохраняет результат в какой-либо переменной, которая затем с помощью метода JView::assignRef() связывается с текущим представлением. Наконец, вызывается метод базового класса JView::display(), который загружает файл заданного шаблона при помощи перехвата выходного потока.
Шаблон находится в папке /components/com_<имя компонента>/views/<имя представления>/tmpl. В его коде осуществляется вывод на экран переменных текущего представления. Например:
'.$l->data.' |
Так выглядит простейший вариант взаимодействия моделей, представлений и контроллеров.
Классы Joomla для реализации MVC
JModel