Drupal 7 动态主题

发布于 2024-12-23 17:11:16 字数 1018 浏览 0 评论 0原文

我正在尝试开发一个模块,其输出的主题化方式与 Views 模块非常相似,但我似乎无法让它工作。我遵循使用主题层 (http://drupal.org/node/933976) 并搜索了 drupal 论坛,但没有结果。

主题钩子在 hook_theme 中定义为

'beerxml_hop' => array (
    'template' => 'beerxml-hop',
    'render element' => 'beerxml',
    'pattern' => 'beerxml_hop__',
    'path' => drupal_get_path('module', 'beerxml_formatter') . '/templates',
)

,我通过 in node--beer.tpl.php 调用主题钩子

print render($element);

(beer 是内容类型名称),其中 $element 是带有 #theme 的渲染数组

array(3) {
    [0] => string(19) "beerxml_hop__simcoe"
    [1] => string(11) "beerxml_hop"
    [2] => string(15) "beerxml_unknown"
}

被调用的模板是 beerxml_hop,而不是我所希望的 beerxml_hop__simcoebeerxml-hop--simcoe.tpl.phpbeerxml-unknown.tpl.php 都与 beerxml-hop.tpl.php< 位于同一目录中/code> 和 beerxml-unknown.tpl.php 在输出中的其他地方使用。

我缺少什么? :)

I'm trying to develop a module whose output is to be themable in a way very similar to that of the Views module, but I can't seem to get it to work. I've followed Using the Theme Layer (http://drupal.org/node/933976) and searched the drupal forums to no avail.

The theme hook is defined in hook_theme as

'beerxml_hop' => array (
    'template' => 'beerxml-hop',
    'render element' => 'beerxml',
    'pattern' => 'beerxml_hop__',
    'path' => drupal_get_path('module', 'beerxml_formatter') . '/templates',
)

And I invoke the theme hook by

print render($element);

in node--beer.tpl.php (beer is the content type name) where $element is a render array with #theme

array(3) {
    [0] => string(19) "beerxml_hop__simcoe"
    [1] => string(11) "beerxml_hop"
    [2] => string(15) "beerxml_unknown"
}

The template that gets invoked is beerxml_hop, and not beerxml_hop__simcoe as I would have hoped. Both beerxml-hop--simcoe.tpl.php and beerxml-unknown.tpl.php exists in the same directory as beerxml-hop.tpl.php and beerxml-unknown.tpl.php gets used elsewhere in the output.

What am I missing? :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

简美 2024-12-30 17:11:16

Drupal 不会搜索模块文件夹内具有动态部分的模板。您必须使用几行代码手动完成此操作:

/**
 * Implements hook_theme_registry_alter().
 */
function MY_MODULE_theme_registry_alter(&$registry) {
  $path = drupal_get_path('module', 'MY_MODULE') . '/subfolder/with/templates';
  $registry += drupal_find_theme_templates($registry, '.tpl.php', $path);
}

但是,此技巧有一些限制:

  • 您不能对模板使用单独的预处理,只会启动基本预处理。
  • 模板文件的扩展名是硬编码的。

Drupal is not searching for templates with dynamic part inside of the module folder. You have to do it manually with a few lines of code:

/**
 * Implements hook_theme_registry_alter().
 */
function MY_MODULE_theme_registry_alter(&$registry) {
  $path = drupal_get_path('module', 'MY_MODULE') . '/subfolder/with/templates';
  $registry += drupal_find_theme_templates($registry, '.tpl.php', $path);
}

However, this trick has some limitations:

  • You can't use separate preprocesses for templates, only the base preprocess will be launched.
  • Extension of template files is hard-coded.
烟火散人牵绊 2024-12-30 17:11:16

您的模式必须与您的第一个 $element['#theme'] 选项匹配

您可以尝试

'beerxml_hop' => array (
    'template' => 'beerxml-hop',
    'render element' => 'beerxml',
    'pattern' => 'beerxml_hop__[a-z]+',
    'path' => drupal_get_path('module', 'beerxml_formatter') . '/templates',
)

Your pattern must match your first $element['#theme'] option

You may try

'beerxml_hop' => array (
    'template' => 'beerxml-hop',
    'render element' => 'beerxml',
    'pattern' => 'beerxml_hop__[a-z]+',
    'path' => drupal_get_path('module', 'beerxml_formatter') . '/templates',
)
青衫负雪 2024-12-30 17:11:16

hook_theme_registry_alter 的实现是解决该问题的关键。

另一件非常重要的事情是避免在模板名称中使用“-”!

例如,这行不通:

'beerxml-hop' => array (
    'template' => 'beerxml-hop',
    'render element' => 'beerxml',
    'pattern' => 'beerxml-hop__',
    'path' => drupal_get_path('module', 'beerxml_formatter') . '/templates',
)

关键是(尽管在问题中):

  • 在主题挂钩名称('beerxml_hop')和模式('beerxml_hop__')中使用'_',
  • 但在'中使用'-' template' 参数 ('beerxml-hop') 和模板文件名 ('beerxml-hop--something.tpl.php')

'beerxml_hop' => array (
    'template' => 'beerxml-hop',
    'render element' => 'beerxml',
    'pattern' => 'beerxml_hop__',
    'path' => drupal_get_path('module', 'beerxml_formatter') . '/templates',
)

然后渲染 beerxml-hop--something.tpl.php 文件应该这样完成:

echo theme('beerxml-hop--something', array('n' => 10));

Implementation of hook_theme_registry_alter was key in solving the issue.

Another thing very important is to avoid using '-' in the template names !

For instance, this won't work:

'beerxml-hop' => array (
    'template' => 'beerxml-hop',
    'render element' => 'beerxml',
    'pattern' => 'beerxml-hop__',
    'path' => drupal_get_path('module', 'beerxml_formatter') . '/templates',
)

It is key (as is in the question though) to:

  • use '_' in the theme hook name ('beerxml_hop') and pattern ('beerxml_hop__')
  • but '-' in the 'template' argument ('beerxml-hop') and template filename ('beerxml-hop--something.tpl.php')

.

'beerxml_hop' => array (
    'template' => 'beerxml-hop',
    'render element' => 'beerxml',
    'pattern' => 'beerxml_hop__',
    'path' => drupal_get_path('module', 'beerxml_formatter') . '/templates',
)

Rendering the beerxml-hop--something.tpl.php file should then be done with:

echo theme('beerxml-hop--something', array('n' => 10));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文