Добавить в цитаты Настройки чтения

Страница 30 из 38

Пример:

$pathway->setItemName(0,'Категория #2');

Вид навигационной цепочки после выполнения этого кода показан на рис. 7.7.

Рис. 7.7.  Измененная навигационная цепочка

Замена массива элементов навигационной цепочки

array setPathway(array $pathway)

где $pathway - новый массив объектов цепочки (т.е. для каждого элемента должны быть заданы поля name и link).

Метод возвращает предыдущее значение массива.

Например:

$item1->name = "item1"; $item1->link = "link1"; $item2->name = "item2"; $item2->link = "link2"; $item3->name = "item3"; $item3->link = ""; $items = array($item1, $item2, $item3); $pathway->setPathWay($items);

Получившаяся цепочка показана на рис. 7.8.

Рис. 7.8.  Навигационная цепочка после замены массива ее элементов

Практика

Разработка модуля

Регистрация модуля в базе данных

Модуль, как и компонент, необходимо зарегистрировать в базе данных. Для этого создадим запись в таблицах #__modules и #__extensions. Выполните следующие SQL-запросы:

INSERT INTO jos_modules (title, ordering, position, published, module, showtitle, params) VALUES ('Новые вопросы', 1, 'position-7', 1, 'mod_myquestions', 1, '{"random":"0","items":"3","maxlen": "100","author":"1","date":"1"}'); INSERT INTO jos_extensions(name,type,element,folder,client_id,manifest_cache,params,custom_data,system_data) VALUES('mod_myquestions', 'module', 'mod_myquestions', '', 0, '{"legacy":false,"name":"mod_myquestions", "type":"module","creationDate":"2012","author":"Me", "copyright":"","authorEmail":"","authorUrl":"","version":"1.6.0", "description":"My Questions module","group":""}', '{}', '', '');

Если вы обновите фронтенд после выполнения этих запросов, вы заметите, что модуль не появился, несмотря даже на то, что полю published присвоено значение 1. Дело в том, что модуль должен быть не только опубликован, но еще и назначен для каких-либо пунктов меню. Для этого в панели администрирования войдите в меню " Расширения" - " Менеджер модулей" и выберите модуль " Вопросы". В разделе " Привязка к пунктам меню" выберите в выпадающем списке значение " На всех страницах" и нажмите кнопку " Сохранить и закрыть" (рис. 7.9).

(есть увеличенное изображение)

Рис. 7.9.  Привязка модуля ко всем страницам





Создание модуля

Напишем модуль, который будет выводить ссылки на последние вопросы или на случайный вопрос. Создадим в папке /modulesпапку mod_myquestions, а в ней - файл mod_myquestions.php:

<?php defined('_JEXEC') or die ('Restricted access'); $items = $params->get('items', 1); $maxlen = $params->get('maxlen',100); $random = $params->get('random', 0); $q_author = ($params->get('author',1) == 1) ? ", name" : ""; $q_date = ($params->get('date',1) == 1) ? ", date" : ""; $db = &JFactory::getDbo(); $query = "SELECT id, question$q_author$q_date FROM #__myquestions WHERE answer <> '' AND (published = 1 OR (expiration_date <> '0000-00-00 00:00:00' AND expiration_date > NOW()))"; if ($random) { $orderby = " ORDER BY RAND()"; $items = 1; } else $orderby = " ORDER BY date DESC"; $query .= $orderby; $db->setQuery($query, 0, $items); $rows = $db->loadObjectList(); foreach($rows as $row) { echo '<a href="'.JRoute::_("index.php?option=com_myquestions&view=question&task=show& id=".$row->id).'">'.substr(strip_tags($row->question),0,$maxlen-1).'</a><br/>'; $addition = array(); if ($params->get('author',1) == 1) $addition[] = $row->name; if ($params->get('date',1) == 1) $addition[] = JHTML::_('date', $row->date, JText::_('DATE_FORMAT_LC3')); if (count($addition)) echo '<i>'.implode(' ', $addition).'</i><br/>'; } ?>

Для установки и считывания параметров может быть использован глобальный объект $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 }