【问题标题】:Filter a Drupal view (displayed in a panel) by taxonomy term depending on domain根据域按分类术语过滤 Drupal 视图(显示在面板中)
【发布时间】:2013-11-27 17:16:59
【问题描述】:

这是 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”)。

有什么想法可能是错的吗?我真的尝试了很多。

【问题讨论】:

  • 您是否启用了“发送参数”复选框?
  • 感谢您的关注。我在“面板”窗格中启用了该复选框,是的。如果没有第二个参数,视图可以正常工作,这表明参数实际上是通过 Panels 传递给视图的。
  • 那么,您的问题现在解决了吗?
  • 不,一点也不。当我问我的问题时,我已经激活了复选框。这就是我想在上一条评论中说的。
  • 对于第一个分类参数,您是否启用了“如果参数不验证要采取的操作 > 显示所有结果”?

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


【解决方案1】:

如果您有自定义模块,则可以使用 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 行以查看它。这种技术允许您执行各种单独使用 View 无法实现的棘手异常。将此代码放入模块后清除缓存。

【讨论】:

  • (对不起,我有登录问题。)有趣的方法!它确实做到了,它承诺要做的事情。非常感谢。尽管这并不是我问题的真正答案,但它确实有帮助。我使用它包括深度标识符。我会在这里发布,但字符限制不允许我。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多