カスタムモジュールでフィールドテンプレートをオーバーライドする


13

テーマにtplファイル(この場合はmedia-youtube-video.tpl.php)を追加する代わりに。カスタムモジュールからフィールドテンプレートをオーバーライドするにはどうすればよいですか?フィールドがビューで使用されるときを含む。

回答:


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() ここについて読むことができます

これはビューにも適しています。要約すると、オーバーライドする元のテーマ実装の正しい一意の名前を見つけ(通常はソースモジュールで定義)、プリプロセスフックを追加し、そこにオーバーライドの提案を追加するだけです。


カスタムモジュールには、適用するテンプレートを選択するための選択リストがあります。3つのtplファイルがあります。どうすればこれを行うことができます。
ファゼエラアブゾーラ

多くのノードタイプがある場合、ノードフォームのbodyフィールドをオーバーライドするにはどうすればよいですか?
スフジンダーシン

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-name-youroffield.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>

キャッシュをクリアした後、テーマ自体でオーバーライドされない限り、テーマはこのファイルされたテンプレートを使用します。つまり、テーマでこのテンプレートをオーバーライドできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.