首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Drupal 8中对特定节点类型使用预处理钩子

在Drupal 8中对特定节点类型使用预处理钩子
EN

Stack Overflow用户
提问于 2017-05-03 23:22:55
回答 2查看 23.4K关注 0票数 6

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

代码语言:javascript
复制
function mytheme_preprocess_page__node_front(&$variables) {
    ...
}

代码语言:javascript
复制
function mytheme_preprocess_page__node_12(&$variables) {
    ...
}

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

我正在尝试为一个叫做视频的内容类型实现相同的钩子和模板配对。我理解其中的不同之处在于,我的示例是针对特定页面的自定义模板,而我的目标是为整个内容类型定制模板,但我得到了一个名为节点- video .html.twig的自定义模板,作为所有视频页面的模板。但是,当我试图根据这个模板名编写一个钩子时:

代码语言:javascript
复制
function mytheme_preprocess_node__video(&$variables) {
    ...
}

这不管用。我认为我要么不能定义这样的钩子,要么我只是命名错误。我发现了一些与此有关的线程,比如,这些线程似乎意味着我需要为所有节点定义一个钩子,然后编写一个if语句,它分别处理每种类型。所以..。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-04 10:40:48

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

代码语言:javascript
复制
function mytheme_preprocess_node(&$variables) {
  switch ($variables['node']->getType()) {
    case "video":
      // ...
    break;
    case "something_else":
      // ...
    break;
  }
}

理论上,您可以通过尝试调用一个名为mytheme_preprocess_node__" . $variables['node']->getType()的函数(如果它存在的话)来模仿您想要达到的效果,但是如果没有明显的好处,您就会大惊小怪。

票数 13
EN

Stack Overflow用户

发布于 2018-02-28 10:52:43

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

代码语言:javascript
复制
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);
  } 
  ...
}

然后,您现在可以添加只适用于节点类型的预处理函数。

代码语言:javascript
复制
function mytheme_preprocess_node__video(&$variables) {
    ...
}

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43771500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档