getModel(); $question=$model->getQuestion(); $question->date=JHTML::Date($question->date); $this->assignRef('question', $question); $this->assignRef('option', $option); $this->assignRef('link_cat',JRoute::_('index.php?option='.$option.'& id='.$question->id_cat.'&view=category&task=show')); } parent::display($tpl); } } ?>
Представление question будет соответствовать двум шаблонам - один для отображения вопроса, второй для вывода формы для отправки вопроса. Для первого шаблона необходимы данные о вопросе, которые мы получаем из модели. Для второго шаблона не требуется никаких данных кроме имени пользователя, которое мы определим в контроллере.
Напишем шаблон для отображения одного вопроса. Создайте файл /components/com_myquestions/views/question/tmpl/default.php:
" .JText::_('COM_MYQUESTIONS_ADD_QUESTION').""; ?>
=$this->question->name?> | =$this->question->email?> | =JHTML::_('date', $this->question->date, JText::_('DATE_FORMAT_LC3'))?> | =$this->question->city?> |
=$this->question->name_cat?> | |||
=$this- >question->question?> | |||
=$this->question->answer?> |
Добавим другой шаблон, отображающий форму для написания вопроса. Создайте файл /components/com_myquestions/views/question/tmpl/default_form.php:
Листинг .
Создание контроллера
Создайте файл /components/com_myquestions/controller.php(метод addQuestion() скопируйте из файла /components/com_myquestions/myquestions.php, убрав параметр $option):
getType(); $view = &$this->getView($viewName, $viewType); $model =& $this->getModel($viewName, 'ModelMyQuestions'); if (!JError::isError($model)) { $view->setModel($model, true); } $view->setLayout('default'); $view->display(); } function showForm() { $document =& JFactory::getDocument(); $viewName = JRequest::getVar('view', 'question'); $viewType = $document->getType(); $view = &$this->getView($viewName, $viewType); $user =&JFactory::getUser(); if($user->name) $view->user_name = $user->name; else $view->user_name = ''; $view->display('form'); } function addQuestion() { … } } ?>
В методе display() мы получаем название запрашиваемого представления и тип текущего документа, который одновременно является и типом представления. Затем получаем ссылку на соответствующее представление и ссылку на одноименную модель. Добавляем модель к представлению, назначив ее по умолчанию. Задаем имя макета - default и вызываем метод JView::display(), который выполнит скрипт /components/com_myquestions/views/all/tmpl/default.php.
В методе showForm() мы также получаем объект-представитель текущего пользователя JFactory::getUser(), чтобы подставить его имя в форму для написания вопроса. Выражение $view->display('form') отображает шаблон из файла default_form.php(т.е. имя файла в данном случае строится по схеме "default"+"_"+tpl, где tpl - параметр функции display()).
Метод addQuestion() добавляет новый вопрос в базу данных точно так же, как это делалось ранее. Обратите внимание на то, что название этого метода совпадает со значением, которое хранилось в скрытом элементе task формы для добавления вопроса:
Напишем код для создания объекта контроллера. Откройте файл /components/com_myquestions/myquestions.phpи замените существующий код следующим:
execute(JRequest::getVar('task')); $controller->redirect(); ?>
С помощью строки require_once(JPATH_COMPONENT.DS.'controller.php') подключается содержимое файла, содержащего код класса контроллера.
Изменение шаблона SEF-ссылок
Шаблон SEF-ссылок, использовавшийся нами до сих пор, не годится для применения в компоненте MVC, т.к. включает только переменные task и id. Для компонента MVC в URL должно быть задано еще по меньшей мере значение view.
Возможно, вы заметили, что в коде фронтенда, переделанном с учетом модели MVC, мы строили URL по шаблону option/view/task/idпри включенных SEF и option=com_myquestions&view=value1&task=value2&id=value3 в противном случае. Для наглядности ниже приведено несколько примеров таких ссылок (таблица 6.1).
Таблица 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 - Вывод формы для написания вопроса