web-dev-qa-db-ja.com

別のモジュールからデフォルトのビューテンプレートを上書きするにはどうすればよいですか?

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フックが配置されている場合でも)。

6
amateur barista

機能はhook_theme_registry_alter()を実装する必要があります。あなたが説明するユースケースはまさにそのフックの目的です。 APIページにリンクされているサンプルコードから始めることができます。基本的な考え方は、views_theme()がレジストリに挿入しているエントリに対応するエントリをターゲットにし、テンプレートを変更して機能内のものと一致させることです。

13
jhedstrom

これは、カスタムモジュールの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;
    }
  }
}

新しいテーマを追加するのではなく、既存のテーマをオーバーライドして簡単にフォークできるようにする必要があります。それが誰かを助けることを願っています。

1
Sebastien M.