11

これはビュー 6.x-2.x の問題です: 多くの異なるビュー (その多くはブロックに引数を渡すパネルに含まれるブロック) を持つサイトで、ドメインに応じて分類用語でビューをフィルタリングしたいと考えています。経由でサイトにアクセスします。このフィルタリングは、最初の引数 (分類用語) に追加する必要があります。

このサイトは異なるドメイン (example1.com と example2.com など) で動作するように構成されています。これらのドメインを分類用語 45 および 115 に「接続」したいと考えています。

たとえば、次のようになります。

example1.com/my_view/1 用語 1 と用語 45 を持つすべてのノードを表示する必要があります。

example2.com/my_view/1 用語 1 と用語 115 を持つすべてのノードを表示する必要があります。

私のアプローチは、2 番目の引数を追加することでした (最初の引数は、デフォルトの分類用語 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/% でページ表示を使用するときに機能します (最初の引数のみを必須にします)。しかし、パネルで使用すると、空のビューが表示されるか (「コンテキストなし」が選択されている場合)、2 番目の引数は効果がありません (「最初/すべての用語の用語 ID」が選択されている場合)。

何が間違っている可能性がありますか?本当にいろいろ試しました。

4

2 に答える 2

2

hereでわかったように、最初の引数が存在しない場合、views は 2 番目の引数を無視します。したがって、最初の分類法引数に次のデフォルト引数を設定すると、問題は解決しますが、実際の解決策というよりは回避策になります。

if (arg(0) != 'taxonomy') {
  return 'all';
} else {
  return arg(2);
}
于 2014-05-31T10:08:59.417 に答える
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 行のコメントを外します。この手法を使用すると、ビューだけでは不可能なあらゆる種類のトリッキーな例外を実行できます。このコードをモジュールに入れたら、キャッシュをクリアしてください。

于 2014-01-03T19:42:31.063 に答える