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

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


person yan    schedule 27.11.2013    source источник
comment
Вы установили флажок "Отправить аргумент"?   -  person Bhavin Joshi    schedule 15.12.2013
comment
Спасибо за внимание. Я установил этот флажок на панели "Панели", да. И без второго аргумента представление работает нормально, что показывает, что аргумент фактически передается в представление через панели.   -  person yan    schedule 16.12.2013
comment
Итак, теперь ваш запрос решен?   -  person Bhavin Joshi    schedule 17.12.2013
comment
Нет, совсем нет. Я уже активировал ckeckbox, когда задал свой вопрос. Это то, что я хотел сказать своим последним комментарием.   -  person yan    schedule 17.12.2013
comment
Включено ли действие для первого аргумента таксономии, если аргумент не подтверждается ›Показать все результаты?   -  person TheodorosPloumis    schedule 30.12.2013
comment
Да, это возможно.   -  person yan    schedule 07.01.2014


Ответы (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'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, чтобы увидеть это. Этот метод позволяет вам делать всевозможные хитрые исключения, которые были бы невозможны с одними только представлениями. Очистите кеш после того, как вы поместите этот код в свой модуль.

person River Liver    schedule 03.01.2014
comment
(Извините, у меня возникли проблемы со входом.) Интересный подход! И делает то, что обещает. Большое спасибо. Хотя это не совсем ответ на мой вопрос, это действительно помогает. Я использовал его, включая идентификатор глубины. Я бы разместил это здесь, но ограничение на количество символов меня не позволяет. - person yan; 07.01.2014

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

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