Разрботка расширений для CMS Joomla
Шрифт:
Если вы получили сообщение о том, что ваша конфигурация не может быть перезаписана, задайте те же два значения вручную. Для этого откройте файл configuration.phpв корневой папке Joomla, найдите строки:
public $sef = '0'; public $sef_rewrite = '0';
и измените оба значения на " 1" вместо "0".
Генерация SEF-ссылок
Напишем функцию для генерации SEF-ссылок. Создайте файл /components/com_myquestions/router.php:
<?php defined('_JEXEC') or die ('Restricted access'); function MyQuestionsBuildRoute(&$query) { $segments = array; if (isset($query['task'])) { $segments[] = $query['task']; unset($query['task' ]) ; } if(isset($query['id' ])) { $segments[] = $query['id']; unset($query['id']); } return $segments; } ?>
Мы
Исправим функции вывода нашего компонента так, чтобы они выводили SEF-ссылки вместо обычных. Откройте файл /components/com_myquestions/myquestions.html.phpи измените код функции showCategories класса HTML_questions следующим образом:
function showCategories($rows, $option) { ?> <a href='<?=JRoute::_('index.php?option='.$option.'&task=showlist')?>'> <?=JText::_('COM_MYQUESTIONS_ALL_QUESTIONS')?></a> <a href='<?=JRoute::_('index.php?option='.$option.'&task=showform')?>'> <?=JText::_('COM_MYQUESTIONS_ADD_QUESTION')?></a> <table> <?php foreach($rows as $row) { $link = JRoute::_('index.php?option='.$option.'&id='.$row->id.'&task=showlist'); echo '<tr><td><a href="#">'.$row->name. '</a></td><td>'.$row->desc.'</td></tr>'; } ?> </table> <?php }
Измените выделенный код в функции HTML_questions::showQuestions:
foreach($rows as $row) { $link = JRoute::_('index.php?option='.$option.'&id='.$row->id.'&task=showquestion'); $link_cat = JRoute::_('index.php?option='.$option.'&id_cat='.$row->id_cat.'&task=showlist'); ?>
Измените также выделенный код в функции HTML_questions::showQuestion:
function showQuestion($row, $option, $row_cat) { $link_cat = JRoute::_('index.php?option='.$option.'&id_cat='.$row->id_cat.'&task=showlist');
Теперь компонент будет генерировать SEF-ссылки по шаблону, установленному в функции MyQuestionsBuildRoute.
Декодирование SEF-ссылок
Если вы сейчас попытаетесь щелкнуть на одной из SEF-ссылок, то получите сообщение:
"Fatal error: Call to undefined function myquestionsParseRoute in Y:\home\localhost\www\joomla\includes\router.php on line …".
Напишем функцию для декодирования SEF-ссылок.
Откройте файл /components/com_myquestions/router.phpи добавьте следующую функцию:
function MyQuestionsParseRoute ($segments) { $vars = array; $vars['task'] = @$segments[0]; $vars['id'] = @$segments[1]; return $vars; }
Как видите, в функции MyQuestionsParseRoute
Знаки "@" при получении элементов массива $segments используются для подавления вывода сообщений об обращении к несуществующим элементам массива, т.к. не все наши SEF-ссылки будут содержать id.
Теперь щелкните по какой-либо ссылке во фронтенде и обратите внимание на строку статуса в браузере. Вы должны увидеть URL вида: ссылка: http://localhost/joomla/component/myquestions/showlistили ссылка: http://localhost/joomla/component/myquestions/showquestion/1
Ключевые термины
JDocument - класс для работы с документом. JRoute - класс для создания SEF-ссылок. JUser - класс для работы с данными о пользователе.Документ Документ - буфер, использующийся для хранения содержимого веб-страницы, которая будет показана пользователю после выполнения запроса. Функция генерации SEF-ссылок - функция, которая принимает массив элементов HTTP-запроса и возвращает массив сегментов SEF-ссылки. Функция декодирования SEF-ссылок - функция, которая из массива сегментов SEF-ссылки создает массив переменных HTTP-запроса. Шаблон SEF-ссылок - последовательность сегментов.
Краткие итоги
SEF-ссылки в Joomla создаются с помощью метода JRoute::_, который переводит внутреннюю ссылку, генерируемую Joomla, в SEF-ссылку. Чтобы компонент работал с SEF-ссылками, сгенерированными по собственному шаблону, необходимо создать в корневой папке его фронтенда файл router.php, в котором должны находиться функция для генерации SEF-ссылок и функция для их декодирования. Эти функции осуществляют взаимно обратные операции: первая из них из массива элементов HTTP-запроса создает массив сегментов SEF-ссылки, а вторая из массива сегментов SEF-ссылки создает массив переменных HTTP-запроса.
Так как SEF-ссылки не позволяют задать названия переменных запроса, то единственный способ определить, к какой переменной относится то или иное значение сегмента, - это использовать шаблон, который задает последовательность сегментов. Шаблон неявно задается в коде каждой из функций в файле router.php.
Для работы с документом и с данными пользователя в Joomla существуют соответственно классы JDocument и JUser.
Вопросы
Какой метод переводит внутреннюю ссылку, генерируемую Joomla, в SEF-ссылку?
Каким образом компоненты работают с SEF-ссылками?
Для чего служат функции генерации и декодирования SEF-ссылок?
Что такое шаблон SEF-ссылок и как он задается?
Какие классы используются для работы с документом и с данными пользователя?
Упражнения
Адаптируйте код из раздела " Практика" для своего варианта (см. список вариантов в дополнительных материалах).
Архитектура MVC в компонентах Joomla
Рассмотрены принципы реализации архитектуры MVC в компоненте и классы Joomla, использующиеся для этого.