[решено] Может-ли Views в Contextual filters брать аргумент не из алиаса, а из системного пути?

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

Аватар пользователя petrovnn petrovnn 4 мая 2012 в 11:13

То есть если я нахожусь на странице термина, в алиасе урла у меня нет ID этого термина, допустим:

/goroda/moscow

а мне соответственно нужно узнать ID из системного пути этого термина, тобишь

/taxonomy/term/3

Views такое может вообще? Может какой плагин к нему нужно докрутить? В гугле не нашел.

Представление в виде блока, не страница

Комментарии

Аватар пользователя petrovnn petrovnn 4 мая 2012 в 12:07

Пардон, блок нужно отображать не на странице ноды, а на странице термина.

Contextual filters вообще работают для блоков?

Когда я нахожусь на странице термина, блок views отображает результаты будто аргумент не задан. В свою очередь если а админке views там где Preview with contextual filters ввести ID термина, все фильтруется как надо.

Что меня смущает. Если я делаю представление views в виде страницы, то системный УРЛ в таком случае насколько я знаю совпадает с тем урлом который отображается в браузере. Однако на странице термина у нас системный и отображаемый урл (алиас) отличаются. Если-бы у меня небыло алиасов...

Аватар пользователя Chalk Chalk 14 июня 2012 в 12:33

petrovnn, у Drupal'a есть функция arg() для таких вещей.

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

Пришлось немного погуглить и разобраться с Contextual filters во Views. Вот собственно более подробное описание решения проблемы.

  • Создаем блок во Views, в Contextual filters выбираем Content: Has taxonomy term ID;
  • Там где "When the filter value is NOT available", выбираем "Provide default value" -> "PHP Code";
  • Вбиваем в поле одну строчку кода "return arg(2);".

Вуаля, и все работает! Функция arg() берет значение из url'a. Т.к у меня блок будет отображаться только на страницах терминов таксономии (url имеет вид taxonomy/term/ID), то значит ID термина - это третий параметр. Поэтому и пише arg(2).

Надеюсь, кому-нибудь пригодится Smile

Аватар пользователя drupby drupby 14 июня 2012 в 12:47

"Chalk" wrote:
Создаем блок во Views, в Contextual filters выбираем Content: Has taxonomy term ID;
Там где "When the filter value is NOT available", выбираем "Provide default value" -> "PHP Code";
Вбиваем в поле одну строчку кода "return arg(2);".

"Provide default value" ->Raw value from URL
выбираем нужный аргумент

Аватар пользователя petrovnn petrovnn 14 июня 2012 в 15:55

Сейчас зашел в ту вьюху в которой я это делал. И почему-то там был такой код:

$path = $_GET['q'];
$path = explode('/', $path);
if(isset($path[2])){
   return $path[2];
} else {
   return $path[1];
}

Зачем там IF хоть убей не пойму. Уже не помню. Да, скорее всего будет работать функция arg(), я тупо скопипастил кусок кода из ЖЖ.

Но сделал все-же так как сказал drupby это действительно рабочее решение, тем более мне никогда не нравилась идея хранени ПХП в базе.

Проект сложный, им не занимался уже месяц, поэтому забыл зачем там IF, но пока исчезновения функционала не заметил.