这是一个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>
任何想法都可能出错?我真的尝试了很多。
答案 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);
}