Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samouchitel_po_razrabotke_rasshireny_dlya_Jooml....docx
Скачиваний:
3
Добавлен:
10.11.2018
Размер:
2.53 Mб
Скачать

Переключения посредством Контроллеров (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, второй - имя вызываемо функции. Это особенно полезно, когда вы хотите иметь несколько задач вызовающих одну функцию

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]