Отфильтровать представление Drupal (отображается в панели) по таксономическому термину в зависимости от домена
Это проблема с представлениями 6.x-2.x: на сайте со многими различными представлениями (многие из которых являются блоками, включенными в панели, передающие аргументы блокам). Я хотел бы фильтровать представления по таксономическому термину в зависимости от домен, на который сайт посещен. Эта фильтрация должна быть дополнительной для первого аргумента (термин таксономии).
Сайт настроен для работы с разными доменами, например example1.com и example2.com. Я хочу "подключить" эти домены к терминам таксономии 45 и 115.
Итак, например:
example1.com/my_view/1
Должен показать все узлы, которые имеют термин 1 и термин 45.
example2.com/my_view/1
Должны отображать все узлы, которые имеют термин 1 и термин 115.
Мой подход состоял в том, чтобы добавить второй аргумент (первый - это аргумент ID термина таксономии по умолчанию). В качестве аргумента по умолчанию я использую следующий отредактированный код обработки аргументов:
<?php
// Get domain.
$host = preg_match('/[^.]+\.[^.]+$/', $_SERVER['HTTP_HOST'], $hit);
$host = $hit[0];
// Select taxonomy term.
if ($host == 'example1.com'){
$taxonomy = '45';
} elseif ($host == 'example2.com'){
$taxonomy = '115';
}
return $taxonomy;
?>
Это работает, когда я использую отображение страницы с пути my_view/% (что делает только первый аргумент обязательным). Но когда я использую его в панели, я просто получаю пустой вид (если выбран "контекст" ), или второй аргумент не имеет никакого эффекта (если выбрано "term id of first/all term" ).
Любые идеи, что может быть неправильным? Я действительно много пробовал.
Ответы
Ответ 1
Как я узнал здесь, представления игнорируют второй аргумент, если первый отсутствует. Поэтому установка следующего аргумента по умолчанию для первого таксономического аргумента решает проблему, хотя это скорее обходное решение, чем реальное решение:
if (arg(0) != 'taxonomy') {
return 'all';
} else {
return arg(2);
}
Ответ 2
Если у вас есть настраиваемый модуль, вы можете использовать hook_views_query_alter. Вы в основном выбираете предложение "where", которое почти делает то, что вы хотите, и переопределяете его своими пользовательскими критериями.
function [custom module name]_views_query_alter(&$view, &$query) {
// pick out the right View by its name
if($view->name == "[your View machine name]"){
// drupal_set_message(print_r($query->where, 1)); // Uncomment to see "where" array
// Get domain.
$host = preg_match('/[^.]+\.[^.]+$/', $_SERVER['HTTP_HOST'], $hit);
$host = $hit[0];
// Change the taxonomy term dependent on host
if ($host == 'example1.com'){
$query->where[0]['clauses'][2] = "(term_node_value_1.tid = 45)";
} elseif ($host == 'example2.com'){
$query->where[0]['clauses'][2] = "(term_node_value_1.tid = 115)";
}
}
}
Вам нужно будет изучить объект $query, чтобы определить, какое условие переопределить, и имена задействованных переменных - раскомментируйте строку drupal_set_message, чтобы увидеть ее. Этот метод позволяет вам делать всевозможные хитроумные исключения, которые не были бы возможны только с помощью Views. Очистите свой кеш после того, как вы поместите этот код в свой модуль.