在模块中覆盖node.tpl.php


8

我创建了一个模块,该模块应该能够显示某种内容类型的内容。该显示有点复杂,为了能够将其关闭并将所有内容分组在一起,我为此创建了一个模块。

但是最后,它应该只是使用自定义的.tpl.php文件覆盖普通的node.tpl.php。当我将文件放在模板文件夹中时,它会被拾取,页面按预期显示,但是当文件在模块文件夹中时,我无法使它工作。

我阅读了很多有关regsiter .tpl文件和预处理的内容,但没有任何内容可以组合我所需的内容。

这就是我到目前为止

function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node--app' => array(
            'template' =>  drupal_get_path('module', 'app') . '/node--app',
            'variables' => array('node' => (object)array())
        )
    );
    return $items;
}

function apps_preprocess_node(&$vars) {
    $variables['theme_hook_suggestions'][] = 'node__app';
}

1
我可能对此有所呼吁,但以我的看法(不是这样),一个模块不应该关心节点在显示时的外观,它所关心的只是将数据传递给主题,然后该主题显示部分。现在,如果您希望模块创建一个显示在节点中的自定义对象,那就是另一回事了,那么您可以为此创建一个模板。但是,如果您想缩短该步骤,则将node.tpl.php放入主题目录是唯一的“正确”方法。
Jimajamma 2011年

如果有人希望在Drupal 6中专门执行此操作,请查看以下答案:stackoverflow.com/a/6153043/1154642
bryanbraun

Answers:


3

在您的问题中尚不清楚您是将模板放置在中sites/all/custom/modules,还是sites/all/custom/modules/the_name_of_mymodule。一定要晚一些。

但是,如果您:

  • 将模板放在正确的位置。
  • 访问了admin/appearance强制主题注册表刷新的路径。
  • 清除所有高速缓存。

...但仍然没有骰子,您始终可以在hook_theme()实现中指定theme_path密钥:

<?php
function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node_app' => array(
            // Don't specify the path in the template name.
            // Unless you have your template inside a directory within this module.
            'template' =>  'node--app',
            'variables' => array('node' => (object)array()),
            // If you want to put the tpl in another location, you can use this key.
            'theme path' => drupal_get_path('module', 'another_module'),
        ),
    );
    return $items;
}

仍然无法正常工作,我是否需要theme_hook_suggestions还是应该自行挑选模板?“ App”是内容类型,“ Apps”是模块名称
dazz

也许您遇到的问题是主题函数的名称node--app。更好的名称是node_app,您可以通过执行“ theme('node_app', [$vars]);我不确定theme('node--app')是否是我见过的东西” 来调用主题功能,并且几乎可以确定它不会起作用。
业余咖啡师,2012年

另外,由于提供了$ path变量,因此您不必执行drupal_get_path()舞蹈。$ path是实现hook_theme的模块的位置,在本例中为模块apps。
业余咖啡师,2012年

1
主题名称必须为'node__app'(双下划线),而不是'node_app'
Junaid 2013年

3

以为我会发布我发现的解决方案:

function MYMODULE_theme($existing, $type, $theme, $path) {
  return array(
    'node__NODETYPE' => array(
      'render element' => 'content',
      'base hook' => 'node',
      'template' => 'node--NODETYPE',
      'path' => drupal_get_path('module', 'MYMODULE') . '/templates',
    ),
  );
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.