Чтение онлайн

на главную - закладки

Жанры

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

<table width="100%"> <?php foreach($this->list as $l) echo '<tr><td>'.$l->data.'</td></tr>'; ?> </table>

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

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

JModel

Одно из полей класса JModel - объект-представитель базы данных $_db. Таким образом, для выполнения запросов к базе данных в методах производных от JModel классов нужно обращаться непосредственно к этому полю, не получая новой ссылки на глобальный объект JDatabase:

$this->_db->setQuery($query); $this->_db->query;

Получение списка каких-либо объектов и количества записей

array _getList(string $query, int $limitstart=0, int $limit=0) int _getListCount(string $query)

где

$query - запрос к базе данных; $limitstart - смещение; $limit - количество записей.

Например:

$query = "SELECT * FROM #__mycomponent"; $list = $this->_getList($query, 0, 0); $count = $this->_getListCount($query);

JView

Joomla поддерживает возможность добавления нескольких моделей к одному представлению. В таком случае ссылки на объекты-представители моделей будут храниться в поле _models объекта JView. Для добавления модели используется метод

JModel setModel(object &$model, bool $default = false)

где

$model - имя модели (т.е. имя соответствующего класса); $default - назначить ли ее моделью по умолчанию.

Метод возвращает добавленную модель.

Поделиться:
Популярные книги

Шериф

Астахов Евгений Евгеньевич
2. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.25
рейтинг книги
Шериф

Меч Предназначения

Сапковский Анджей
2. Ведьмак
Фантастика:
фэнтези
9.35
рейтинг книги
Меч Предназначения

Конь Рыжий

Москвитина Полина Дмитриевна
2. Сказания о людях тайги
Проза:
историческая проза
8.75
рейтинг книги
Конь Рыжий

Отверженный VIII: Шапка Мономаха

Опсокополос Алексис
8. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VIII: Шапка Мономаха

Имя нам Легион. Том 1

Дорничев Дмитрий
1. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 1

Хозяйка старой пасеки

Шнейдер Наталья
Фантастика:
попаданцы
фэнтези
7.50
рейтинг книги
Хозяйка старой пасеки

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Сын Тишайшего 3

Яманов Александр
3. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Сын Тишайшего 3

Потомок бога 3

Решетов Евгений Валерьевич
3. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Потомок бога 3

Сумеречный стрелок

Карелин Сергей Витальевич
1. Сумеречный стрелок
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок

Отверженный. Дилогия

Опсокополос Алексис
Отверженный
Фантастика:
фэнтези
7.51
рейтинг книги
Отверженный. Дилогия

Плохой парень, Купидон и я

Уильямс Хасти
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Плохой парень, Купидон и я

Архил...? Книга 2

Кожевников Павел
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...? Книга 2