使用自定义模块覆盖字段模板


13

而不是将tpl文件(在这种情况下为media-youtube-video.tpl.php)添加到主题。如何覆盖自定义模块中的字段模板?包括在视图中使用字段的时间。

Answers:


12

我确信必须有一种更简单的方法来做到这一点,但这是我通常要做的:

1. 在Drupal主题注册表中注册一个主要的主题实现。因此,在mymod_theme()中添加一个新项目。variables密钥必须与media_youtube_video主题的密钥匹配,即

/**
 * Implements hook_theme().
 */
function mymod_theme() {
  return array(
    'my_media_youtube_video' => array(
      'variables' => array('uri' => NULL, ...), // see media_youtube_theme() for this
      // bundle the template file with the module itself
      // i.e. theme/my-media-youtube-video.tpl.php
      'template' => 'my-media-youtube-video',
      'path' => drupal_get_path('module', 'mymod') . '/theme
    )
  );
}

2. 为原始主题实现添加一个预处理挂钩,并在此处建议您的新实现。

/*
 * Implements hook_preprocess_media_youtube_video().
 *
 * Or more generally, hook_preprocess_THEME().
 */
function mymod_preprocess_media_youtube_video(&$variables) {
  // If your overriding implementation is not a template but 
  // is implemented in a different file, 
  // then remember to include the file explicitly at this point..
  $variables['theme_hook_suggestions'][] = 'my_media_youtube_video';
}

主题系统以LIFO方式评估建议。您可以在此处了解更多信息。

假设您知道另一个模块也正在使用与该模块相同的方法来覆盖实现,那么您可以实现hook_module_implements_alter()并强制将您的hook_preprocess_THEME()(参见上文)调用为最后一个。您可以在hook_module_implements_alter() 这里阅读。

这也适用于Views。总之,您只需要找出要覆盖的原始主题实现的正确唯一名称(通常在源模块中定义),添加一个预处理钩子,然后在此处添加您的覆盖建议。


在我的自定义模块中,我有一个选择列表,用于选择要应用的模板。我有3个tpl文件。所以我该怎么做。
Fazeela Abu Zohra 2015年

如果节点类型很多,如何覆盖节点形式的主体字段?
Sukhjinder Singh

3

您还可以通过以下方式在模块中贴花新主题:

/**
* Implements hook_theme().
*/
function yourmodule_theme($existing, $type, $theme, $path) {
  $theme = array();

  $theme['field__field_nameofyourfield'] = array(
    'render element' => 'content',
    'base hook' => 'field',
    'template' => 'field--field-nameofyourfield',
    'path' => drupal_get_path('module', 'yourmodule') . '/templates',
  );

  return $theme;
}

然后放入一个/ template目录文件,其中包含如下所示的字段模板(标准)并将其命名为field--field-nameofyourfield.tpl.php:

<div class="<?php print $classes; ?>"<?php print $attributes; ?>>
  <?php if (!$label_hidden): ?>
    <div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>:&nbsp;</div>
  <?php endif; ?>
  <div class="field-items"<?php print $content_attributes; ?>>
    <?php foreach ($items as $delta => $item): ?>
      <div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>><?php print render($item); ?></div>
    <?php endforeach; ?>
  </div>
</div>

清除缓存后,您的主题将使用此归档模板,除非主题本身未覆盖它,这意味着您仍然可以在主题中覆盖此模板。

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.