$k = 0; for ($i = 0, $n = count($rows); $i < $n; $i ++) { $row = &$rows[$i]; ?>
Пример результата приведен на рис. 3.3.
(есть увеличенное изображение)
Рис. 3.3. Чекбокс и пиктограмма "опубликовано/не опубликовано"
Обратите внимание, что методы класса JHTMLGrid лишь отображают какой-либо элемент, но не добавляют код для его обработки. В приведенном выше примере кнопки "опубликовано"/"не опубликовано"отображаются, но не работают. Чтобы это исправить, необходимо зарегистрировать задачи publish и unpublish (если вы не изменили их названия, задав какой-либо префикс) и написать функцию для их обработки, которая будет вызывать метод JTable::publish.
JHTMLImage
Содержит два метода для поиска изображения в фронтенде и бэкенде соответственно. Каждый из них ищет либо изображение из директории images текущего шаблона сайта/панели управления, либо, если файла с заданным именем там нет, изображение из заданной директории.
string site(string $file, string $folder = '/images/system/', int $altFile = null, string $altFolder = '/images/system/', string $alt = null, array $attribs = null, bool $asTag = true) string administrator(string $file, string $folder = '/images/', int $altFile = null, string $altFolder = '/images/', string $alt = null, array $attribs = null, bool $asTag = true)
где
$file - имя файла; $folder - путь к файлу. Будет использован, если в директории images текущего шаблона не нашлось файла с заданным именем; $altFile - если не задано, то используются значения $file и $folder, при $altFile = -1 метод возвращает пустую строку, при других значениях используются $altFile и $altFolder; $altFolder - другой путь к файлу; $alt - будущее значение атрибута alt; $attribs - ассоциативный массив атрибутов; $asTag - вернуть весь тег с его содержимым или только путь.
Пример:
echo JHTML::_('image.site', 'notice-info.png', '/media/system/images/');
JHTMLList
Методы класса JHTMLList используются для создания списков некоторых значений.
Список для выбора одного из существующих в Joomla уровней доступа
string accesslevel(object &$row)
где $row - объект, имеющий поле access.
Пример:
$query = 'SELECT id,access FROM #__content WHERE id = 1'; $db =& JFactory::getDBO; $db->setQuery($query); $article = $db->loadObject; echo JHTML::_('list.accesslevel', $article);
Результат показан на рис. 3.4.
Рис. 3.4. Список для выбора уровня доступа
Список для выбора изображения
array images(string $name, string $active = NULL, string $javascript = NULL, string $directory = NULL, string $extensions = "bmp|gif|jpg|png")
где
$name - имя поля; $active - выбранный по умолчанию элемент; $javascript - дополнительный код Javascript, который будет выведен внутри тега
Например, вывод на экран JHTML::_('list.images','imglist') приведет к отображению такого списка (рис. 3.5).
Рис. 3.5. Список для выбора изображения
Список незаблокированных пользователей
string users(string $name, string $active, int $nouser = 0, string $javascript = NULL, string $order = 'name', string $reg = 1)
где
$name - название элемента
Например, вывод на экран JHTML::_('list.users','usrlist','42', 1, NULL, 'id', $reg = 1) приведет к отображению такого списка (рис. 3.6).
Рис. 3.6. Список для выбора пользователя
Список категорий
string category(string $name, string $extension, string $selected = NULL, string $javascript = NULL, string $order = null, int $size = 1, bool $sel_cat = 1)
где
$name - название элемента
Пример:
echo JHTML::_('list.category', 'catlist', 'com_content', 2, 'onclick="someFunc"', 'id', 1, 1);
Данный код выведет на экран список, представленный на рис. 3.7.
Рис. 3.7. Список для выбора категории
JHTMLMenu
Класс используется для отображения элементов меню и не представляет интереса для использования в расширениях.
JHTMLSelect
Класс JHTMLSelect используется для генерации кода списков.
Выпадающий список
string genericlist(array $data, string $name, mixed $attribs = null, string $optKey = 'value', string $optText = 'text', mixed $selected = null, mixed $idtag = false, bool $translate = false)
где
$data - массив данных для отображения. Каждый элемент может быть сгенерирован с помощью метода JHTMLSelect.option или другим образом; $name - имя элемента HTML; $attribs - дополнительные атрибуты тега
Пример:
$query = 'SELECT id,title FROM #__content'; $db =& JFactory::getDBO; $db->setQuery($query); $content = $db->loadObjectList; echo JHTML::_('select.genericlist', $content, 'genlist', 'size='.count($content), 'id', 'title', 2);
Так как мы передали в функцию genericlist $selected=2, то в сгенерированном списке по умолчанию выделен элемент с id, равным 2 (рис. 3.8).
Рис. 3.8. Список для выбора материала
Объект, представляющий элемент
object option(string $value, string $text = '', mixed $optKey = 'value', string $optText = 'text', bool $disable = false)
где
$value - значение элемента
Рассмотрим пример:
$query = 'SELECT id,title FROM #__content'; $db =& JFactory::getDBO; $db->setQuery($query); $content = $db->loadObjectList; foreach ($content as $c) $data[] = JHTML::_('select.option', $c->id, $c->title, 'my_value', 'my_text'); echo JHTML::_('select.genericlist', $data, 'genlist', 'size='.count($data), 'my_value', 'my_text', 2);
В данном примере для каждого материала сайта с помощью метода JHTMLSelect.option создается объект, представляющий элемент
JObject Object ([_errors:protected]=>Array [my_value]=>1 [my_text]=>Материал #1 [disable]=>)
Таким образом, значения $optKey и $optText, переданные в функцию option, стали названиями полей получившегося объекта, а значения $c->id и $c->title - значениями этих полей. Теперь в функцию JHTMLSelect.genericlist необходимо передать те же названия полей, что и в option. Если не передать их, то функция genericlist будет по умолчанию искать в объектах массива $data поля $value и $text, которых там нет.
Результат работы данного примера будет выглядеть так же, как и результат предыдущего.
Список целых чисел
string integerlist(int $start, int $end, int $inc, string $name, mixed $attribs = null, mixed $selected = null, string $format = '')
где
$start - первое число последовательности; $end - последнее число последовательности; $inc - шаг; $name - имя тега; $attribs - массив атрибутов тега; $selected - значение выбранного по умолчанию элемента; $format - формат вывода числа для функции printf.
Пример:
echo JHTML::_('select.integerlist', 1, 10, 1, 'intlist', 'size=10', 3, '%02d');
Этот код выведет список, представленный на рис. 3.9.
Рис. 3.9. Список для выбора числа
Группа переключателей
string radiolist(array $data, string $name, mixed $attribs = null, mixed $optKey = 'value', string $optText = 'text', string $selected = null, bool $idtag = false, bool $translate = false)
где
$data - массив объектов; $name - имя, общее для всех переключателей; $attribs - дополнительные атрибуты тега (могут быть заданы сразу в виде строки); $optKey - из какого поля объекта, представляющего собой элемент массива $data, брать значения элементов ; $optText - из какого поля объекта, представляющего собой элемент массива $data, брать текст элементов ; $selected - значение выбранного по умолчанию элемента; $idtag - префикс id сгенерированных тегов. Для каждого тега id станет равным $idtag
Пример:
$query = 'SELECT id,title FROM #__content'; $db =& JFactory::getDBO; $db->setQuery($query); $content = $db->loadObjectList; echo JHTML::_('select.radiolist', $content, 'radlist', 'class="inputbox"', 'id', 'title', 2, 'radlist', false);
Результат показан на рис. 3.10.
Рис. 3.10. Группа переключателей
Практика
Обработка категорий
В единственном вопросе, который хранится в нашей базе, в поле id_cat стоит значение 1. Оно должно означать id категории. Добавим таблицу и код для работы с категориями.
Создание таблицы для категорий
Выполните следующий SQL-запрос, чтобы создать таблицу для хранения категорий:
CREATE TABLE `jos_myquestions_categories` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `desc` TEXT NOT NULL DEFAULT '' )
Добавьте записи в эту таблицу:
INSERT INTO `jos_myquestions_categories` VALUES (NULL,'Без категории',''), (NULL,'Риторические вопросы','Вопросы, не требующие ответа')
Зайдите в phpMyAdminи убедитесь, что таблица jos_myquestions_categoriesсодержит две записи (рис. 3.11).
Рис. 3.11. Таблица базы данных, хранящая данные о категориях
Таким образом, сейчас все вопросы, для которых в поле id_catстоит значение 1, относятся к категории " Без категории".
Создание класса таблицы
Создайте файл /administrator/components/com_myquestions/tables/category.php:
Вывод списка категорий
Добавьте в файл admin.myquestions.phpфункцию showCategories:
function showCategories($option) { $db =& JFactory::getDbo; $query = "SELECT * FROM #__myquestions_categories"; $db->setQuery($query); $rows = $db->loadObjectList; if ($db->getErrorNum) { echo $db->stderr; return false; } HTML_questions::showCategories($option, $rows); }
Эта функция аналогична функции showQuestions, рассмотренной ранее.
В файл admin.myquestions.html.phpв класс HTML_questions добавьте еще одну функцию:
function showCategories($option, &$rows) { ?>
Данная функция также аналогична одноименной функции для отображения списка вопросов.
Добавьте в переключатель switch в файле admin.myquestions.phpобработку новой задачи:
case 'showcat': showCategories($option); break;
Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniкод:
COM_MYQUESTIONS_CATEGORY_NAME="Название категории" COM_MYQUESTIONS_CATEGORY_DESC="Описание категории"
Перейдя по ссылке ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestions&task=showcat, вы уже можете увидеть список категорий.
Однако пока над списком будет отображаться старая панель инструментов, которую мы создали для списка вопросов. Поэтому необходимо также создать новые панели инструментов для работы с категориями. Откройте файл toolbar.myquestions.phpи добавьте в переключатель switch следующий код:
case 'showcat': TOOLBAR_myquestions_categories::_DEFAULT; break;
Как видите, мы добавили обработку задачи showcat - отображение списка категорий. Соответственно, вызывается функция _DEFAULT класса TOOLBAR_myquestions_categories. Напишем код этого класса. Добавьте в файл toolbar.myquestions.html.phpкод:
class TOOLBAR_myquestions_categories { function _DEFAULT { JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES'), 'generic.png'); JToolBarHelper::addNew('addcat'); JToolBarHelper::editList('editcat'); JToolBarHelper::deleteList (JText::_('COM_MYQUESTIONS_TOOLBAR_REMOVE_CATEGORIES_CONFIRMATION'), 'removecat'); } }
Таким образом, панель инструментов для списка категорий будет содержать три кнопки: " Создать", " Изменить" и " Удалить".
Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniкод:
COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES="Управление категориями вопросов" COM_MYQUESTIONS_TOOLBAR_REMOVE_CATEGORIES_CONFIRMATION="Вы действительно хотите удалить эти категории?"
Теперь по ссылке ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestions&task=showcatвидим список категорий (рис. 3.12).
(есть увеличенное изображение)
Рис. 3.12. Список категорий в бэкенде
Создание, редактирование и удаление категорий
При нажатии на кнопки " Создать" или " Изменить", расположенные над списком категорий, должна отображаться другая панель инструментов. Для этого добавьте в класс TOOLBAR_myquestions_categories функцию _NEW:
class TOOLBAR_myquestions_categories { function _NEW { JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES'), 'generic.png'); JToolBarHelper::save('savecat'); JToolBarHelper::apply('applycat'); JToolBarHelper::cancel('showcat'); } function _DEFAULT { JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES'), 'generic.png'); JToolBarHelper::addNew('addcat'); JToolBarHelper::editList('editcat'); JToolBarHelper::deleteList(JText::_('COM_MYQUESTIONS_TOOLBAR_REMOVE_CONFIRMATION'), 'removecat'); } }
Запишем в файле toolbar.myquestions.php, что при обработке задач addcat и editcat должна отображаться панель инструментов _NEW. Измените код этого файла так:
Теперь добавим обработку всех перечисленных в файле toolbar.myquestions.html.phpзадач. Откройте файл admin.myquestions.phpи добавьте в переключатель switch код:
case 'addcat': case 'editcat': editCategory($option); break; case 'savecat': case 'applycat': saveCategory($option, $task); break; case 'removecat': removeCategories($option); break;
Добавьте перечисленные функции в файл admin.myquestions.php:
function editCategory($option) { $row =& JTable::getInstance('Category','Table'); $cid = JRequest::getVar('cid', array(0), '', 'array'); $id = $cid[0]; $row->load($id); HTML_questions::editCategory($row, $option); } function saveCategory($option, $task) { $row =& JTable::getInstance('category', 'Table'); if (!$row->bind(JRequest::get('post'))) { echo "\n"; exit; } $row->desc = JRequest::getVar('desc', '', 'post', 'string', JREQUEST_ALLOWRAW); if (!$row->store) { echo "\n"; exit; } global $app; if ($task == 'savecat') $app->redirect('index.php?option='.$option.'&task=showcat', JText::_('COM_MYQUESTIONS_CATEGORY_SAVED')); else if ($task == 'applycat') $app- >redirect('index.php?option='.$option.'&task=editcat&cid[]='.$row- >id, JText::_('COM_MYQUESTIONS_CATEGORY_SAVED')); } function removeCategories($option) { global $app; $cid = JRequest::getVar('cid', array, '', 'array'); $db =& JFactory::getDbo; if(count($cid)) { $cids = implode(',', $cid); $query = "DELETE FROM #__myquestions_categories WHERE id IN ($cids)"; $db->setQuery($query); if (!$db->query) { echo "\n"; } } $app->redirect('index.php?option=' . $option . '&task=showcat', JText::_('COM_MYQUESTIONS_CATEGORY_DELETED')); } Листинг .
Добавьте в файл admin.myquestions.html.phpв класс HTML_questions метод editCategory для отображения формы редактирования категории:
function editCategory ($row, $option) { $editor =& JFactory::getEditor; ?>
Наконец, добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniкод:
COM_MYQUESTIONS_CATEGORY_SAVED="Категория сохранена" COM_MYQUESTIONS_CATEGORY_DELETED="Категории успешно удалены"
Убедитесь, что все кнопки обеих панелей инструментов работают корректно.
Присвоение вопросу какой-либо категории
Добавим в форму ответа на вопрос выпадающий список для выбора категории.
Откройте файл admin.myquestions.phpи измените код функции replyToQuestion следующим образом:
function replyToQuestion($option) { $row =& JTable::getInstance('Question','Table'); $cid = JRequest::getVar('cid', array(0), '', 'array'); $id = $cid[0]; $row->load($id); $db = &JFactory::getDBO; $query = 'SELECT name AS text, id AS value FROM #__myquestions_categories'; $db->setQuery($query); $categories = $db->loadObjectList; $list_cat = JHTML::_('select.genericlist', $categories, 'id_cat', ' class="inputbox" ', 'value', 'text', $row->id_cat); HTML_questions::replyToQuestion($row, $option, $list_cat); }
В файле admin.myquestions.html.phpизмените прототип функции HTML_questions::replyToQuestion так:
function replyToQuestion ($row, $option, $list_cat)
Наконец, в коде этой функции измените фрагмент, в котором раньше выводилось текстовое поле с id категории, так:
Перейдите к странице ответа на вопрос и убедитесь, что отображается выпадающий список для выбора категории (рис. 3.13).
Рис. 3.13. Выбор категории вопроса в бэкенде
Ключевые термины
JHTML - класс для вывода элементов XHTML. JHTMLBehavior - поддерживающий класс, который позволяет вывести календарь, дерево элементов, файловый загрузчик и некоторые другие элементы управления. JHTMLEmail - поддерживающий класс, содержащий метод для скрытия адреса электронной почты в целях его защиты от спам-ботов. JHTMLForm - поддерживающий класс, содержащий метод, который возвращает код скрытого поля формы для уменьшения риска CSRF-атак. JHTMLGrid - поддерживающий класс, позволяющий вывести в таблице в панели управления такие элементы, как чекбокс, пиктограмма для переключения состояния "опубликовано"/"не опубликовано", отобразить заголовок столбца как ссылки для сортировки по этому столбцу и др. JHTMLImage - поддерживающий класс, содержащий методы для поиска изображения в фронтенде и бэкенде. JHTMLList - поддерживающий класс для создания списков некоторых конкретных значений. JHTMLSelect - поддерживающий класс для генерации кода списков. Основной метод класса JHTML - метод JHTML::_, который вызывает метод, определяющийся его первым параметром, и передает ему свои остальные параметры. Поддерживающие классы - классы для вывода элементов XHTML и поведений Javascript.
Краткие итоги
Joomla содержит методы для генерации и отображения элементов XHTML и поведений JavaScript. Эти методы вызываются с помощью метода JHTML::_. По первому параметру данный метод определяет, какой метод необходимо вызвать, а остальные параметры передаются в этот метод. Таким образом могут быть вызваны как методы самого класса JHTML, так и методы поддерживающих классов.
Методы класса JHTML позволяют вывести следующие элементы: календарь, форматированную дату, элементы
Текст вопроса, введенный пользователем, пропускается через функцию htmlspecialchars, преобразующую специальные символы в HTML-сущности. Таким путем предотвращается ввод нежелательных HTML-тегов. Затем результат пропускается через функцию nl2br, вставляющую код разрыва строки
перед каждым переводом строки, чтобы текст вопроса при выводе на веб-странице не слился в одну строку.
IP-адрес пользователя определяется с помощью функции getenv, которая возвращает значение переменной окружения, в данном случае - REMOTE_ADDR.
По умолчанию вопросу присваивается категория с id, равным 1, то есть "Без категории".
Добавьте в файл language/ru-RU/ru-RU.com_myquestions.iniкод:
COM_MYQUESTIONS_ADD_QUESTION="Задать вопрос" COM_MYQUESTIONS_AUTHOR="Автор" COM_MYQUESTIONS_DATE="Дата вопроса" COM_MYQUESTIONS_QUESTION="Текст вопроса" COM_MYQUESTIONS_CITY="Город" COM_MYQUESTIONS_EMAIL="e-mail" COM_MYQUESTIONS_CATEGORY="Категория" COM_MYQUESTIONS_PUBLISHED="Отображать ли вопрос на сайте" COM_MYQUESTIONS_SENDBUTTON="Отправить вопрос" COM_MYQUESTIONS_QUESTION_SENT="Спасибо, %s! Ваш вопрос отправлен. Он будет опубликован на сайте после получения ответа" COM_MYQUESTIONS_ADMIN_LETTER_SUBJECT="Новый вопрос на сайте" COM_MYQUESTIONS_ADMIN_LETTER_NEW_QUESTION="Добрый день!На сайте появился новый вопрос:%s" COM_MYQUESTIONS_ADMIN_LETTER_ERROR="Ошибка отправки письма"
Осталось добавить ссылку для написания вопроса. Измените начало функции showCategories так:
function showCategories($rows, $option) { ?> =JText::_('COM_MYQUESTIONS_ALL_QUESTIONS') ?> =JText::_('COM_MYQUESTIONS_ADD_QUESTION') ?>
Теперь на главной странице компонента во фронтенде появилась ссылка " Задать вопрос" (рис. 5.1).
(есть увеличенное изображение)
Рис. 5.1. Ссылка "Задать вопрос"
При переходе по этой ссылке появляется форма для написания вопроса (рис. 5.2). Обратите внимание, что в поле " Автор" подставилось имя текущего пользователя, если он залогинен.
(есть увеличенное изображение)
Рис. 5.2. Форма для написания вопроса
После написания вопроса и нажатия кнопки " Отправить вопрос" происходит перенаправление на главную страницу компонента с сообщением об успешной отправке вопроса (рис. 5.3).
(есть увеличенное изображение)
Рис. 5.3. Сообщение об отправке вопроса
Зайдите в папку <путь к Денверу>/tmp/!sendmailи найдите в ней файл *.eml, содержащий письмо-уведомление администратора о новом вопросе.
SEF
Включите SEF в бэкенде. Для этого перейдите в меню " Сайт" - " Общие настройки" и убедитесь, что переключатель " Включить SEF (ЧПУ)" установлен в " Да". Если вы используете в качестве веб-сервера Apache со включенным mod_rewrite, то вы можете также установить переключатель " Перенаправление URL" в " Да"; тогда из ваших ссылок исчезнет строка " index.php". Вид раздела " Настройки SEO" при включенном mod_rewriteпоказан на рис. 5.4.
Рис. 5.4. Раздел панели управления "Настройки SEO"
Если ваша конфигурация не позволяет использовать mod_rewrite, SEF-ссылки все равно могут быть построены, но они будут включать строку " index.php", например: ссылка: http://www.mysite.ru/index.php/one/two/three.
Нажмите кнопку " Сохранить и закрыть" для сохранения конфигурации. Если вы используете mod_rewrite, убедитесь, что вы переименовали находящийся в корневой папке Joomla файл htaccess.txtв .htaccess(если переименовать файл в проводнике Windows не удается, воспользуйтесь интерфейсом командной строки или каким-либо файловым менеджером, например, Total Commander).
Если вы получили сообщение о том, что ваша конфигурация не может быть перезаписана, задайте те же два значения вручную. Для этого откройте файл configuration.phpв корневой папке Joomla, найдите строки:
public $sef = '0'; public $sef_rewrite = '0';
и измените оба значения на " 1" вместо "0".
Генерация SEF-ссылок
Напишем функцию для генерации SEF-ссылок. Создайте файл /components/com_myquestions/router.php:
Мы создаем пустой массив $segments. Затем проверяем, есть ли в массиве запроса элемент "task", и в этом случае добавляем значение задачи в массив $segments в качестве первого элемента и затем удаляем task из запроса. Далее мы повторяем тот же процесс для id. Наконец, возвращаем массив $segments, чтобы JRoute::_ могла закончить построение URL.
Исправим функции вывода нашего компонента так, чтобы они выводили SEF-ссылки вместо обычных. Откройте файл /components/com_myquestions/myquestions.html.phpи измените код функции showCategories класса HTML_questions следующим образом:
function showCategories($rows, $option) { ?> '> =JText::_('COM_MYQUESTIONS_ALL_QUESTIONS')?> '> =JText::_('COM_MYQUESTIONS_ADD_QUESTION')?>
'.$row->name. ' | '.$row->desc.' |
Измените выделенный код в функции 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 мы считали переменные task и id из массива $segments в том же порядке, в котором мы их записывали в одноименный массив в функции MyQuestionsBuildRoute.
Знаки "@" при получении элементов массива $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-ссылок и как он задается?
Какие классы используются для работы с документом и с данными пользователя?
Упражнения
Адаптируйте код из раздела " Практика" для своего варианта (см. список вариантов в дополнительных материалах).