ビューとコンテンツタイプのみを含む機能モジュールを作成しました。
今私のpage-node-x.tpl.php
と私 views-view-y.tpl.php
ファイルは私のテーマディレクトリにあります。
それらを私の機能モジュールに移動することは可能ですか?
私は googletorpの答え から始めて、一般的な関数を作成しました:
/**
* Overrides a third-party template file with a local copy.
*
* To be called from hook_theme_registry_alter():
* @code
* function mymodule_theme_registry_alter(&$theme_registry) {
* // Override variant of foo template using local copy.
* custom_override_template($theme_registry, 'foo--variant', drupal_get_path('module', 'mymodule') . '/templates');
* }
* @endcode
*
* @param array $theme_registry
* Theme registry array as passed to hook_theme_registry_alter().
* @param string $template
* Name of template file without '.tpl.php' extension. Example: 'foo--variant'.
* @param string $path
* Directory to load $template from.
* @param string $preprocess_function
* Optional preprocess function.
*/
function custom_override_template(&$theme_registry, $template, $path, $preprocess_function = NULL) {
if (strpos($template, '--') !== FALSE) {
$hook_name = array_shift(explode('--', $template));
}
else {
$hook_name = $template;
}
$hook_name = str_replace('-', '_', $hook_name);
if (isset($theme_registry[$hook_name])) {
// Copy hook info.
$hook_info = $theme_registry[$hook_name];
$hook_info['path'] = $path;
$hook_info['template'] = $template;
// Add to theme registry.
$new_hook = str_replace('-', '_', $template);
$theme_registry[$new_hook] = $hook_info;
// Add preprocess function.
if(!is_null($preprocess_function)){
$theme_registry[$new_hook]['preprocess functions'][] = $preprocess_function;
}
return $new_hook;
}
else {
throw new Exception(t('Unknown theme hook %hook.', array('%hook' => $hook_name)));
}
}
ノードとビューのtplファイルの位置と名前を上書きするだけでなく、ビューに前処理機能を提供することもできます。
したがって、mymodule
と呼ばれる独自のモジュールと、テンプレートファイルを含むsites/all/modules/mymodule/templates/foo--variant.tpl.php
独自のテンプレートディレクトリを使用するようにテーマレジストリを簡単に変更できるようになりました。
function mymodule_theme_registry_alter(&$theme_registry) {
// Override variant of foo template using local copy.
custom_override_template($theme_registry, 'foo--variant', drupal_get_path('module', 'mymodule') . '/templates');
}
hook_preprocess_page()
またはhook_preprocess_node()
を実装するモジュールは、変数_$variables['theme_hook_suggestions']
_を変更して、新しいテンプレートファイルを提案できます。
その変数を初期化する template_preprocess_page() に含まれるコードは次のとおりです。
_// Populate the page template suggestions.
if ($suggestions = theme_get_suggestions(arg(), 'page')) {
$variables['theme_hook_suggestions'] = $suggestions;
}
_
各テーマの提案は、 hook_theme() によって返されるエントリと一致する必要があります。
ビューでは、同様の方法で使用する同等の前処理関数、またはページがビューに関連付けられているかどうかを関数が理解できるhook_preprocess_page()
を可能にする方法が必要です。
「テンプレートファイル」キーをhook_views_api()
に追加するソリューションは、Drupal 7ではまだ機能しないようです。ただし、これは魅力のように機能します。
/**
* Implements hook_theme().
*/
function bigtexas_theme() {
return array(
'views_view_fields__slideshow' => array(
'variables' => array('view' => NULL, 'options' => NULL, 'row' => NULL),
'template' => 'views-view-fields--slideshow',
'base hook' => 'views_view_fields',
'path' => drupal_get_path('module', 'bigtexas') . '/theme',
),
);
}
ビューには、理論的にはビューテンプレートのメカニズムがあります(おそらくすべてのテンプレートで機能します)。
カスタムモジュールのhook_views_api実装でキー「テンプレートパス」を設定できます。
このビューを取得すると、指定したディレクトリでテンプレートファイルをスキャンします。悲しいことに、simpletestは現在失敗しています。そのため、この機能はおそらくdrupal7にまだ移植されていませんが、誰かがそれに参加したい場合は、views.moduleの_views_find_module_templates()を参照してください。
テーマレジストリは、Drupalに、使用するテンプレートファイル、テーマ関数などに関するあらゆる種類の情報を格納します。デフォルトのように機能しないため、これをいじると、WTFの瞬間につながる可能性があります。
とにかくすべてのdrupalのように、フックがあります: hook_theme_registry_alter
テーマレジストリの変更に使用でき、これによりテンプレートファイルがモジュールに移動します。これを行うと、サイトの管理がより複雑になるため、お勧めしません。しかし、あなたがやりたいのであれば、これがそのやり方です。
最も簡単な方法は、hook_theme_registry_alter()
を使用して、モジュールのパスをテーマのパスに追加することです。
function mymodule_theme_registry_alter(&$theme_registry) {
$theme_registry['[theme hook name, ie. page or views-view]']['theme paths'][] = drupal_get_path('module', 'mymodule');
}
@jcsioが言ったように、このページで受け入れられた回答は機能しますが、テンプレートをテーマでオーバーライドすることはできません。
http://www.metachunk.com/blog/adding-module-path-drupal-7-theme-registry は、モジュール(およびサブフォルダー)のパスを追加できるソリューションを提供します)あらゆる種類の.tpl.phpファイルをスキャンします。
Drupal 7.では使用されないように見える「テーマパス」変数が含まれていたため、少し変更しました。
/**
* Implements hook_theme_registry_alter()
**/
function mymodule_theme_registry_alter(&$theme_registry) {
$mod_path = drupal_get_path('module', 'mymodule');
$theme_registry_copy = $theme_registry; // munge on a copy
_theme_process_registry($theme_registry_copy, 'phptemplate', 'theme_engine', 'pow', $mod_path);
$theme_registry += array_diff_key($theme_registry_copy, $theme_registry);
}
私は受け入れられた答えとこの解決策の両方を試しましたが、後者はこれまでのところうまくいきます!
コンテキストリアクションテーマを使用して少し抽象化されたアプローチはどうですか?
http://drupal.org/project/context_reaction_theme
機能でコンテキストをラップすると、エクスポートも可能です。しかし、おそらくこれは実際にDrupalグルの質問であり、より深いものを作成し、ルートを知ることを目指しています。