Вывод материалов содержащих термин таксономии с помощью Views, когда в качестве аргумента задается синоним (алиас) термина таксономии.
Потратил некоторое время на поиски решения, но явного ответа не нашел.
Поделюсь, может кому-то пригодится.
Имеем термин таксономии:
имя термина – “Масштабные модели”
синоним URL, созданный Pathauto – ”masshtabnie-modeli”
системный путь – “taxonomy/term/10”
Есть представление для вывода материалов, содержащих термин таксономии. Путь представления /mv.
В представлении есть контекстный фильтр “Содержимое: Имеет идентификатор термина таксономии (с глубиной)”.
По умолчанию критерий проверки аргумента стоит “Термин таксономии”.
Если в качестве значения фильтра указать “ID термина”, то нужные материалы выводятся по адресу:
mysite.com/mv/10
Если в качестве значения фильтра указать “Название термина”, то нужные материалы выводятся по адресу:
mysite.com/mv/масштабные%20модели
А хотелось бы, что бы материалы выводились по адресу:
mysite.com/mv/masshtabnie-modeli
Проблема в том, что в D7 отсутствует проверка аргумента ”Термин таксономии” по синониму (алиасу).
Решение подсказал этот топик http://www.drupal.ru/node/26975.
Выбираем в качестве критерия проверки ”PHP-код”. И прописываем, собственно, код для проверки:
<?php
// ищем системный путь для синонима термина
//
$url = drupal_lookup_path('source', $argument);
if ($url != false)
{
// если путь найден, проверяем, что это путь к термину таксономии
//
$term_base_path = 'taxonomy/term/';
if (strncmp($term_base_path, $url, strlen($term_base_path)) == 0)
{
// вырезаем префикс 'taxonomy/term/', оставшееся значение преобразуем в число
// и заменяем аргумент вьюса на полученный ID термина таксономии
//
$handler->argument = intval(str_replace($term_base_path, '', $url));
}
}
return TRUE;
?>
Цель достигнута. Материалы выводятся по адресу mysite.com/mv/masshtabnie-modeli
Не пинайте, если это прописные истины. Как бы только начал осваивать Drupal.
Комментарии
Молодец!Очень нужный сниппет!!!
Спасибо, попробую применить, с первого раза что-то не получилось.
И так и не хочет работать…
всё намного проще. просто указывай системный путь для термина (для Д7):
taxonomy/term/%tid%
Все работает. Там же русским языком написано Do not use <?php ?>. ))
Автору спасибо.
Гигантский поклон автору за решение, послужило толчком в нужную сторону. А дотолкался я до того, что ещё и множественные значения alias реализовал, вроде бы в оригинале не работало. Итак, для интересующихся - решение:
Всё стандартно: делаем фильтр по термину таксономии, разумеется отмечаем Allow multiple values, критерий проверки - PHP код, вставляем туда код, как он работает должно быть понятно из комментариев
<?php
//получаем id для alias
//для множественных значений надо разбить массив аргументов
//тут забавно - в предпросмотре этот массив подаётся разделенный плюсом '+',
//а непосредственно на странице вьюхи - пробелом. Мы разрезаем его по пробелу, так что в предпросмотре фильтр не работает!
$tagsAliases = explode(' ', $argument);
//Флаг если всё пошло нормально. Потом мы это значением вовзратим. Если будут ошибки - поставим false
$ifOK = true;
//Результирующая строка, содержащая либо один tid, либо tid+tid+tid+...
$tagsResult = ''; //Перебираем массив с alias терминов. Для каждого alias получаем id и проверяем, является ли этот id термином таксономии
//При малейшем отхождении - расстрел. То есть флаг в false поставим
foreach($tagsAliases as $tagsAlias) {
$url = drupal_lookup_path('source', 'tags/'.$tagsAlias);
if ($url != false) {
$term_base_path = 'taxonomy/term/';
// если путь найден, проверяем, что это путь к термину таксономии
if (strncmp($term_base_path, $url, strlen($term_base_path)) == 0) {
//если уже есть TID в резалте - добавляем плюсик
if ($tagsResult!='') $tagsResult.='+';
// вырезаем префикс 'taxonomy/term/', оставшееся значение преобразуем в число
// и добавляем полученный TID в резалт
$tagsResult .= intval(str_replace($term_base_path, '', $url));
}
//если не удалось найти id для alias} else {
$ifOK = false;
}
} //если всё ок - изменяем значение аргумента вьюхи и возвращаем тру
if ($ifOK) { $handler->argument = $tagsResult; }
return $ifOK;
?>
Прошу обратить внимание на один момент: в предпросмотре на странице настроек вьюхи в переменной $argument у нас содержится строка вида "alias1+alias2+alias3", то есть все синонимы, разделенные плюсом. А непосредственно на странице вьюхи это дело волшебным образом преобразуется в "alias1 alias2 alias3", т.е. плюс меняется на пробел.
Отсюда нюанс - PHP код корректно работает либо в предпросмотре, либо на странице. Я как-то подумал и оставил второй вариант Учтите это при проверке работоспособности.
Абсолютно ничего не получается. Ребята, кто пользуется данным решением, выложите пожалуйста скрин настроек аргуменов. Никак не могу разобраться, как выводить синонимы во Views.
Разобрался, работает! Огромное спасибо автору! Но не смог я запустите это решение по следующим причинам. Путь у меня состоял из shops/%/articles соответственно заработало после добавления следующей строчки:
$alias = 'shops/' . $argument;
и поменял первую строчку источника кода:
вместо
$url = drupal_lookup_path('source', $argument);
прописал
$url = drupal_lookup_path('source', $alias);