Tplファイル(この場合はmedia-youtube-video.tpl.php)をテーマに追加する代わりに。カスタムモジュールからフィールドテンプレートをオーバーライドするにはどうすればよいですか?フィールドがビューで使用される場合を含みます。
これを行う簡単な方法があるはずだと確信していますが、これは私が通常行うことです。
1.RegisterDrupalテーマレジストリを使用したオーバーライドテーマ実装。したがって、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.Add元のテーマ実装の前処理フックとsuggestyourここで新しい実装。
_/*
* 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()
here について読むことができます。
これはビューにも当てはまります。要約すると、オーバーライドする元のテーマ実装の正しい一意の名前(通常はソースモジュールで定義)を見つけ、プリプロセスフックを追加して、そこにオーバーライドの提案を追加するだけです。
この方法で、モジュールの新しいテーマをデカールすることもできます:
/**
* 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 ?>: </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>
キャッシュをクリアした後、テーマ自体によってオーバーライドされない限り、テーマはこのファイルされたテンプレートを使用します。つまり、テーマでこのテンプレートをオーバーライドできます。