Читаем Разрботка расширений для CMS Joomla полностью

Архитектура 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. В его коде осуществляется вывод на экран переменных текущего представления. Например:

list as $l) echo ''; ?>
'.$l->data.'

Так выглядит простейший вариант взаимодействия моделей, представлений и контроллеров.

Классы Joomla для реализации MVC

JModel

Перейти на страницу:

Похожие книги

Разработка ядра Linux
Разработка ядра Linux

В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.

Роберт Лав

Программирование, программы, базы данных / Программирование / Книги по IT