Комментарии

Вспомогательный файл модуля PHP (часть 4)
( 0 Голосов )

Четвертая, последняя часть вспомогательного файла РНР для CMS Joomla 2.5.

Исходный код из файла helper.php (часть 4)

//  не показывать  просматриваемую в настоящий момент  статью в  списке $query->where('a.id !=' . (int) $currentArticle->id);
//  если фильтр  языков  активизирован, показывать только  те  статьи, которые  написаны на  текущем языке if   ($app->getLanguageFilter() )    {
query->where('a.language  IN   ('.$db-> <*>Quote(JFactory:igetLanguage()->getTag()) . ',' . $db->Quote('*') . ')');
//  задать  порядок сортировки результатов,запроса,   исходя  из //  действительного параметра,   значение  которого определяется //в  форме выражением validate="options"
$query->order($params->get('article_ordering', 'a.title') . ' ' . >$params->get('article_ordering_direction', * ASC'));
//  наложить  на  запрос ограничение  с  помощью параметра  count //   {примечание:   разбиение  на  страницы в  данном модуле  не предполагается) $db->setQuery($query,   0,   $params->get('count',   5));
//  получить   список строк
$items = $db->loadObjectList();
// создать поле ссылки на каждый элемент списка, используя класс маршрутизатора содержимого foreach ($items as &$item) {
$item->slug = $item->id.':'.$item->alias;
$item->catslug = $item->catid.':'.$item->cat_alias;
$item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
return $items; }

В первой строке этой части исходного кода из вспомогательного файла РНР вводится условие с целью исключить текущую строку из списка. Ведь и так известно, что она написана текущим автором, и поэтому ее не следует включать в список искомых статей.

Следующий фрагмент кода тесно связан со средством Language Switcher (Переключатель языков), внедренным в версии Joomla 1.6. Это средство дает пользователю возможность помечать статьи, написанные на конкретном языке. Оператор WHERE вводится в запрос только в том случае, если данное средство активизировано, что проверяется при вызове метода $app->getLanguageFilter (). Если средство Language Switcher активизировано, то далее проверяется, написана ли статья на текущем языке (столбец а. language), или же язык особого значения не имеет, на что указывает критерий, обозначаемый знаком звездочки ("*") Если же средство Language Switcher не активизировано, данный кодовый блок пропускается, а следовательно, оператор WHERE не вводится в запрос.

В следующем фрагменте кода параметры упорядочения используются для сортировки результатов запроса. В частности, метод order () вводит оператор ORDER BY в запрос. Напомним, что значения параметров рассматриваемого здесь модуля размечены для встраивания непосредственно в оператор ORDER BY, а для того чтобы обеспечить соответствие введенного значения одному из заданных вариантов выбора, служит выражение validate=" opt ions". Благодаря этому значения параметров могут быть использованы непосредственно в запросе с помощью метода order ().

Следует заметить, что устанавливаемые по умолчанию значения предоставляются для каждого параметра. Как правило, эти значения достоверны, но иногда они могут таковыми и не оказаться. Допустим, создается новая версия рассматриваемого здесь модуля и в ней вводится еще один параметр. Если после создания старой версии данного модуля перейти к новой, этот новый параметр окажется неопределенным в новой версии модуля. И даже если указать действительное значение нового параметра, используемое по умолчанию, новая версия модуля будет все равно работать корректно, несмотря на то, что этот параметр фактически не определен.

И последнее действие перед выполнением запроса состоит в наложении на него ограничения с помощью параметра count. В большинстве запросов, составляемых для Joomla, используются параметры смещения и ограничения, указывающие базе данных MySQL начало и окончание обработки запроса. В данном случае начинать обработку запроса следует с самого начала (т.е. с нулевой строки таблицы), а завершать — номером строки, определяемой параметром count (по умолчанию его значение равно 5). Соответствующие аргументы передаются методу setQuery ().

В следующей строке кода выполняется запрос, а результаты его обработки возвращаются в виде массива объектов из рассмотренного ранее метода loadObjectList (). В итоге мы получаем в свое распоряжение массив объектов, каждый из которых содержит значения, извлеченные из одной строки таблицы в ходе обработки запроса. В составляемый список статей нам нужно включить ссылки на отдельные статьи. Поэтому нам остается лишь сформировать эти ссылки.

Сформировать ссылки в Joomla совсем не трудно, если воспользоваться для этой цели подходящими встроенными методами. А ссылки на статьи формируются по определенным правилам. В частности, для этой цели на веб-сайте обычно находится пункт меню, наиболее подходящий для статьи. Если для каждой статьи имеется отдельный пункт меню, то формируется ссылка, по которой этот пункт меню выбирается. В противном случае находится пункт меню для категории, которой принадлежит статья. Для каждой статьи мы попытаемся воспользоваться уже имеющимся URL вместо того, чтобы формировать новый URL. Благодаря этому ссылки на одну и ту же статью, уже имеющиеся в разных местах веб-сайта, будут приводить на одну и ту же его страницу по тому же самому URL. Как же все это сделать? К счастью, в Joomla уже имеются методы для формирования ссылок на статьи.

Итак, рассмотрим последний фрагмент кода, где в цикле foreach организуется поочередное обращение ко всем элементам массива $items. В этом цикле каждый объект из массива доступен в переменной $item. В двух первых строках кода в цикле f oreach создаются поля для статьи и ее категории. В этих полях содержится идентификатор, знак двоеточия (:) и псевдоним (например, 23:my-article-alias). Все это потребуется при создании URL для ссылки на статью.

Ниже приведена третья строка кода из цикла foreach.

$item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug) ) ;

