Фильтрация представления Drupal (отображается на панели) по термину таксономии в зависимости от домена

Это проблема Views 6.x-2.x: на сайте с множеством различных представлений (многие из которых являются блоками, включенными в панели, которые передают аргументы блокам), я хотел бы отфильтровать представления по термину таксономии в зависимости от домена сайт посещен через. Эта фильтрация должна быть дополнительной к первому аргументу (термин таксономии).

Сайт настроен для работы с разными доменами, скажем, example1.com и example2.com. Я хочу "подключить" эти домены к терминам таксономии 45 и 115.

Так, например:

example1.com/my_view/1 Должен показать все узлы, которые имеют термин 1 и термин 45.

example2.com/my_view/1 Должен показать все узлы, которые имеют термин 1 и термин 115.

Мой подход состоял в том, чтобы добавить второй аргумент (первый - аргумент идентификатора термина таксономии по умолчанию). В качестве аргумента по умолчанию я использую следующий фрагмент кода обработки аргументов:

<?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/% (делая обязательным только первый аргумент). Но когда я использую его на панели, я просто получаю пустое представление (если выбран "без контекста"), или второй аргумент не имеет никакого эффекта (если выбран "идентификатор срока первого / всего термина").

Есть идеи, что может быть не так? Я действительно много пробовал.

2 ответа

Решение

Как я выяснил здесь, views игнорируют второй аргумент, если первый отсутствует. Поэтому установка следующего аргумента по умолчанию для первого аргумента таксономии решает проблему, хотя это скорее обходной путь, чем реальное решение:

if (arg(0) != 'taxonomy') {
  return 'all';
} else {
  return arg(2);
}

Если у вас есть собственный модуль, вы можете использовать hook_views_query_alter. Вы в основном выбираете предложение "где", которое почти выполняет то, что вам нужно, и переопределяете его по вашим пользовательским критериям.

function [custom module name]_views_query_alter(&$view, &$query) {
  // pick out the right View by its name
  if($view->name == "[your View's 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. Очистите кеш после того, как вы поместите этот код в свой модуль.

Другие вопросы по тегам