- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Переключения посредством Контроллеров (Controllers)
В предыдущих главах мы использовали проверку переменной через переключатель [switch(). прим.переводчика] с последующим вызовом соответствующей функции. Если необходимо добавить еще несколько функций, код станет настолько громоздким, что в нем будет трудно ориентироваться. Прежде чем это станет проблемой, мы создадим Контроллер для обработки логики Компонента.
Создайте файл controller.php в /components/com_reviews с таким кодом:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.controller' );
class ReviewController extends JController
{
function display()
{
$document =& JFactory::getDocument();
$viewName = JRequest::getVar('view', 'all');
$viewType = $document->getType();
$view = &$this->getView($viewName, $viewType);
$model =& $this->getModel( $viewName, 'ModelReviews' );
if (!JError::isError( $model )) {
$view->setModel( $model, true );
}
$view->setLayout('default');
$view->display();
}
function comment()
{
global $option;
$row =& JTable::getInstance('comment', 'Table');
if (!$row->bind(JRequest::get('post'))) {
echo "<script> alert('".$row->getError()."');
window.history.go(-1); </script>\n";
exit();
}
$row->comment_date = date( 'Y-m-d H:i:s' );
$user =& JFactory::getUser();
if($user->_table->id)
{
$row->user_id = $user->_table->id;
}
if (!$row->store()) {
echo "<script> alert('".$row->getError()."');
window.history.go(-1); </script>\n";
exit();
}
$this->setRedirect('index.php?option=' . $option .
'&id=' . $row->review_id . '&view=review',
'Comment Added.');
}
}
?>
При выполнении Контроллера вызывается функция по умолчанию display(). Здесь, мы получаем имя запрашиваемого Вида (по умолчанию all). Мы также получаем текущий объект документа с помощью JFactory::getDocument(), а из него - текущий тип документа с помощью функции getType(). Joomla! поддерживает определение нескольких типов документов, что позволяет нам создавать совершенно разные версии. Например, вы можете иметь один тип документа для RSS, а другой для просмотра обычной страницы HTML. По умолчанию, getType() вернет HTML.
Далее, мы получаем объект Вид, передав имя представления и типа в функцию getView() Контроллера. Мы также выбираем Модель по нашему мнению, убеждаемся, что она существует, и затем присваиваем ее Виду. Наконец, мы назначаем желаемый стиль, используя функцию Вида setLayout().
Функция comment() является по существу такой же, как и оригинальная saveComment() из reviews.php, только мы использовали функцию setRedirect() для установки URL возврата после окончания обработки.
Наконец, мы сделали все необходимые Модели, Виды и Контроллер для запуска Компонента в соответствие с архитектурой MVC. Все, что осталось сделать - это код для запуска Контроллера. Так как Joomla! при запуске Компонента сначала выполняет reviews.php, мы должны изменить код для использования Контроллера вместо старой системы коммутации. Откройте /components/com_reviews/reviews.php и замените существующий код на следующий:
<?php
defined('_JEXEC') or die('Restricted access');
require_once( JPATH_COMPONENT.DS.'controller.php' );
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.
'com_reviews'.DS.'tables');
echo '<div class="componentheading">Restaurant Reviews</div>';
$controller = new ReviewController();
$controller->execute( JRequest::getVar( 'task' ) );
$controller->redirect();
?>
Так как сейчас, используется Контроллер для организации логики, мы подключаем его файл с помощью require_once( JPATH_COMPONENT.DS.'controller.php' );. Константа JPATH_COMPONENT устанавливает абсолютный путь к папке нашего Компонента в ИП. В дополнение к Контроллеру, мы подключаем класс таблицы БД, как мы делали в ИА. Заметим, что хотя мы создаем Компонент в ИП, таблицу классов получаем из ИА.
После создания нового объекта класса ReviewController, мы вызываем функцию execute() и переходим в задачу, запрошенную пользователем. Если ни одна из задач не определена, вызывается функция display(). В противном случае, имя задачи будет сопоставлено с функцией членом Компонента. Таким образом, вы можете добавлять задачи к Контроллеру без обязательного добавления их вызова в длинные switch()
Что делать, если я не хочу, чтобы 'task' совпадала с названием функции?
Если вам понадобится изменить данное поведение, вы можете вызвать функцию registerTask () перед вызовом execute() чтобы добавить определенные задачи для определенных функций. Функция registerTask() принимает два параметра: первый - значение task, второй - имя вызываемо функции. Это особенно полезно, когда вы хотите иметь несколько задач вызовающих одну функцию