我如何在我的模块drupal 7中包含一个tpl文件

时间:2011-11-23 12:45:50

标签: drupal-7

我正在使用hook_preprocess_node()构建模块 我使用hook_entity_info_alter()

为名为'vacancy_teaser'的节点实体创建了一个新的视图模式

这显示在我的节点显示设置和视图

因此,当使用此视图模式时,我想使用模块中包含的模板。

我的代码:

/**
* Implements hook_preprocess_node().
*/
function vacancies_preprocess_node(&$vars) {
  if($vars['view_mode'] == 'vacancy_teaser') {
    $vars['theme_hook_suggestions'][] = 'node_vacancy_teaser';
  }
} 

我的模板文件名为:'node-vacancy-teaser.tpl.php',但未在我的视图输出中使用 视图中为$vars['view_mode'] == 'vacancy_teaser'。 (已测试)

但是$vars['theme_hook_suggestions'][] = 'node_vacancy_teaser';在哪里寻找模板文件?不知怎的,它没有被包含/使用。

显然在drupal 7中出于某种原因需要使用dubble下划线。 放置在活动模板文件夹中的node_ vacatures _vacancy_teaser.tpl.php似乎可以解决问题...虽然我不认为这是一个简洁的解决方案,因为tpl.php文件与模块分离

2 个答案:

答案 0 :(得分:7)

确保在hook_theme实现中指定模板文件。 examples project非常适合查找如何执行此类操作的详细信息。具体来说,请查看theming_example_theme() function ...

中的theming_example module
function theming_example_theme() {
  return array(
    // …
    'theming_example_text_form'  => array(
      'render element' => 'form',
      // In this one the rendering will be done by a tpl.php file instead of
      // being rendered by a function, so we specify a template.
      'template' => 'theming-example-text-form',
    ),
  );
}

答案 1 :(得分:0)

不要追加到$vars['theme_hook_suggestions']数组的末尾,而是尝试:

array_unshift($vars['theme_hook_suggestions'], 'node_vacancy_teaser');

这会将你的建议传递到数组的前面,它将首先被找到。很可能因为你将它附加到数组的末尾,Drupal首先找到一个现有的主题建议并改为使用它(例如node.tpl.php)。