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

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

Жанры

Разрботка расширений для CMS Joomla
Шрифт:

Таблица 6.1. Примеры ссылок, использующихся в MVC-версии компонента myquestions Ссылка view task id Значение /myquestions/category/show/1category show 1 Просмотр категории #1 /myquestions/question/show/1question show 1 Просмотр вопроса #1 /myquestions/category/show/allcategory show all Просмотр вопросов из всех категорий /myquestions/all/showall show - Просмотр списка всех категорий /myquestions/question/showformquestion showform - Вывод формы для написания вопроса

Изменим

функции генерации и декодирования SEF-ссылок. Откройте файл /components/com_myquestions/router.phpи измените код функции MyQuestionsBuildRoute следующим образом:

function MyQuestionsBuildRoute(&$query) { $segments = array; if (isset($query['view'])) { $segments[] = $query['view']; unset($query['view']); } if (isset($query['task'])) { $segments[] = $query['task']; unset($query['task']); } if (isset($query['id'])) { $segments[] = $query['id']; unset($query['id']); } return $segments; }

В том же файле замените функцию MyQuestionsParseRoute следующей:

function MyQuestionsParseRoute ($segments) { $vars = array; $vars['view'] = $segments[0]; if (count($segments) > 1) { $vars['task'] = $segments[1]; if (count($segments) > 2) $vars['id'] = $segments[2]; } return $vars; }

Как видите, теперь мы предполагаем, что первый элемент в массиве segments - это view, второй - task, а третий - id.

Добавление контроллера к коду бэкенда

Бэкенд не нуждается в большом контроле над форматом вывода, поэтому его можно не переводить на архитектуру MVC. Добавим только контроллер, чтобы исключить выражение switch.

Создайте файл /administrator/components/com_myquestions/controller.php. В нем мы объявим класс QuestionController. В конструкторе этого контроллера регистрируются задачи, взятые из старого кода переключателя switch из файла admin.myquestions.php.

<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.controller'); class QuestionController extends JController { function __construct($default = array) { parent::__construct($default); $this->registerTask('reply', 'replyToQuestion'); $this->registerTask('save', 'saveQuestion'); $this->registerTask('apply', 'saveQuestion'); $this->registerTask('remove', 'removeQuestions'); $this->registerTask('sendToExpert', 'send'); $this->registerTask('sendAnswer', 'send'); $this->registerTask('showCat', 'showCategories'); $this->registerTask('addCat', 'editCategory'); $this->registerTask('editCat', 'editCategory'); $this->registerTask('saveCat', 'saveCategory'); $this->registerTask('applyCat', 'saveCategory'); $this->registerTask('removeCat', 'removeCategories'); } } ?>

Все функции из файла admin.myquestions.phpперейдут в класс QuestionController в качестве методов практически без изменений, за исключением одного аспекта. Отказ от выражения switch ведет к невозможности передавать переменные непосредственно в методы класса контроллера. Поэтому необходимо либо добавлять в класс контроллера новые поля, либо получить переменные из переменных HTTP-запроса или других источников непосредственно в коде каждого метода. В нашем примере почти все методы используют значения переменных option и task. Теперь эти значения будут не передаваться как параметры, а извлекаться из HTTP-запроса

с помощью функции JRequest. Например, первые строки функции saveQuestion примут вид:

function saveQuestion { $option = JRequest::getVar('option'); $task = JRequest::getVar('task'); $row = $this->save; ... }

Итак, перенесите в класс QuestionController функции replyToQuestion, save, saveQuestion и др. Затем замените содержимое файла admin.myquestions.phpследующим кодом:

<?php defined('_JEXEC') or die('Restricted access'); require_once(JApplicationHelper::getPath('admin_html')); require_once(JPATH_COMPONENT.DS.'controller.php'); JTable::addIncludePath(JPATH_COMPONENT.DS.'tables'); $controller = new QuestionController(array('default_task' => 'showQuestions')); $controller->execute(JRequest::getVar('task')); $controller->redirect; ?>

Как вы уже заметили, конструктор нашего контроллера в бэкенде имеет параметр default. При вызове конструктора мы передаем в него массив, который хранит значение default_task, равное showQuestions. Таким путем задано название задачи, которая будет выполнена по умолчанию.

Ключевые термины

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?

Опишите схему взаимодействия модели, представления и контроллера.

Что такое регистрация задачи?

Упражнения

Адаптируйте код из раздела " Практика" для своего варианта (см. список вариантов в дополнительных материалах).

Модули. Постраничный вывод информации. Навигационная цепочка

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

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Привет из Загса. Милый, ты не потерял кольцо?

Лисавчук Елена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

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

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

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

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

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

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Оцифрованный. Том 1

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

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит