Разрботка расширений для CMS Joomla
Шрифт:
Генерация 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 будет начинаться с протоколав противном случае - http://.
Данный
Допустим, метод 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; } ?>Обратите внимание, что массив $query должен быть передан в функцию <имя компонента>BuildRoute по ссылке. По мере заполнения массива $segments обработанные элементы удаляются из массива $query с помощью unset. Любые элементы, которые останутся в массиве $query после работы функции <имя компонента>BuildRoute, останутся и в URL. Если мы передадим $query по значению, вызовы функции unset будут действовать только на локальную копию этого массива и все элементы старого URL будут появляться после SEF-сегментов.
Документ (класс JDocument)
Документ– это буфер, использующийся для хранения содержимого веб-страницы, которая будет показана пользователю после выполнения запроса.
Получение ссылки на глобальный объект JDocument:
$document =& JFactory::getDocument;
Этот объект хранит название, описание, язык, направление текста, дату модификации, кодировку и некоторые другие значения. Класс JDocument содержит несколько методов для получения этих значений: getTitle, getDescription, getLanguage, getDirection, getModifiedDate, getCharset и др. Соответственно, методы для задания этих значений называются setTitle, setDescription и т.д. и принимают в качестве аргумента новое значение.
Получение значения мета-тега
string getMetaData(string $name, bool $http_equiv = false)
где
$name - название тега; $http_equiv - относится ли этот мета-тег к группе http-equiv (например, Content-Type, Refresh и др.).
Примеры:
echo $document->getMetaData('content-type', true); echo $document->getMetaData('keywords', false);
Изменение значения мета-тега
void setMetaData(string $name, string $content, bool $http_equiv = false, bool $sync = true)
где
$content - значение атрибута content; $sync - синхронизировать ли тег content-type с MIME-типом документа.
Пример:
$document->setMetaData('content-type','text/html',true,true);
Добавление скриптов и каскадных таблиц стилей
Перечисленные ниже методы добавляют в секцию <head> соответствующие теги.
Добавление ссылки на скрипт:
void addScript(string $url, string $type = "text/javascript", bool $defer = false, bool $async = false)
где
$url - URL скрипта; $type - тип скрипта (text/javascript, text/vbscript и т.д.); $defer - добавлять ли к тегу <script> атрибут defer="defer"; $async - добавлять ли к тегу <script> атрибут async="async".
Пример:
$document->addScript('/components/com_mycomponent/js/script.js');
Добавление непосредственно текста скрипта
void addScriptDeclaration(string $content, string $type = 'text/javascript')
где