Как найти все страницы с похожим именем — различия между версиями
Mad grant (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
(не показано 10 промежуточных версий этого же участника) | |||
Строка 10: | Строка 10: | ||
%custom getSimilarPages()% — выводит все возможные страницы контента(со всех сайтов и языковых версий) с похожим именем. | %custom getSimilarPages()% — выводит все возможные страницы контента(со всех сайтов и языковых версий) с похожим именем. | ||
− | '''Параметры: custom getSimilarPages( | + | '''Параметры: custom getSimilarPages($name = '', [$template = 'default', $domain_id = false, $lang_id = false])''' |
'''$name''' | '''$name''' | ||
− | Имя страницы, с которым будет произведен поиск. | + | Имя страницы, с которым будет произведен поиск. Поиск производится по первому вхождению искомой строки. |
'''$template''' | '''$template''' | ||
Принимает имя шаблона, по которому выводится результат макроса, значение по-умолчанию 'default' В XSLT-шаблонизаторе не используется. | Принимает имя шаблона, по которому выводится результат макроса, значение по-умолчанию 'default' В XSLT-шаблонизаторе не используется. | ||
+ | '''$domain_id''' | ||
+ | Принимает id домена, на котором нужно искать страницы, можно указать несколько id через знак ";". По-умолчанию поиск проходит по всем доменам системы. | ||
+ | '''$lang_id''' | ||
+ | Принимает id языка, на котором нужно искать страницы, можно указать несколько id через знак ";". По-умолчанию поиск проходит по всем языкам. | ||
Для применения этого макроса скопируйте код макроса в файл /classes/modules/custom.php. | Для применения этого макроса скопируйте код макроса в файл /classes/modules/custom.php. | ||
Строка 22: | Строка 26: | ||
<source lang="php"> | <source lang="php"> | ||
− | public function getSimilarPages($name = ' | + | public function getSimilarPages($name = '', $template = 'default', $domain_id = false, $lang_id = false){ |
+ | |||
+ | if($name == ''){ | ||
+ | return 'give me string to search'; | ||
+ | } | ||
list($items_template, $item_template, $empty_template) = def_module::loadTemplates('content/' . $template, 'items', 'item', 'empty'); | list($items_template, $item_template, $empty_template) = def_module::loadTemplates('content/' . $template, 'items', 'item', 'empty'); | ||
+ | |||
+ | if($domain_id !== false){ | ||
+ | $domain_id = preg_replace('/\s/', '', $domain_id); | ||
+ | $domain_id = explode(';', $domain_id); | ||
+ | } | ||
+ | |||
+ | if($lang_id !== false){ | ||
+ | $lang_id = preg_replace('/\s/', '', $lang_id); | ||
+ | $lang_id = explode(';', $lang_id); | ||
+ | } | ||
$pages = new selector('pages'); | $pages = new selector('pages'); | ||
$pages->types('hierarchy-type')->name('content'); | $pages->types('hierarchy-type')->name('content'); | ||
− | $pages->where('domain')->equals( | + | $pages->where('domain')->equals($domain_id); |
− | $pages->where('lang')->equals( | + | $pages->where('lang')->equals($lang_id); |
$pages->where('name')->ilike($name . '%'); | $pages->where('name')->ilike($name . '%'); | ||
$pages->order('id')->asc(); | $pages->order('id')->asc(); | ||
Строка 49: | Строка 67: | ||
foreach($pages_arr as $page){ | foreach($pages_arr as $page){ | ||
− | + | $item['attribute:id'] = $page->getId(); | |
$item['attribute:name'] = $page->getName(); | $item['attribute:name'] = $page->getName(); | ||
$item['attribute:link'] = $page->link; | $item['attribute:link'] = $page->link; | ||
Строка 63: | Строка 81: | ||
} | } | ||
</source> | </source> | ||
− | '''К сожалению, сделать выборку непосредственно по псевдостатическому адресу нельзя | + | '''К сожалению, сделать выборку непосредственно по псевдостатическому адресу нельзя''' |
== Применение в xslt == | == Применение в xslt == | ||
Строка 70: | Строка 88: | ||
<source lang="xml"> | <source lang="xml"> | ||
− | udata://custom/getSimilarPages/te | + | udata://custom/getSimilarPages/te//1;2/1;2/ |
</source> | </source> | ||
Текущая версия на 08:39, 4 апреля 2014
Актуально для версии 2.9.6
Задача
У Вас есть необходимость прямо на странице реализовать переход на аналогичную страницу в другой языковой версии или на другом сайте, в рамках мультисайтовости. Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя. Необходимо написать кастомный макрос, пример оного дан ниже.
Решение
%custom getSimilarPages()% — выводит все возможные страницы контента(со всех сайтов и языковых версий) с похожим именем.
Параметры: custom getSimilarPages($name = , [$template = 'default', $domain_id = false, $lang_id = false])
$name
Имя страницы, с которым будет произведен поиск. Поиск производится по первому вхождению искомой строки.
$template
Принимает имя шаблона, по которому выводится результат макроса, значение по-умолчанию 'default' В XSLT-шаблонизаторе не используется.
$domain_id
Принимает id домена, на котором нужно искать страницы, можно указать несколько id через знак ";". По-умолчанию поиск проходит по всем доменам системы.
$lang_id
Принимает id языка, на котором нужно искать страницы, можно указать несколько id через знак ";". По-умолчанию поиск проходит по всем языкам.
Для применения этого макроса скопируйте код макроса в файл /classes/modules/custom.php.
Код макроса
public function getSimilarPages($name = '', $template = 'default', $domain_id = false, $lang_id = false){
if($name == ''){
return 'give me string to search';
}
list($items_template, $item_template, $empty_template) = def_module::loadTemplates('content/' . $template, 'items', 'item', 'empty');
if($domain_id !== false){
$domain_id = preg_replace('/\s/', '', $domain_id);
$domain_id = explode(';', $domain_id);
}
if($lang_id !== false){
$lang_id = preg_replace('/\s/', '', $lang_id);
$lang_id = explode(';', $lang_id);
}
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('content');
$pages->where('domain')->equals($domain_id);
$pages->where('lang')->equals($lang_id);
$pages->where('name')->ilike($name . '%');
$pages->order('id')->asc();
$total = $pages->length();
if($total == 0){
$empty = array();
$empty['request'] = $name;
return def_module::parseTemplate($empty_template, $empty);
}
$pages_arr = $pages->result();
$domains_col = domainsCollection::getInstance();
$langs_col = langsCollection::getInstance();
$item = array();
$items= array();
foreach($pages_arr as $page){
$item['attribute:id'] = $page->getId();
$item['attribute:name'] = $page->getName();
$item['attribute:link'] = $page->link;
$item['attribute:alt-name'] = $page->getAltName();
$item['attribute:domain'] = $domains_col->getDomain($page->getDomainId())->getHost();
$item['attribute:lang'] = $langs_col->getLang($page->getLangId())->getPrefix();
$items[] = def_module::parseTemplate($item_template, $item);
}
$items = array('subnodes:pages' => $items);
$items['total'] = $total;
return def_module::parseTemplate($items_template, $items);
}
К сожалению, сделать выборку непосредственно по псевдостатическому адресу нельзя
Применение в xslt
Пример вызова
udata://custom/getSimilarPages/te//1;2/1;2/
XML-ответ UData
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="getSimilarPages" generation-time="0.037057">
<pages>
<item id="5391" name="test" link="/test/" alt-name="test" domain="domain_1.ru" lang="ru"/>
<item id="5392" name="test123" link="http://domain_2.ru/test123/" alt-name="test" domain="domain_2.ru" lang="ru"/>
<item id="5393" name="test2" link="/en/test2/" alt-name="test2" domain="domain_1.ru" lang="en"/>
<item id="5394" name="test32" link="http://domain_2/en/test32/" alt-name="test32" domain="domain_2.ru" lang="en"/>
</pages>
<total>4</total>
</udata>
Элементы и атрибуты
<pages>
Ветвь, содержащая элементы item — страницы.
<item>
Элемент, описывающий отдельную страницу.
@id
Идентификатор страницы новости.
@link
Ссылка на страницу полного текста новости.
@name
Имя страницы.
@alt-name
Псевдостатический адрес страницы.
@domain
Домен сайта, на котором находится страница.
@lang
Префикс языковой версии, на которой находится страница.
<total>
Количество найденных страниц.
Применение в tpl
Пример вызова макроса
%custom getSimilarPages('test', 'default')%
Используемые шаблоны
Макрос оперирует шаблонами, находящимися в каталоге /tpls/content/. Вывод макроса осуществляется по шаблону, указанному в параметре template. Вы можете не указывать этот параметр, тогда для вывода будет использован шаблон по умолчанию — default.tpl.
Используемые блоки шаблона
items
Выводит список страниц, отрисованных с помощью блока item.
%total%
Выводит количество найденных страниц.
%items%
Выводит список страниц, отрисованных с помощью блока item.
item
Отвечает за вывод отдельной страницы, полученной в результате работы макроса.
%id%
Выводит id страницы.
%link%
Выводит uri страницы.
%name%
Выводит имя страницы.
%alt-name%
Выводит имя страницы.
%domain%
Домен сайта, на котором находится страница.
%lang%
Префикс языковой версии, на которой находится страница.
empty
Выводится в том случае, если ничего найдено.
%request%
Выводит $name, который был передан в макрос.