根据域,按分类术语筛选Drupal视图(在面板中显示)

时间:2013-11-27 17:17:00

标签: drupal drupal-6 drupal-views drupal-panels

这是一个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的节点。

我的方法是添加第二个参数(第一个是默认的分类术语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 /%的页面显示时(仅强制第一个参数),这是有效的。但是当我在面板中使用它时,我只得到一个空视图(如果选择“无上下文”)或第二个参数没有任何效果(如果选择“第一个/所有术语的术语ID”)。 / p>

任何想法都可能出错?我真的尝试了很多。

2 个答案:

答案 0 :(得分: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行以查看它。这种技术允许您执行各种棘手的异常,而这些异常是仅使用Views无法实现的。将此代码放入模块后清除缓存。

答案 1 :(得分:1)

当我发现here时,如果第一个参数不存在,则视图会忽略第二个参数。因此,为第一个分类法参数设置以下默认参数可以解决问题,尽管它更像是一种解决方法,而不是一个真正的解决方案:

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