繁体   English   中英

在Drupal 8中使用特定节点类型的预处理挂钩

[英]Using preprocess hook on specific node type in Drupal 8

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

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) {
    ...
}

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

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

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

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

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

在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) {
    ...
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM