Drupalはhook_theme()
を提供します。しかし、hook_theme_alter()はありますか?フックメニューエントリをオーバーライドする hook_menu_link_alter()
のようなものを探していますが、テーマについてです。カスタムテンプレートの1つを探す場所を指定できるように、ビューフックのテーマエントリを変更したいと思います。 Viewsインターフェイスを介して指定することに興味はありません。テーマフォルダー内のテーマテンプレートを探し、テンプレートを機能モジュールに追加したいからです。
hook_theme_registry_alter()
および _theme_process_registry()
が見つかりました。どちらを使用するのが最適で、その理由を答えてください。
ビューがテンプレートをモジュールからピックアップするようにするには、これらのキーのどれを変更する必要がありますか?
機能にviews-data-export-xml-header--richard-feeds-nokia-movies--views-data-export-1を配置すると、ビューはデフォルトでviews-data-export-xml-headerを選択します。 tpl.php。そのテンプレートをテーマレイヤーに配置すると、ビューはそれを取得します(レジストリのalterフックが配置されている場合でも)。
機能はhook_theme_registry_alter()
を実装する必要があります。あなたが説明するユースケースはまさにそのフックの目的です。 APIページにリンクされているサンプルコードから始めることができます。基本的な考え方は、views_theme()
がレジストリに挿入しているエントリに対応するエントリをターゲットにし、テンプレートを変更して機能内のものと一致させることです。
これは、カスタムモジュールのtemplateフォルダーに格納されているビューテンプレートを宣言するために使用するコードです。
/**
* Implements hook_theme_registry_alter().
*/
function custom_module_theme_registry_alter(&$theme_registry) {
$extension = '.tpl.php';
$module_path = drupal_get_path('module', 'custom_module');
$files = file_scan_directory($module_path . '/templates', '/' . preg_quote($extension) . '$/');
foreach ($files as $file) {
$template = drupal_basename($file->filename, $extension);
$theme = str_replace('-', '_', $template);
list($base_theme, $specific) = explode('__', $theme, 2);
// Don't override base theme.
if (!empty($specific) && isset($theme_registry[$base_theme])) {
$theme_info = array(
'template' => $template,
'path' => drupal_dirname($file->uri),
'variables' => $theme_registry[$base_theme]['variables'],
'base hook' => $base_theme,
// Other available value: theme_engine.
'type' => 'module',
'theme path' => $module_path,
);
$theme_registry[$theme] = $theme_info;
}
}
}
新しいテーマを追加するのではなく、既存のテーマをオーバーライドして簡単にフォークできるようにする必要があります。それが誰かを助けることを願っています。