Con*_*art 3 drupal-templates drupal-hooks drupal-8
我已成功使用预处理页面挂钩,例如:
function mytheme_preprocess_page__node_front(&$variables) {
...
}
Run Code Online (Sandbox Code Playgroud)
和
function mytheme_preprocess_page__node_12(&$variables) {
...
}
Run Code Online (Sandbox Code Playgroud)
它与分别名为page - front.html.twig和page - 12.html.twig的自定义模板相关联.
我正在尝试为名为Video的内容类型实现相同的挂钩和模板配对.我的理解是,我的示例是针对特定页面的自定义模板,而我的目标是整个内容类型的自定义模板,但我得到了一个名为node的自定义模板 - video.html.twig可用作所有视频页面的模板.但是,当我尝试根据此模板名称编写一个钩子时:
function mytheme_preprocess_node__video(&$variables) {
...
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.我认为我要么不能定义这样的钩子,要么我只是错误地命名它.我找到了一些与此相关的线程,例如这似乎意味着我需要为所有节点定义一个钩子,然后编写一个if语句来分别处理每个类型.所以.......
最后的问题:我可以为整个内容类型定义一个钩子,如果是这样,我做错了什么?
小智 7
在预处理器中使用条件来获取节点类型,然后在其中执行逻辑,或调用另一个函数.
function mytheme_preprocess_node(&$variables) {
switch ($variables['node']->getType()) {
case "video":
// ...
break;
case "something_else":
// ...
break;
}
}
Run Code Online (Sandbox Code Playgroud)
理论上,你可以通过尝试调用一个名为(mytheme_preprocess_node__" . $variables['node']->getType()
如果它存在的)函数来模拟你想要实现的内容,但是如果没有明显的好处则会过于大惊小怪.
在 drupal 7 from zen 模板中,我曾经使用这个通用解决方案。我认为这在 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);
}
...
}
Run Code Online (Sandbox Code Playgroud)
然后,您现在可以添加仅适用于您的节点类型的预处理函数。
function mytheme_preprocess_node__video(&$variables) {
...
}
Run Code Online (Sandbox Code Playgroud)
每种节点类型的预处理逻辑都有其自己的功能,而不是具有一个大功能。对于可维护性来说更好。