[РЕШЕНО] Синоним термина таксономии как аргумент Views D7

Главные вкладки

Аватар пользователя WhiteMan WhiteMan 19 октября 2012 в 4:20

Вывод материалов содержащих термин таксономии с помощью 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.

Комментарии

Аватар пользователя pindzak pindzak 13 августа 2014 в 15:10

Гигантский поклон автору за решение, послужило толчком в нужную сторону. А дотолкался я до того, что ещё и множественные значения alias реализовал, вроде бы в оригинале не работало. Итак, для интересующихся - решение:

Всё стандартно: делаем фильтр по термину таксономии, разумеется отмечаем Allow multiple values, критерий проверки - PHP код, вставляем туда код, как он работает должно быть понятно из комментариев

<?php
//для множественных значений надо разбить массив аргументов
//тут забавно - в предпросмотре этот массив подаётся разделенный плюсом '+', 
//а непосредственно на странице вьюхи - пробелом. Мы разрезаем его по пробелу, так что в предпросмотре фильтр не работает!
$tagsAliases explode(' '$argument); 
//Флаг если всё пошло нормально. Потом мы это значением вовзратим. Если будут ошибки - поставим false
$ifOK true
//Результирующая строка, содержащая либо один tid, либо tid+tid+tid+...
$tagsResult '';

//Перебираем массив с alias терминов. Для каждого alias получаем id и проверяем, является ли этот id термином таксономии
//При малейшем отхождении - расстрел. То есть флаг в false поставим
foreach($tagsAliases as $tagsAlias) {

    

//получаем id для alias
    
$url drupal_lookup_path('source''tags/'.$tagsAlias);
    
    if (
$url != false) {
        
        
$term_base_path 'taxonomy/term/';
        
        
// если путь найден, проверяем, что это путь к термину таксономии
        
if (strncmp($term_base_path$urlstrlen($term_base_path)) == 0) {
            
//если уже есть TID в резалте - добавляем плюсик
            
if ($tagsResult!=''$tagsResult.='+';
            
            
// вырезаем префикс 'taxonomy/term/', оставшееся значение преобразуем в число
            // и добавляем полученный TID в резалт
            
$tagsResult .= intval(str_replace($term_base_path''$url));

        }
    } else { 

//если не удалось найти id для alias
        
$ifOK false;
    }
}

//если всё ок - изменяем значение аргумента вьюхи и возвращаем тру
if ($ifOK) { $handler->argument $tagsResult; } 
return 
$ifOK;
?>

Прошу обратить внимание на один момент: в предпросмотре на странице настроек вьюхи в переменной $argument у нас содержится строка вида "alias1+alias2+alias3", то есть все синонимы, разделенные плюсом. А непосредственно на странице вьюхи это дело волшебным образом преобразуется в "alias1 alias2 alias3", т.е. плюс меняется на пробел.
Отсюда нюанс - PHP код корректно работает либо в предпросмотре, либо на странице. Я как-то подумал и оставил второй вариант Smile Учтите это при проверке работоспособности.

Аватар пользователя hypnoser hypnoser 27 апреля 2015 в 12:39

Абсолютно ничего не получается. Ребята, кто пользуется данным решением, выложите пожалуйста скрин настроек аргуменов. Никак не могу разобраться, как выводить синонимы во Views.

Аватар пользователя hypnoser hypnoser 29 апреля 2015 в 9:47

Разобрался, работает! Огромное спасибо автору! Но не смог я запустите это решение по следующим причинам. Путь у меня состоял из shops/%/articles соответственно заработало после добавления следующей строчки:

$alias = 'shops/' . $argument;

и поменял первую строчку источника кода:

вместо

$url = drupal_lookup_path('source', $argument);

прописал

$url = drupal_lookup_path('source', $alias);