Шрифт:
Для установки и считывания параметров может быть использован глобальный объект $params. Когда мы добавили запись в таблицу #__modules, поле params содержало пять значений: random, равное 0, items, равное 3, maxlen, равное 100, author, равное 1, date, равное 1. Их значения мы получаем с помощью метода get, второй параметр которого - это значение по умолчанию.
Далее задается SQL-запрос для получения из таблицы #__myquestions вопросов, подлежащих публикации. Значения id и question мы получаем в любом случае, а name и date - если в настройках модуля задано, что нужно выводить эти значения. Если нужно выводить один случайный вопрос, то к запросу добавляется "ORDER BY RAND" и количество записей, которое мы хотим получить, вне зависимости от значения items, заданного в настройках, задается равным 1. В противном случае нужно выводить несколько самых новых вопросов, поэтому к запросу добавляется "ORDER BY date DESC" для сортировки по дате вопроса.
Второй и третий параметры функции setQuery используются для задания оператора LIMIT, который автоматически добавится к запросу. Таким путем мы получаем из базы данных только первые items записей.
Для каждой полученной записи выводится ссылка на ее просмотр с помощью JRoute::_ и первые maxlen символов, а также, если это разрешено в настройках, имя автора и дата.
Теперь во фронтенде появится модуль, показанный на рис. 7.10. Если модуль не отображается, попробуйте изменить позицию с position-7 на какую-либо другую.
Рис. 7.10. Модуль, отображающий три самых новых вопроса
С помощью phpMyAdmin измените значение random в настройках модуля mod_myquestions (поле params таблицы #__modules) на "1":
{"random":"1","items":"3","maxlen":"100","author":"1","date":"1"}
Теперь модуль выводит один случайный вопрос (рис. 7.11).
Рис. 7.11. Модуль, отображающий один случайный вопрос
Постраничный вывод информации
Добавим к менеджеру вопросов постраничный вывод списка. Откройте файл /administrator/components/com_myquestions/controller.phpи сделайте изменения в коде функции showQuestions в соответствии с выделенным кодом:
Значения limit и limitstart мы получаем из HTTP-запроса. Их задает один из методов класса JPagination, который мы вызовем далее. По умолчанию limit берется из настроек Joomla, а limitstart принимается равным 0. Значение total мы получаем из базы данных.
Когда все данные получены, создается объект JPagination, который передается в метод HTML_questions::showQuestions.
Откройте файл admin.myquestions.html.phpи измените метод showQuestions следующим образом:
function showQuestions($option, &$rows, &$pageNav) { $maxlen = 100; ?> <form action="index.php" method="post" name="adminForm"> <table class="adminlist"> ... <?php jimport('joomla.filter.output'); $k = 0; for ($i = 0, $n = count($rows); $i < $n; $i ++) { ... } ?> <tfoot> <td colspan="10"> <?php echo $pageNav->getListFooter;?> </td> </tfoot> </table> ... </form> <?php }
Код, полученный с помощью getListFooter, выведет выпадающий список для выбора количества элементов на странице и ссылки на другие страницы. Название элемента <select> - limit, таким образом, выбранное в выпадающем списке значение попадет в HTTP-запрос как значение переменной limit. Также getListFooter добавит к форме скрытое поле limitstart, значение которого будет изменяться в зависимости от limit и от нажатой пользователем ссылки на страницу: 0 для первой страницы, limit для второй, 2*limit для третьей и т.д. Таким образом переменная limitstart также будет включена в HTTP-запрос. Из него при переходе на другую страницу эти значения получит функция showQuestions и использует их при задании нового запроса к базе данных.
Для проверки задайте в настройках сайта длину списка по умолчанию, равную 5, и добавьте вопросы так, чтобы их количество стало больше, чем 5. Примерный вид, который теперь примет список вопросов в бэкенде, показан на рис. 7.12.
(есть увеличенное изображение)
Рис. 7.12. Список вопросов с разбиением на страницы
Нацигационная цепочка
Рассмотрим, какие элементы можно отобразить в навигационной цепочке для каждого из представлений нашего компонента:
all - название компонента; category - название компонента, название категории; question шаблон default - название компонента, название категории, текст вопроса; шаблон default_form - название компонента, текст "Задать вопрос".
Как видите, название компонента нужно выводить для всех представлений, поэтому его лучше вывести уже в методе контроллера. В методах представлений будем выводить только те элементы, которые требуют какой-либо информации из модели.
В файле /components/com_myquestions/controller.phpизмените код методов класса QuestionController так: