Loading

Как создать плагин sh404SEF для моего компонента?

Общая информация

sh40SEF создает и управляет SEF-адресами веб-страниц для CMS Joomla!. Для адаптации компонентов он использует систему плагинов. sh404SEF используется для создания "прямых" (SEF URL) и "обратных" (не-SEF) адресов страниц. Из этого урока вы сможете узнать как правильно создать плагин sh404SEF для своего компонента.

SEF адрес

Создание SEF-адреса это процесс обнаружения оптимизированного аналога классического не-SEF URL в Joomla!. Как пример:

  • не-SEF URL: index.php? option=com_content&task=view&id=24&Itemid=3
  • SEF-адрес: /News-section/Fun-category/what-is-the-difference-between-a-pigeon.html

Процесс не является автоматическим, поэтому вызов процесса сотается на усмотрение компонента. Перед использованием любого URL компонент должен вызвать следующую функцию, передавая не-SEF URL как параметр: JRoute:_().

Возвращенное функцией значение - SEF-адрес, вычисленный для переданного не-SEF адреса страницы. JRoute: _ () эффективен, но во многом ограничен. Он создает URL только следующего формата http://example.org/magazine/article/552-add-styling-parameters-for-joomla-15-articles-titles.html

Роль sh404SEF состоит в том чтобы создавать более короткие и более понятные URL, удаляя нежелательные части, например, /article/ или номер статьи, опираясь на те же самые начальные данные: не-SEF URL, переданный компонентом.

sh404SEF использует систему плагинов. Он служит основой для обработки самих адресов страниц, сохряняя их в базе данных для того чтобы найти после запроса, но в зависимости от option=com_component части не-SEF URL, он использует специальный файл php для создания частей SEF-адреса. Эти плагины могут быть или "родными" или "внешними". Родные плагины были спроектированы и написаны для sh404SEF и полностью используют его возможности. Родные плагины поставляются с sh404SEF (напрмер, плагин для основных функций Joomla!, com_content, com_newsfeeds, com_search, com_poll..., популярных компонентов, например, Docman, Fireboard, Virtuemart, Community Builder...). Также плагин для sh404sef может быть упакован автором компонента непосредственно в нем.

Внешние плагины создаются или непосредственно для собственной оптимизированной системы Joomla или для популярных компонентов оптимизации, например, SEF Advanced. SEF плагин для Joomla это фактически файл router.php, расположенный в директории компонента. Плагины для других SEF-расширений обычно поставляются вместе с компонентом. Они сохраненяются в каталоге компонента и обычно имеют форму отдельного файла: sef_ext.php. sh404SEF может использовать эти плагины автоматически, даже при том, что в некоторых случаях могут возникнуть проблемы с совместимостью. Если для данного компонента существуют родной и внешний плагины, sh404SEF позволяет вам решить, какой должен использоваться, с помощью настроек sh404SEF.

После создания каждый SEF-адрес сохраняется в базе данных Joomla! вместе с не-SEF аналогом для того, чтобы избежать этого трудоёмкого процесса в следующий раз при загрузке того же адреса.

Примечание: кроме сохранения URL в базе данных у sh404SEF есть система кэширования, которая позволяет ускорить процесс поиска нужного URL в базе данных. Запись в базе данных и в кэше является частью оболочки sh404SEF, и поэтому разработчик компонента, желающий написать родной плагин для sh404SEF, может сосредоточиться только на создании желаемого вида URL.

Создание родных плагинов является основной темой этого документа.

Обратные URL (не-SEF адреса)

Когда Joomla! получает запрос к странице, она передает требуемый URL в sh404SEF, который производит поиск по базе данных чтобы попробовать найти запись, которая соответствует запросу. Если оптимизированное соответствие найдено, то sh404SEF возвращает не-SEF (index.php?option=com_xxx&task=zzz...) часть записи URL для дальнейшей обработки. Этот процесс называют "возврат" URL. Он необходим, потому что Joomla! ничего не знает о SEF-адресе, и может только обрабатывать не-SEF URL.

Получение URL с sh404SEF это полностью автоматизированный процесс. Другими словами, и вопреки внешним плагинам, нет никакого кода, для "декодирования" SEF-адрес и возврата его в не-SEF URL.

Структура каталога и имен файлов

Для sh404SEF могут существовать три типа плагинов. Они могут находиться в трех местах:

  • Внешние плагины находятся в папке /components/com_component_name
  • Родные плагины, постявляемы с sh404SEF, находятся в папке /components/com_sh404sef/sef_ext
  • Индивидуальные родные плагины в составе комплекта поставки расширения должны быть расположены в папке /components/com_component_name/sef_ext

Файл родного плагина должен называться так же, как компонент для которого он работает. Например, если вы написали компонент под названием HeyJoe и создали родной плагин com_HeyJoe для sh404SEF. В этом случае файл плагина будет:

/components/com_HeyJoe/sef_ext/com_HeyJoe.php

Также могут использоваться любые другие файлы, которые вам нужны, например, языковые файлы, но управление этими дополнительными файлами остается на усмотрение автора компонента.

Примечание: может случиться так, что у sh404SEF уже есть родной плагин для компонента, но компонент также содержит плагин для sh404SEF. В таком случае вместо собственного плагина sh404SEF будет использоваться плагин компонента.

Создание плагина для sh404SEF

Анатомия плагина sh404SEF

Как уже говорилось выше, родной плагин использует основной файл под названием com_component_name.php. Файл типового плагина находится в папке /components/com_sh404sef/sef_ext и называется sample_com_plugin.php. Он состоит из 3 главных частей:

Раздел инициализации

Эта часть вызывает функцию инициализации sh404SEF и устанавливает или сбрасывает некоторые переменные. Эту часть плагина не нужно измененять никому кроме опытных программистов. Код инициализации плагина sh404SEF:

// ------------------ standard plugin initialize function - don't change ---------------------------

global $sh_LANG, $sefConfig;

$shLangName = '';

$shLangIso = '';

$title = array();

$shItemidString = '';

$dosef = shInitializePlugin( $lang, $shLangName, $shLangIso, $option);

// ------------------ standard plugin initialize function - don't change ---------------------------

Вы не можете напрямую использовать многоязычность в своем компоненте. Однако sh404SEF был проектирован для использования на многоязычных сайтах. Эта конкретная часть плагина "определяет" язык не-SEF адреса с учетом параметров "Translate URL" и "Insert Language Code", которые могут быть установлены в административном интерфейсе sh404SEF.

Создание основного URL

Эта часть кода плагина — именно то, что должен написать автор компонента, определяя как URL должен создаваться согласно внутренней работе компонента. SEF URL создается с помощью заполнения массива под названием $title. Каждый элемент URL просто добавляется к массиву в том же самом порядке, в каком он должен появляться в конечном SEF адресе. sh404SEF обработает этот массив чтобы создать конечный URL.

Дополнительно sh404SEF предоставляет механизм, с помощью которого вы можете оставить некоторые переменные в адресе страницы (GET) как часть "строки запроса". Рассмотрим этот не-SEF адрес:

index.php?option=myComponent&task=viewUserDetails &userId=2456&Itemid=23

Вы можете решить, конвертировать ли его в SEF-адрес полностью, как:

This-is-my-User-name/View-user-details.html

или вместо получить частичный SEF-адрес, такой как:

View-user-details.html?userId=2456

Это хорошее решение в тех случаях, когда наличие полностью оптимизированного URL может сгенерировать большие объемы записей в базе данных, не имеющих смысла для поисковой оптимизации. Несколько примеров:

  • Компонент для обработки учетных записей пользователей. Он может содержать ссылки для просмотра подробностей профайла, обновления и удаления записи, печати, экспорта и т.д, для каждого отдельного пользователя. Все прекрасно если на вашем сайте всего несколько десятков или сотен пользователей. Однако если вы планируете иметь несколько тысяч пользователей, то будет лучше оставить ID пользователя как переменную GET вместо того, чтобы создавать SEF адрес, содержащий имя пользователя
  • Переменные $limit и $limitstart используются Joomla! для обработки многостраничного контента. Сайт с большим количеством статей или материалов, (сотни, тысячи статей), может генерировать чрезмерное потребление места в базе данных
  • Если у ваш компонент использует возможности поиска с использованием переменных GET, то лучше удалить текст запроса из SEF-адреса, иначе любое слово, которое ищет пользователь, сгенерирует уникальную запись для URL в базе данных.

В общем, существует правило, что параметры, не придающие смысл строке оптимизированного URL, должны удаляться из текстовой части URL, по крайней мере если ожидается большое их количество. С самого начала важно решить какой вид будут иметь SEF-адреса вашего компонента. Неплохая идея - предоставить пользователю компонента возможность изменять формат URL согласно их потребностям: размеру сайта, и т.д. В настоящее время sh404SEF не предоставляет никаких средств для использования параметров плагинов кроме имеющихся непосредственно в sh404SEF. Так что если вы решите добавить определяемые пользователем параметры, вы должны разместить эти настройки в параметрах вашего компонента.

Завершаяющая часть

Эта часть вызывает функцию sh404SEF. Вы не должны изменять ее, если не хотите сделать что-то особенное. Вы можете например создать специальные дествия для случая когда $dosef принимает значение false, если вы решили по каким-то причинам не создавать SEF-адрес.

Код завершения:

// ------------------ standard plugin finalize function - don't change ---------------------------


if ($dosef){

$string = shFinalizePlugin( $string, $title, $shAppendString, $shItemidString,

(isset($limit) ? @$limit : null), (isset($limitstart) ? @$limitstart : null),

(isset($shLangName) ? @$shLangName : null));

}

// ------------------ standard plugin finalize function - don't change ---------------------------

Создание SEF-адреса

Для создания SEF URL вам нужно знать несколько важных вещей.

Ваш плагин генерирует только часть адреса, находящуюся после имени домена.

Например, если Вы желаете создать URL вида http://www.mysite.com/product-infos/giant-cliffhanger/, то достаточно просто включить в свой плагин следующие строки:

$title[] = 'product-infos';

$title[] = 'giant-cliffhanger';

Все параметры, содержащиеся в не-SEF URL были уже извлечены и доступны в контексте файла плагина. Например, вы можете непосредственно использовать следующее:

if (isset($task))

$title[] = $task;

Если не-SEF URL содержит:...&task=view..., тогда результирующий URL будет содержать /view/

Перед использованием переменной необходимо проверить ее наличие, используя isset() или empty(). Известно, что многие вебмастера на своих сайта используют отображение ошибок уровня NOTICE. Так как запрос к sh404SEF может отправлен ранее, чем заголовки выведены Joomla!, отображение ошибки NOTICE прервет все и полностью прекратит отображение страницы.

Значения по умолчанию sh404SEF для того чтобы оставить каждый параметр как параметр GET.

Вы должны определенно указать sh404SEF, была ли произведена ли конвертация переменной в оптимизированный эквивалент, или нет. Это можно сделать, вызывая функцию shRemoveFromGETVarsList(). Например, если у вас есть следующий параметр GET:

...&task=viewUserDetails....

и вы решили вместо него вставлять в SEF-адрес строку, например, /View-user-Details/, вам нужно использовать код следующего вида:

if (isset($task) &&($task == 'viewUserDetails')) {


$title[] = 'View-user-Details';

shRemoveFromGETVarsList('task');

}

который означает:

Если $task это ViewUserDetail:

1. Вставить соответствующий текст в URL

2. Указать sh404SEF больше не добавлять $task к URL

Если shRemoveFromGETVarsList() не вызвана, то к SEF-адресу будет добавленная часть: ?task=viewUserDetails. Это не вызовет никаких проблем, и не помешает работе Joomla!.

Большинство плагинов содержать следующие строки в коде плагина:
shRemoveFromGETVarsList('option');

shRemoveFromGETVarsList('lang');




if (!empty($Itemid))

shRemoveFromGETVarsList('Itemid'); //опциональное удаление limit and limitstart



if (!empty($limit)) //empty() используется для проверки $limit, поскольку $limit не может быть нулем

shRemoveFromGETVarsList('limit');



if (isset($limitstart)) //isset() используется для проверки $limitstart, поскольку значение этой переменной также не может быть нулем

shRemoveFromGETVarsList('limitstart');
Автоматическая обработка

Все операции с SEF-адресами, такие как очистка, кодирование, замена символов, и т.д производятся sh404SEF автоматически.

Не нужно вставлять код языка в SEF-адрес.

Функции языка обрабатываются в sh404SEF автоматически, с учетом параметров компонента sh404SEF.

Параметр title

Если вы используете параметр title в URL вашего компонента, то он пересекается с массивом $title, используемым в sg404SEF. Чтобы избежать проблем, содержимое переменной $title должно быть сохранено в переменной $sh404SEF_title. Для создания URL в этом слусае нужно использовать $sh404SEF_title вместо $title.

Не добавляйте промежуточные слэши, они будут добавлены автоматически.

Однако, последний элемент в URL (точнее, последний элемент в $title) может быть /. Если это так, то конечный URL закончится слэшем. Если последний элемент будет чем — нибудь, отличным от /, то возможно к адресу будет добавлен суффикс. Пользователи могут установить суффикс в административном интерфейсе sh404SEF (например .html). Суффикс также добавляется автоматически.

Вы можете установить $dosef в значение false где-то в коде вашего плагина.

Это предотвратит конвертацию URL из не-SEF. Такой подход может использоваться например, если некоторые отдельные URL оказываются слишком сложным или слишком многочисленным, чтобы создавать оптимизированную версию.

Сервисная функция: getMenuTitle()

Эта функция возвращает заголовок пункта меню, соответствующий параметру option (option=com_content) или параметру Itemid, объединенному с информацией о языке страницы. Функцию можно вызвать следующим образом:

$title[] = getMenuTitle($option, (isset($task) ? @$task : null), $shCurrentItemid, null, $shLangName );

$option всегда доступно, это имя компонента (например, com_HeyJoe), $task может существовать или нет, в зависимости от особенностей работы вашего компонента

$shCurrentItemid всегда доступно.

Эта переменная устанавливается в sh404SEF и содержит Itemid текущей страницы. Просто запомните, что ваш плагин вызывается обычно как часть JRoute::_() во то чремя как Joomla! готовит контент страницы и конвертирует все ссылки на этой странице в оптимизированный формат. $shCurrentItemid это Itemid страницы. Вы не должны использовать $shCurrentItemid из-за способа, которым работает каш компонент. Просто замените $shCurrentItemid вашим Itemid.

$shLangName

Эта переменная используется для обработки перевода. Эта переменная автоматически установлена в разделе инициализации плагина, как указано выше.

Сервисная функция getContentTitles()

Эта функция использует аналогичные параметры. Она возвратит заголовок элемента контента. Ее значение можно получить с помощью следующего кода:

$title[] = sef_404::getContentTitles($task,$id,$Itemid, $shLangName)

(перед использованием убедитесь что переменные $task и $id существуют)

$task может принимать значения 'section', 'category', 'blogsection', 'blogcategory' или 'view'.

$id это id раздела, категории или идентификатор элемента контента. Если $id установлен, то из базы данных будет выбрано и возвращено название соответствующего раздела, категории или заголовок статьи (в соответствии с параметрами настройки sh404SEF для элементов контента может быть также возвращен псевдоним). Если $id не будет передан функции, то она возвратит заголовок элемента меню, используя getMenuTitle ()

Многоязычность

URL на сайтах с sh404SEF может содержать две части: постоянные элементы адреса и переменные.

  • Постоянные элементы — такие как: .../view-products-details или /Delete-product
  • Переменные элементы - такие как: .../pet-mammoth-clothing