Именно в этой строке кода и формируется ссылка на отдельную статью. И делается это в две стадии. Сначала с помощью метода getArticleRoute () из класса ContentHelperRoute составляется маршрутизация статьи. В качестве аргументов этот метод принимает заготовки статьи и ее категории, полученные в двух предыдущих строках кода, и возвращает запрос на формирование URL. Как упоминалось ранее в этой главе, каждый модуль обычно связан с некоторым компонентом. Так, рассматриваемый здесь модуль связан с компонентом comcontent. Поэтому формируемые в нем ссылки на статьи должны быть согласованы со ссылками, формируемыми в самом компоненте com_content или в других модулях, использующих этот компонент.

При создании компонента имеется, в частности, возможность установить определенные правила для маршрутизации. В компоненте comcontent это делается с помощью метода getArticleRoute (), находящего имеющийся пункт меню как наиболее подходящий для данной статьи. Так, если имеется пункт меню для отдельной статьи, то будет создан указывающий на него URL. В противном случае находится пункт меню, указывающий на категорию данной статьи. И это делается потому, что ссылки на отдельную статью должны, как правило, направлять по тому же самому URL.

Самое главное, чтобы ссылки на статьи были такими же, как и те, что сформированы в компоненте или в других модулях статей. И для этого мы должны воспользоваться теми же самыми методами формирования ссылок. Этим гарантируется, что получаемые в итоге ссылки будут совместимы с другими ссылками, а кроме того, экономится наш труд. Более того, если изменяется порядок маршрутизации статей или исправляется программная ошибка, все эти изменения будут подхвачены рассматриваемым здесь модулем.

Результат выполнения метода getArticleRoute () выглядит довольно просто, как в показанном ниже примере.

index.php?option=com_content&view=article&id=l:administrator:components&catid=21:components&Itemid=273

Первая часть ссылки на статью остается неизменной: index.php?option=com_ content&view=article. А две следующие части являются созданными ранее заготовками статьи и категории. Но все эти части — не такое уж и большое достижение со стороны метода getArticleRoute (). Совсем другое дело — последняя часть &Itemid=273, которая означает пункт меню, наиболее подходящий для данной статьи по правилам, установленным для компонента. Именно такой пункт меню и возвращает метод getArticleRoute().

Получив результаты, возвращаемые методом getArticleRoute (), мы должны превратить их в полноценный URL. И это делается с помощью метода JRoute::_(), который, в свою очередь, вызывает функцию маршрутизации, если таковая имеется и предоставляется компонентом. В данном случае это функция ContentBuildRoute () из файла components/com_content/router.php. Если установлена кнопка-переключатель Yes параметра Search Engine Friendly URLs на вкладке SEO диалогового окна Global Configuration, то URL преобразуется в удобный для поиска вариант, а запрос заменяется псевдонимами из пункта меню, а иногда — из категории. Так, приведенный выше пример ссылки преобразуется в следующий удобный для поиска URL:

<маршрутный путь Joomla!>/index.php/using-joomla/extensions/components/administrator-components

Этот URL затем преобразуется в полноценный URL системным подключаемым модулем SEF, добавляющим адрес хоста (т.е. веб-узла, например, http://www.mydomain) в начале URL.

После обработки каждого объекта из массива $items метод getList () завершается. Сначала происходит выход из цикла for each, затем из кодового блока условных операторов if/then и далее возврат массива $items.


Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости
Добавить комментарий


Защитный код