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

на главную - закладки

Жанры

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

где

$url - URL для перенаправления; $msg - сообщение для пользователя; $type - тип сообщения. По умолчанию - "message".

Например, в коде контроллера можно написать:

$this->setRedirect('index.php?option=com_mycomponent', 'Текст сообщения', 'notice');

Перенаправление браузера

bool redirect

Метод возвращает false, если URL для перенаправления не был задан заранее.

Практика

Модели

Модель для списка всех категорий

В папке /components/com_myquestionsсоздайте

папку models, а в ней - файл all.php:

<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.model'); class ModelMyQuestionsAll extends JModel { var $_categories = null; function getList { if (!$this->_categories) { $query = "SELECT id, name, `desc` FROM #__myquestions_categories"; $this->_categories = $this->_getList($query, 0, 0); } return $this->_categories; } } ?>

Мы подключаем библиотеку моделей Joomla и объявляем класс ModelMyQuestionsAll как производный от класса JModel. В классе хранится список категорий _categories. Метод getList проверяет, загружен ли список категорий. Если нет, то мы создаем запрос, чтобы выбрать из базы данных все категории вопросов, и получаем их с помощью метода _getList класса JModel.

Модель для списка вопросов из какой-либо категории или из всех категорий

Создайте файл /components/com_myquestions/models/category.php:

<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.model'); class ModelMyQuestionsCategory extends JModel { var $_questions = null; var $_id = null; var $_name = null; function __construct { parent::__construct; $id = JRequest::getVar('id','all'); $this->_id = $id; } function getList { if (!$this->_questions) { if ($this->isAllCat) $id_text = ""; else $id_text = " id_cat={$this->_id} AND "; $query = "SELECT q.id, q.question, q.name, q.date, q.email, q.city, q.answer, c.id AS id_cat, c.name AS name_cat FROM #__myquestions q, #__myquestions_categories c WHERE $id_text answer <> '' AND (published = 1 OR (expiration_date <> '0000-00-00 00:00:00' AND expiration_date > NOW)) AND q.id_cat=c.id"; $this->_questions = $this->_getList($query, 0, 0); } return $this->_questions; } function getCatName { if (!$this->_name) { if (!$this->isAllCat) { $query = "SELECT name FROM #__myquestions_categories WHERE id = '" . $this->_id . "'"; $this->_db->setQuery($query); $this->_name = $this->_db->loadResult; } } if (!$this->isAllCat) return $this->_name; else return JText::_('COM_MYQUESTIONS_ALL_QUESTIONS'); } Function isAllCat { if ($this->_id=='all') return true; return false; } } ?> Листинг .

В данном классе хранятся список вопросов _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/>

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

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Привет из Загса. Милый, ты не потерял кольцо?

Лисавчук Елена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

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

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

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

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

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

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит