Шрифт:
В данном классе хранятся список вопросов _questions, id категории _id и название категории _name.
Конструктор класса вызывает конструктор родительского класса, затем получает из HTTP-запроса id категории и сохраняет его в поле _id. Если id категории не задан, то вместо него сохраняется значение all, т.к. в таком случае будут выводиться вопросы сразу из всех категорий.
Метод getCatName возвращает либо название текущей категории, либо строку "Все вопросы", если категория не задана.
Метод isAllCat возвращает true, если категория не задана, и false в противном случае.
Модель для одного вопроса
Создайте файл /components/com_myquestions/models/question.php:
<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.model'); class ModelMyQuestionsQuestion extends JModel { var $_question = null; var $_id = null; function __construct { parent::__construct; $id = JRequest::getVar('id',0); $this->_id = $id; } function getQuestion { if (!$this->_question) { $query = "SELECT q.id, q.question, q.name, q.date, q.email, q.city, q.answer, q.published, q.expiration_date, c.id AS id_cat, c.name AS name_cat FROM #__myquestions q, #__myquestions_categories c WHERE q.id_cat=c.id AND q.id = {$this->_id}"; $this->_db->setQuery($query); $this->_question = $this->_db->loadObject; if ($this->_question->answer == '' || ($this->_question->published == 0 && ($this-> _question->expiration_date == '0000-00-00 00:00:00' || strtotime($this->_question->expiration_date) <= time))) { JError::raiseError(404, JText::_(' COM_MYQUESTIONS_ERROR404')); } } return $this->_question; } } ?>
Функция getQuestion загружает одну запись с заданным id. Если после загрузки вопроса оказывается, что он является неопубликованным, то генерируется сообщение об ошибке 404.
Представления
Создайте в папке /components/com_myquestionsподпапку views, а в ней - папки all, categoryи question. В каждой из них создайте по папке для шаблонов под названием tmpl.
Получившееся дерево папок показано на рис. 6.2.
Рис. 6.2. Дерево папок MVC-компонента
Просмотр списка всех категорий
Создайте файл /components/com_myquestions/views/all/view.html.php:
<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.view'); class QuestionViewAll extends JView { function display($tpl=null) { global $option; $model=&$this->getModel; $list=$model->getList; for ($i=0; $i<count($list); $i++) { $row=&$list[$i]; $row->link=JRoute::_('index.php?option='.$option.'&id='.$row->id.'&view=category&task=show'); } $this->assignRef('list', $list); parent::display($tpl); } } ?>
Класс QuestionViewAll объявляется как производный от класса JView.
В методе display мы получаем ссылку на ассоциированную с данным представлением модель и используем ее метод getList, чтобы получить список категорий. К каждому элементу этого списка добавляем ссылку для просмотра данной категории. Связываем этот список с переменной list шаблона и вызываем метод JView::display для отображения шаблона.
По умолчанию будет отображен шаблон default. Напишем его. Создайте файл /components/com_myquestions/views/all/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>"; ?> <br/> <table width="100%"> <?php foreach($this->list as $l) echo '<tr><td><a href="#">'.$l->name.'</a></td><td>'.$l->desc.'</td></tr>'; ?> </table> <br/>
Доступ к переменной 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: