Ключевые термины
JController - абстрактный класс для реализации контроллеров. JModel - абстрактный класс для реализации моделей. JView - абстрактный класс для реализации представлений. Регистрация задачи - сопоставление ее какому-либо методу класса, производного от JController.
Краткие итоги
Joomla поддерживает архитектуру MVC для компонентов. Модели, представления и контроллеры реализуются соответственно с помощью абстрактных классов JModel, JView и JController. В компоненте могут быть созданы классы, производные от всех или некоторых из этих классов.
Вот простейшая схема взаимодействия модели, представления и контроллера.
В файле, который находится в корневой папке компонента и называется так же, как компонент, находится код для создания контроллера и вызова его методов execute() и redirect(). Метод execute() вызывает метод контроллера, который называется так же, как и заданная задача.
Класс контроллера, производный от JController, содержит методы для каждой задачи, которую должен выполнять компонент. Метод JController::display(), который вызывается по умолчанию, вызывает методы getView(), getModel(), а также метод display() заданного представления.
В классе представления, производном от JView, может быть перегружен метод display() для вызова метода класса модели для загрузки данных и сохранения результата в какой-либо переменной. Затем с помощью метода JView::assignRef() эта переменная связывается с текущим представлением и вызывается метод базового класса JView::display(), который загружает файл заданного шаблона при помощи перехвата выходного потока.
В коде шаблона осуществляется вывод на экран переменных текущего представления.
Вопросы
Какие классы Joomla позволяют реализовать элементы архитектуры MVC?
Опишите схему взаимодействия модели, представления и контроллера.
Что такое регистрация задачи?
Упражнения
Адаптируйте код из раздела " Практика" для своего варианта (см. список вариантов в дополнительных материалах).
Модули. Постраничный вывод информации. Навигационная цепочка
Рассмотрен практический пример создания модуля. Рассмотрены классы для постраничного вывода списка элементов и для управления навигационной цепочкой.
Цель лекции:Понять принцип разработки модулей. Ознакомиться с методами классов JPagination и JPathway.
Модули
Как уже говорилось, модули в Joomla используются для отображения небольших фрагментов контента, обычно в левой или правой колонке или верхней или нижней областях страницы. Типичный модуль выводит информацию из таблицы какого-нибудь компонента, например, случайную фотографию или несколько последних статей.
По сравнению с разработкой компонента написать модуль значительно легче. Как правило, модуль не использует собственных таблиц и не обрабатывает данные, введенные пользователем. Код модуля может даже поместиться в одном-единственном файле.
Постраничный вывод информации (класс JPagination)
Joomla позволяет разбивать длинные списки на страницы, задавая длину списка по умолчанию ( "Сайт" - "Общие настройки", выпадающий список "Длина списка по умолчанию"). Для вывода списков элементов с разбивкой на страницы как в бэкенде, и так и во фронтенде используется класс JPagination. Его открытые (public) поля хранят следующую информацию:
total - общее количество записей; limitstart - порядковый номер записи, с которой нужно начать вывод; limit - количество записей на страницу; prefix - префикс переменных запроса.
Соответственно, конструктор принимает эти четыре значения в качестве параметров:
__construct(int $total, int $limitstart, int $limit, string $prefix = '')
Например:
$paginationObject = new JPagination(100, 20, 10, 'somePrefix');
Как вы, возможно, помните, второй и третий параметры метода JDatabase::setQuery() - это смещение для начала выборки и количество выбираемых строк. Они в точности соответствуют параметрам limitstart и limit. Поэтому используйте одни и те же значения для создания объекта JPagination и для задания параметров setQuery():
$db->setQuery("SELECT * FROM #__mycomponent", $limitstart, $limit); $rows = $db->loadObjectList(); jimport('joomla.html.pagination'); $paginationObject = new JPagination($total, $limitstart, $limit);
После создания объекта JPagination необходимо вызвать один из его методов для отображения счетчика страниц, ссылки на предыдущую/следующую страницу и т.д. Все эти методы не имеют параметров и возвращают HTML-код соответствующих элементов. Для наглядности посмотрите на результаты работы этих методов (таблица 7.1).
Таблица 7.1. Методы класса JPagination Метод РезультатgetPagesCounter()
![Разрботка расширений для CMS Joomla _47.jpg](https://litlife.club/books/145279/read/images/_47.jpg)
Рис. 7.1. Результат работы метода getPagesCounter() getResultsCounter()
![Разрботка расширений для CMS Joomla _48.jpg](https://litlife.club/books/145279/read/images/_48.jpg)
Рис. 7.2. Результат работы метода getResultCounter() getPagesLinks()
![Разрботка расширений для CMS Joomla _49.jpg](https://litlife.club/books/145279/read/images/_49.jpg)
Рис. 7.3. Результат работы метода getPagesLinks() getListFooter()
![Разрботка расширений для CMS Joomla _50.jpg](https://litlife.club/books/145279/read/images/_50.jpg)
Рис. 7.4. Результат работы метода getListFooter() getLimitBox()
![Разрботка расширений для CMS Joomla _51.jpg](https://litlife.club/books/145279/read/images/_51.jpg)
Рис. 7.5. Результат работы метода getLimitBox()
Например:
echo $paginationObject->getListFooter();
Также класс JPagination содержит методы orderUpIcon() и orderDownIcon() для вывода стрелок "вверх" и "вниз", использующихся для задания собственного порядка записей.
Управление навигационной цепочкой (класс JPathway)
Навигационная цепочка("хлебные крошки") - это последовательность элементов, представляющая собой путь по сайту от корня до текущей страницы. Для управления навигационной цепочкой в Joomla существует объект JPathway, доступ к которому можно получить так:
global $app; $pathway =& $app->getPathway();
Добавление элемента в навигационную цепочку
bool addItem(string $name, string $link='')
где
$name - название (текст) элемента; $link - гиперссылка.
Например:
$pathway->addItem('Категория #1','mycomponent/category/1'); $pathway->addItem('Элемент #1');
Получившаяся цепочка показана на рис. 7.6.
![Разрботка расширений для CMS Joomla _52.jpg](https://litlife.club/books/145279/read/images/_52.jpg)
Рис. 7.6. Навигационная цепочка
Обратите внимание, что для элемента, который окажется в цепочке последним, ссылка выводиться не будет, даже если она задана. Это понятно, т.к. последний элемент соответствует текущей странице, ссылка на которую и без того известна. Тем не менее, такая ссылка не теряется и сохраняется в массиве _pathway, в котором класс JPathway хранит элементы цепочки как объекты с двумя полями - name и link.
Получение массива элементов навигационной цепочки
array getPathway()
Для приведенного выше примера массив выглядит так:
Array ([0]=>stdClass Object ([name]=>Категория #1 [link]=>mycomponent/category/1) [1]=>stdClass Object ([name]=>Элемент #1 [link]=>))
Получение только названий элементов без ссылок
array getPathwayNames()
Для того же примера этот метод вернет массив
Array ([0]=>[1]=>Категория #1 [2]=>Элемент #1)
Изменение названия заданного элемента
bool setItemName(int $id, string $name)
где
$id - индекс элемента; $name - новое название.