Разрботка расширений для CMS Joomla
Разрботка расширений для CMS Joomla читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
COM_MYQUESTIONS_ERROR404="Вопрос не найден"
Проверьте, что при обращении к вопросу, который не должен отображаться, выводится сообщение (рис. 4.11).
(есть увеличенное изображение)
Рис. 4.11. Ошибка 404 "Вопрос не найден"
Теперь создадим функцию в классе вывода. Добавьте функцию showQuestion() в класс HTML_questions в файле myquestions.html.php:
function showQuestion($row, $option, $row_cat) { $link_cat = 'index.php?option='.$option.'&id_cat='.$row->id_cat.'&task=showlist'; ?>
<a href='index.php?option=<?=$option?>&task=showlist'><?=JText::_ ('COM_MYQUESTIONS_ALL_QUESTIONS')?></a>
<table width="100%"> <tr> <td><i><?=$row->name?></i></td> <td><i><u><?=$row->email?></u></i></td> <td><i><?=JHTML::_('date', $row->date,JText::_ ('DATE_FORMAT_LC3'))?></i></td> <td><i><?=$row->city?></i></td> </tr> <tr> <td colspan="4"><a href="<?= $link_cat?>"><?=$row_cat->name?></a></td> </tr> <tr> <td colspan="4"><b><?=$row->question?></b></td> </tr> <tr> <td colspan="4"><?=$row->answer?></td> </tr> </table> <? }Данная функция аналогична функции showQuestions() за исключением того, что выводит не массив вопросов, а один вопрос.
Теперь в списке вопросов стрелка под каждым из них ("--->") ведет на страницу с выводом этого вопроса (рис. 4.12).
(есть увеличенное изображение)
Рис. 4.12. Просмотр вопроса
Ключевые термины
JDate - класс для работы с датами. JEditor - класс для работы с WYSIWYG-редактором. JError - класс для работы с ошибками. JMail - класс для создания и отправки электронных писем. JMailHelper - класс для очистки данных перед добавлением к электронному письму и проверки, является ли заданная строка корректным адресом электронной почты. JURI - класс для работы с URI. Иерархия пунктов меню - дерево, состоящее из пунктов меню и организованное с помощью вложенных множеств.
Краткие итоги
Для хранения иерархии пунктов меню в Joomla используются вложенные множества. Для каждого пункта в базе данных хранится id родителя, уровень и левый и правый ключи.
Создавать и отправлять электронные письма удобнее с помощью методов класса JMail.
Для работы с WYSIWYG-редактором используется класс JEditor.
Класс JURI позволяет работать с URI текущей или любой другой страницы.
Для работы с ошибками и предупреждениями может быть использован класс JError.
Для работы с датами в Joomla существует класс JDate.
Вопросы
Каким образом в базе данных Joomla хранится иерархия пунктов меню?
Какой класс позволяет создавать и отправлять электронные письма?
Каким образом можно отобразить код выбранного администратором сайта WYSIWYG-редактора?
Какой класс существует для работы с URI?
Для чего может быть использован класс JError?
Каким образом можно работать с датами в Joomla?
Упражнения
Адаптируйте код из раздела " Практика" для своего варианта (см. список вариантов в дополнительных материалах).
SEF-ссылки. Классы ядра JDocument, JUser
Рассмотрен процесс генерации и декодирования SEF-ссылок для какого-либо компонента. Рассмотрены классы для работы с документом и с данными текущего или любого другого пользователя.
Цель лекции:Изучить принципы работы с SEF-ссылками, сгенерированными в компоненте по собственному шаблону. Ознакомиться с некоторыми методами классов JDocument и JUser.
Генерация SEF-ссылок (класс JRoute)
В Joomla существует возможность создавать SEF-ссылки (Search-Engine Friendly) вида www.mysite.ru/one/two/three, удобные и для посетителей, и для поисковых систем. Для этого используется единственный метод класса JRoute, переводящий внутреннюю ссылку, генерируемую Joomla, в SEF-ссылку:
string _(string $url, bool $xhtml=true, int $ssl=null)
где
$url - абсолютный или относительный URI; $xhtml - заменять ли амперсанды на "&"; $ssl - при $ssl=1 полученный URI будет начинаться с протокола https://, в противном случае - http://.
Данный метод разбирает $url на пары "ключ-значение" и сохраняет результаты разбора в массиве. Из этого массива удаляется элемент option. Его значение добавляется к новому URL в качестве первого сегмента. Затем производится поиск файла /components/com_<option>/router.php. В этом файле должны находиться две функции: функция для генерации SEF-ссылок(<имя компонента>BuildRoute()) и функция для декодирования элементов SEF-ссылок(<имя компонента>ParseRoute()). Метод JRoute::_() вызовет функцию <имя компонента>BuildRoute() и передаст ей массив, полученный при разборе $url. Функция вернет массив $segments. Метод JRoute::_() добавит к новому URL все элементы этого массива, разделив их слэшами. Если в запросе останутся какие-либо необработанные переменные, они будут добавлены в конец URL.
Допустим, метод JRoute::_() получит на вход ссылку вида
index.php?option=com_mycomponent&var1=value1&var2=value2&…&varN=valueN
Тогда он передаст в функцию <имя компонента>BuildRoute() ассоциативный массив
Array([option]=>com_mycomponent [var1]=>value1 [var2]=>value2... [varN]=>valueN)
причем пары "ключ-значение" будут расположены в том порядке, в котором они были в исходной ссылке. Задача функции <имя компонента>BuildRoute() - выбрать необходимые пары и сохранить в результирующем массиве только значения, но так, чтобы впоследствии можно было восстановить соответствующие им ключи. Это достигается использованием какого-либо фиксированного порядка. Функция вернет массив вида
Array([0]=>value1 [1]=>value2 … [N-1]=>valueN)
из которого затем будет создана SEF-ссылка
component/mycomponent/value1/value2/…/valueN
Впоследствии при щелчке на какой-либо SEF-ссылке произойдет обратный процесс. Будет вызван метод <имя компонента>ParseRoute(), который получит на вход массив
Array([0]=>value1 [1]=>value2 ... [N-1]=>valueN)
и вернет ассоциативный массив:
Array([var1]=>value1 [var2]=>value2 … [varN]=>valueN)
который Joomla установит в качестве переменных HTTP-запроса. Таким образом, посетители сайта и поисковые системы увидят SEF-ссылки, а компонент будет работать с обычным набором пар "ключ-значение".
Обратите внимание, что SEF-ссылка не содержит никакой информации о том, как называются ключи массива. Чтобы их можно было восстановить, функция генерации ссылок и функция их декодирования должны неявно задавать шаблон SEF-ссылокдля конкретного компонента. В данном примере подразумевается шаблон, который можно сформулировать вербально так: "переменные записываются в следующем порядке: var1, var2, … varN".
Шаблон может быть более сложным. Например, его структура может меняться в зависимости от задачи, т.е. от значения входящей в него переменной task.
В простейшем случае содержимое файла router.phpвыглядит так:
<?php defined('_JEXEC') or die ('Restricted access'); function <имя компонента>BuildRoute(&$query) { $segments = array(); if (isset($query['var1'])) { $segments[] = $query['var1']; unset($query['var1' ]) ; } ... if(isset($query['varN' ])) { $segments[] = $query['varN']; unset($query['varN']); } return $segments; } function <имя компонента>ParseRoute($segments) { $vars = array(); $vars['var1'] = @$segments[0]; ... $vars['varN'] = @$segments[1]; return $vars; } ?>