【问题标题】:Using preprocess hook on specific node type in Drupal 8在 Drupal 8 中对特定节点类型使用预处理钩子
【发布时间】:2017-10-01 23:04:18
【问题描述】:

我已经成功使用了预处理页面挂钩,例如:

function mytheme_preprocess_page__node_front(&$variables) {
    ...
}

function mytheme_preprocess_page__node_12(&$variables) {
    ...
}

分别与名为 page--front.html.twig 和 page--12.html.twig 的自定义模板相关。

我正在尝试为名为 Video 的内容类型实现相同的钩子和模板配对。我知道不同之处在于我的示例是针对特定页面的自定义模板,而我的目标是针对整个内容类型的自定义模板,但是我得到了一个名为 node--video.html.twig 的自定义模板,它可以作为所有视频页面的模板。但是,当我尝试根据此模板名称编写挂钩时:

function mytheme_preprocess_node__video(&$variables) {
    ...
}

这不起作用。我认为我要么无法定义这样的钩子,要么我只是错误地命名它。我发现了一些与此有些相关的线程,例如this,这似乎暗示我需要为所有节点定义一个钩子,然后编写一个单独处理每种类型的 if 语句。 所以.......

最后一个问题:我可以为整个内容类型定义一个钩子吗?如果可以,我做错了什么?

【问题讨论】:

  • 通常template_preprocess_node__NODE_TYPEtemplate_preprocess_node__NODE_TYPE__VIEW_MODE现在应该可以正常工作了。因为我总是像那样使用特定的节点类型预处理钩子。

标签: drupal-8 drupal-hooks drupal-templates


【解决方案1】:

在预处理器中使用条件来获取节点类型,然后在其中执行您的逻辑,或者调用另一个函数。

function mytheme_preprocess_node(&$variables) {
  switch ($variables['node']->getType()) {
    case "video":
      // ...
    break;
    case "something_else":
      // ...
    break;
  }
}

理论上,您可以通过尝试调用名为 mytheme_preprocess_node__" . $variables['node']->getType() 的函数(如果存在)来模拟您尝试实现的目标,但如果没有明显的好处,那就太麻烦了。

【讨论】:

    【解决方案2】:

    在 zen 模板的 drupal 7 中,我曾经使用过这个通用解决方案。我认为它在 drupal 8 上仍然是一个可行的解决方案:

    function mytheme_preprocess_node(&$variables) {
      ...
      // Add global modification that works for all node type
      $function = __FUNCTION__ . '__' . $variables['node']->getType();
      // Each node type can have its own specific function
      if (function_exists($function)) {
        $function($variables, $hook);
      } 
      ...
    }
    

    您现在可以添加仅适用于您的节点类型的预处理功能。

    function mytheme_preprocess_node__video(&$variables) {
        ...
    }
    

    每个节点类型的预处理逻辑都有自己的功能,而不是一个大功能。更好的可维护性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多