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

на главную

Жанры

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

Доступ к переменной list осуществляется через $this, т.к. это поле текущего класса QuestionViewAll.

Просмотр списка вопросов из какой-либо категории или из всех категорий

Создайте файл /com_myquestions/views/category/view.html.php:

<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.view'); class QuestionViewCategory extends JView { function display($tpl=null) { global $option; $model=&$this->getModel; $list=$model->getList; $name_cat=$model->getCatName; $is_all_cat=$model->isAllCat; for ($i=0; $i<count($list); $i++) { $row=&$list[$i]; $row->link=JRoute::_('index.php?option='.$option.'&id='.$row->id.'&view=question&task=show'); if ($is_all_cat) $row->link_cat=JRoute::_('index.php?option='.$option.'&id='.$row->id_cat.'&view=category&task=show'); } $this->assignRef('list', $list); $this->assignRef('name_cat', $name_cat); $this->assignRef('is_all_cat', $is_all_cat); parent::display($tpl); } } ?>

Данный

код в целом аналогичен коду метода QuestionViewAll::display. Если выводится список вопросов сразу из всех категорий, то в name_cat будет храниться текст "Все вопросы", а к объекту-представителю каждого вопроса добавится ссылка на его категорию. Если же выводится содержимое одной категории, то в name_cat будет храниться ее название, а ссылок на категорию каждого вопроса выводиться не будет, т.к. все эти ссылки будут одинаковы и вести на страницу с текущим же списком.

Для создания шаблона по умолчанию создайте файл /components/com_myquestions/views/category/tmpl/default.php:

<?php defined('_JEXEC') or die('Restricted access'); global $option; echo "<a href=\"".JRoute::_('index.php?option='.$option.'&view=question&task=showform')."\">".JText::_('COM_MYQUESTIONS_ADD_QUESTION')."</a>"; ?> <H1><?=$this->name_cat?></H1> <?php foreach($this->list as $l): ?> <table width="100%"> <tr> <td width="25%"><i><?=$l->name?></i></td> <td width="25%"><i><u><?=$l->email?></u></i></td> <td width="25%"><i><?=JHTML::_('date', $l->date, JText::_('DATE_FORMAT_LC3'))?></i></td> <td width="25%"><i><?=$l->city?></i></td> </tr> <?php if ($this->is_all_cat == true) { ?> <tr> <td colspan="4"><a href="#"><?=$l->name_cat?></a></td> </tr> <?php } ?> <tr> <td colspan="4"><b><?=$l->question?></b></td> </tr> <tr> <td colspan="4"><?=$l->answer?></td> </tr> <tr> <td colspan="4"><a style="text-decoration: none;" title="<?=JText::_('COM_MYQUESTIONS_READMORE')?>" alt="<?=JText::_('COM_MYQUESTIONS_READMORE')?>" href="#">---></a></td> </tr> </table> <br/> <?php endforeach;?>

Данный шаблон аналогичен шаблону по умолчанию для представления all.

Просмотр одного вопроса

Код для отображения одного вопроса аналогичен коду для отображения списка вопросов. Создайте файл /components/com_myquestions/views/question/view.html.php:

<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.view'); class QuestionViewQuestion extends JView { function display($tpl=null) { if ($tpl !== 'form') { global $option; $model=&$this->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:

<?php defined('_JEXEC') or die('Restricted access'); global $option; echo "<a href=\"".JRoute::_('index.php?option='.$option.'&view=question&task=showform')."\">" .JText::_('COM_MYQUESTIONS_ADD_QUESTION')."</a>"; ?> <table width="100%"> <tr> <td><i><?=$this->question->name?></i></td> <td><i><u><?=$this->question->email?></u></i></td> <td><i><?=JHTML::_('date', $this->question->date, JText::_('DATE_FORMAT_LC3'))?></i></td> <td><i><?=$this->question->city?></i></td> </tr> <tr> <td colspan="4"><a href="#"><?=$this->question->name_cat?></a></td> </tr> <tr> <td colspan="4"><b><?=$this- >question->question?></b></td> </tr> <tr> <td colspan="4"><?=$this->question->answer?></td> </tr> </table>

Добавим другой шаблон, отображающий форму для написания вопроса. Создайте файл /components/com_myquestions/views/question/tmpl/default_form.php:

<?php defined('_JEXEC') or die('Restricted access'); ?> <form action="<?=JRoute::_('index.php')?>" method="post"> <table> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_AUTHOR');?>: </td> <td> <input class="text_area" type="text" name="name" id="name" size="50" maxlength="255" value="<?php echo $this->user_name;?>"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_CITY');?>: </td> <td> <input class="text_area" type="text" name="city" id="city" size="50" maxlength="50"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_EMAIL');?>: </td> <td> <input class="text_area" type="text" name="email" id="email" size="50" maxlength="50"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_QUESTION');?>: </td> <td> <textarea name='question' id='question' class='inputbox' rows='15' cols='38'></textarea> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_PUBLISHED');?>: </td> <td> <input type="hidden" name="published" value="0"/> <input type="checkbox" name="published" id="published" value="1"/> </td> </tr> </table> <input type="hidden" name="task" value="addquestion"/> <input type="hidden" name="option" value="<?=JRequest::getVar("option","")?>"/> <input type="submit" class="button" id="button" value="<?php echo JText::_('COM_MYQUESTIONS_SENDBUTTON');?>"/> </form>

Листинг .

Создание контроллера

Создайте файл /components/com_myquestions/controller.php(метод addQuestion скопируйте из файла /components/com_myquestions/myquestions.php, убрав параметр $option):

<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.controller'); class QuestionController extends JController { function display { $document =& JFactory::getDocument; $viewName = JRequest::getVar('view', 'all'); $viewType = $document->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 формы для добавления вопроса:

<input type="hidden" name="task" value="addquestion"/>

Напишем код для создания объекта контроллера. Откройте файл /components/com_myquestions/myquestions.phpи замените существующий код следующим:

<?php defined('_JEXEC') or die('Restricted access'); require_once(JPATH_COMPONENT.DS.'controller.php'); JTable::addIncludePath(JPATH_ADMINISTRATOR. DS.'components'.DS.'com_myquestions'.DS.'tables'); $controller = new QuestionController; $controller->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).

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

Тринадцатый IV

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Тринадцатый IV

Огненный князь 6

Машуков Тимур
6. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 6

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

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

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

Смерть может танцевать 2

Вальтер Макс
2. Безликий
Фантастика:
героическая фантастика
альтернативная история
6.14
рейтинг книги
Смерть может танцевать 2

Гром над Академией Часть 3

Машуков Тимур
4. Гром над миром
Фантастика:
фэнтези
5.25
рейтинг книги
Гром над Академией Часть 3

Провалившийся в прошлое

Абердин Александр М.
1. Прогрессор каменного века
Приключения:
исторические приключения
7.42
рейтинг книги
Провалившийся в прошлое

Последняя жертва

Мид Райчел
6. Академия вампиров
Фантастика:
ужасы и мистика
9.51
рейтинг книги
Последняя жертва

Возвышение Меркурия. Книга 8

Кронос Александр
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 8

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода

Книга 5. Империя на марше

Тамбовский Сергей
5. Империя у края
Фантастика:
альтернативная история
5.00
рейтинг книги
Книга 5. Империя на марше

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

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