在 Drupal 7 中使用活动上下文

Context 是一个 Drupal 模块,允许您设置在满足特定条件时触发的反应。这可能是在加载特定路径时,或者在查看特定内容类型页面时,甚至是在站点上的每个页面上。当满足条件时,可以触发许多反应,包括放置块、设置面包屑或仅向页面模板添加类。

我在我的项目中广泛使用 Context 模块,因为它们提供了比默认的 Drupal 块管理页面更好的控制块放置的方法。最重要的区别之一是 Context 允许将同一个块放置在站点上的两个不同区域中,这是 Drupal 无法开箱即用的。更重要的是,上下文是可导出的并完全集成到功能中。这意味着我可以在我的开发环境中设置一组上下文并将它们打包成一个功能,然后我可以将其部署到实时站点,而不必手动设置块的位置。

我经常发现自己想让 Drupal 对我已经设置为 Context 但 Context 没有反应的东西做出反应。与其直接与 Context API 集成并创建一个反应插件,我通常只会检测到 Context 已被激活并采取相应的行动。这是为了做一些事情,比如改变主题模板建议或调整某些组件上的类,因此不需要创建反应插件。为特定情况设置上下文通常也更容易,而无需编写大量代码来检测它。Context 中的所有检测机制都经过充分测试并且正常运行,因此几乎没有重复功能。

要在您的代码中使用现有的上下文,您需要调用该函数context_active_contexts()。从中您将获得已为该页面激活的上下文数组。此数组的键是活动上下文的机器名称,因此快速检查数组键可以显示您感兴趣的上下文是否处于活动状态。从这里你可以做任何你需要做的事情。

以下示例抓取活动上下文并查看“新闻”上下文是否处于活动状态。如果是,则使用页面--news.tpl.php模板来呈现页面。有问题的 Context 不仅仅检查这里的内容类型,它还查看一系列以不同方式显示新闻的新闻视图。

function MYTHEME_preprocess_page(&$vars) {
  $active_contexts = context_active_contexts();
  if (in_array('news', array_keys($active_contexts))) {  
    $vars['theme_hook_suggestions'] = array('page__news');
  }
}

为了在不使用 Context 的情况下实现相同的效果,将需要以下代码。这种检测页面当前内容的方式(在我看来)理解起来稍微复杂一些。此外,由于 Context 已经完成了检测正确页面的所有工作,因此我们在这里主要重复该功能。

function MYTHEME_preprocess_page(&$vars) {
  if ((isset($vars['node']) && $vars['node']->type == 'news')
    || (isset($vars['view']) && $vars['view']->id == 'news')
  ) {  
    $vars['theme_hook_suggestions'] = array('page__news');
  }
}