Несколько контекстных фильтров с использованием операторов или


У меня есть таксономия, которая определяет разделы сайта. Один из терминов - "Глобальный". Что я делаю, так это создаю страницы с термином раздела сайта, а также создаю рекламные поля, в которых используется та же таксономия. По умолчанию "Глобальный" термин выбирается везде, где используется отношение термина.

Я хотел бы иметь представление блока с использованием контекстных фильтров. Я настроил его на использование одного фильтра, который является идентификатором термина из URL. Это отлично работает, но когда у меня есть страница в нем есть определенный раздел, но нет никаких связанных промо-коробок, я хотел бы загрузить "Глобальный" набор промо-коробок.

Есть ли способ создать несколько контекстных фильтров с использованием операторов or? По умолчанию они настраиваются как и операторы, которые не позволят мне загружать "Глобальные" плюс связанные со страницей. Я сортирую представление по весу таксономии и внизу у меня есть "Глобальный", поэтому, если я смогу получить контекстный фильтр или, я буду в бизнесе.

Знает ли кто-нибудь о модуль для этого или мне придется подключить представление с помощью hook_views_query_alter

 1
Author: Jepedo, 2012-05-09

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';  
    }
  }
}
 0
Author: Jepedo, 2012-06-20 17:21:29