"Delete-product" - неизменная текстовая строка, которая описывает действие, тогда как "pet-mammoth-clothing" выбрана из базы данных, заголовка контента.

Постоянные элементы переводятся на другой язык через ряд языковых строк, которые должны быть в составе плагина или как отдельный текстовый файл. Важно чтобы все строки перевода были доступны в в любое время, поскольку отдельная веб-страница может одновременно содержать URL на нескольких языках. Плагины, поставляемые с sh404SEF, используют глобальную переменную $sh_LANG. Он представляет собой двухмерный массив, с индексом из кода языка и идентификатором строки. Например:

$sh_LANG['fr']['_SH404SEF_FB_SHOW_USER_PROFILE'] = 'Voir vos informations utilisateur';

$sh_LANG['en']['_SH404SEF_FB_SHOW_USER_PROFILE'] = 'View user information';

При использовании такого массива вы можете использовать две переменные, которые инициализированы с соответствующими значениями в разделе инициализации плагина:

  • $shLangName : содержит название языка ("french", "english", "spanish")
  • $shLangIso : содержит ISO код языка ("fr", "en", "es")

Таким образом вам нужно использовать:

$title[] = $sh_LANG[$shLangIso]['_SH404SEF_FB_SHOW_USER_PROFILE']

Переменные элементы переводятся с использованием Joomfish. Поскольку трансляция URL может быть включена или отключена, для вывода строк, предназначенных для перевода, используйте следующий код, выбирая любые данные, которые могут быть переведены из базы данных:

if (shTranslateUrl($option, $shLangName))

$database->loadObject( $sectionTitle);

else $database->loadObject( $sectionTitle, false);

shTranslateUrl () возвратит true если URL для компонента "$option" должен быть переведен, и false, если наоборот. shTranslateUrl() читает настройки пользователя, чтобы принять решение. Функция будет также всегда возвращать false, если Joomfish не установлен, поэтому этот код будет работать в любой ситуации. Если Joomfish установлен на сайте, то функция каждого обычного объекта базы данных Joomla! Может быть вызвана с использованием второго параметра, чтобы включить или отключить перевод.

Внимание: для того чтобы Joomfish работал и выполнял перевод, вам НЕОБХОДИМО включить id из таблицы в выражение SELECT вашего запроса! Например:

"SELECT name FROM eg_contents WHERE id=3" НИКОГДА НЕ переведется на другой язык.

Чтобы создать перевод, запрос должен быть следующего вида:

"SELECT id, name FROM eg_contents WHERE id=3"

С этим последним запросом:

$database->loadObject ($sectionTitle); возвратит переведенное значение 'name'
$database->loadObject ($sectionTitle, ложь); возвратит оригинальное значение 'name' (то есть значение на языке сайта по умолчанию)

Примечание: не забывайте явно удалять переменную $lang из URL (используя shRemoveFromGETVarsList ('lang')), иначе она появится в конечном URL как часть строки запроса (...&lang=xx...)

 

Другие статьи на эту тему

Комментарии  

 
0 #2 Domse 18.05.2011 11:44
Отличная статья!!! Гуглил на эту тему, но этой статьи в выдаче не было, хорошо на форуме подсказали! Автору низкий поклон! :)
Цитировать
 
 
+1 #1 Nikolai25 19.08.2010 09:27
Вот спасибо! По вашей технологии попробую создать плагин для datso galleri потомучто те которые есть какие то корявые.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Youwinner - новый шаблон Joomla для интернет-казино

24/08/2011

Компания Youtheme выпустила новый шаблон, Youwinner, для сайтов на тему интернет-казино и игровых онлайн-порталов.

Бизнес шаблон Vrazilia

03/07/2011

Новый бесплатный шаблон Joomla от Pickjoomla

Яндекс объединяет усилия с Rambler

29/06/2011

Yandex, самый популярный поисковый сервис России, заявил в четверг о том, что объединит усилия с поисковым серви [ ... ]

Rambler's Top100
Рейтинг@Mail.ru
Яндекс.Метрика