Несколько контекстных фильтров с использованием операторов или
У меня есть таксономия, которая определяет разделы сайта. Один из терминов - "Глобальный". Что я делаю, так это создаю страницы с термином раздела сайта, а также создаю рекламные поля, в которых используется та же таксономия. По умолчанию "Глобальный" термин выбирается везде, где используется отношение термина.
Я хотел бы иметь представление блока с использованием контекстных фильтров. Я настроил его на использование одного фильтра, который является идентификатором термина из URL. Это отлично работает, но когда у меня есть страница в нем есть определенный раздел, но нет никаких связанных промо-коробок, я хотел бы загрузить "Глобальный" набор промо-коробок.
Есть ли способ создать несколько контекстных фильтров с использованием операторов or? По умолчанию они настраиваются как и операторы, которые не позволят мне загружать "Глобальные" плюс связанные со страницей. Я сортирую представление по весу таксономии и внизу у меня есть "Глобальный", поэтому, если я смогу получить контекстный фильтр или, я буду в бизнесе.
Знает ли кто-нибудь о модуль для этого или мне придется подключить представление с помощью hook_views_query_alter
1 answers
На случай, если кто-то захочет знать, я смог сделать это с помощью некоторых крючков просмотра и поделюсь своим решением.
Сначала вам нужно зарегистрироваться, чтобы просмотреть информацию об api
/**
* Implements hook_views_api().
*/
function mymodule_views_api() {
return array(
'api' => 3,
);
}
Затем вам нужно изменить представление при предварительной сборке, чтобы включить термин "Глобальный". Я использую запрос сущности, чтобы определить, есть ли какой-либо контент с глобальным термином. Если это так, я добавляю этот термин в качестве аргумента.
/**
* Implements hook_views_pre_build().
*/
function mymodule_views_pre_build(&$view) {
// we were getting no results if the tid of the Global term was not 1
// in some build instances it is not so we need to ensure that the default
// value being passed is the actual tid of the Global term.
if (($view->name == 'badge' || $view->name == 'promo_box' || $view->name == 'article'|| $view->name == 'tips') && $view->current_display == 'block') {
$vocabulary = taxonomy_vocabulary_machine_name_load('site_section');
$entityQuery = new EntityFieldQuery;
$entityQuery->entityCondition('entity_type', 'taxonomy_term')
->propertyCondition('name', 'Global')
->propertyCondition('vid', $vocabulary->vid)
->range(0 ,1);
$result = $entityQuery->execute();
if ($result) {
$term = array_slice($result['taxonomy_term'], 0);
$view->argument['tid_1']->options['default_argument_options']['argument'] = $term[0]->tid;
}
}
}
И, наконец, вам нужно переключить оператор where на и или
/**
* Implements hook_views_query_alter().
*/
function mymodule_views_query_alter(&$view, &$query) {
// Let's find out if we are attempting to load either the badge or promo box
// view. If so we need to alter the where clause to include an or statement
// in the conditional filter to also look for the global term in the site secttion
// taxonomy. I was not able to find a way to create an OR condition filter via a
// module so for now this is the best to do it.
if (($view->name == 'badge' || $view->name == 'promo_box' || $view->name == 'article'|| $view->name == 'tips') && $view->current_display == 'block') {
if (isset($query->where[0]) && isset($query->where[1])) {
$query->where[0]['type'] = 'OR';
}
}
}