Шрифт:
Цель лекции:Ознакомиться с основами применения архитектуры 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. В его коде осуществляется вывод на экран переменных текущего представления. Например:
<table width="100%"> <?php foreach($this->list as $l) echo '<tr><td>'.$l->data.'</td></tr>'; ?> </table>
Так выглядит простейший вариант взаимодействия моделей, представлений и контроллеров.
Классы Joomla для реализации MVC
JModel
Одно из полей класса JModel - объект-представитель базы данных $_db. Таким образом, для выполнения запросов к базе данных в методах производных от JModel классов нужно обращаться непосредственно к этому полю, не получая новой ссылки на глобальный объект JDatabase: