私はブロガーのようなアーカイブ機能を開発しました (機能モジュールから)。ビューテンプレート (機能にバンドルされています) をテーマに自動的にロードするために、.module ファイルを編集したいと考えています。それを行う方法はありますか?
3 に答える
一般的なレベルでは、「機能=モジュール」と考え、テーマを...テーマのままにしておく必要があります。これは、機能にテンプレートを含めるべきではないという意味ではありませんが、作成したテンプレートが機能の一般的な使用に適しているか、現在使用しているテーマに固有であるかを評価する必要があります。後者の場合は、テンプレートファイルに機能をパッケージ化するのではなく、テーマを残しておく必要があります。ビューモジュールがどのように機能するかを考えて、私が何を意味するのかを理解してください。
[多分あなたはすでにこれを知っていて、この点に関してあなたの考慮をしました、その場合、単に上記のものを無視してください。「tpl.phpを実際に機能で使用できるようにしたい(アクティブなテーマフォルダにあるかのように)」という文は、汎用テンプレートが存在しないため、私は驚いたので、それを書くことを考えました。テーマフォルダですが、そのモジュールには1つあり、さらにビューにはすでに「一般的な使用」テンプレートが用意されています。]
とは言うものの、通常、drupalに特定のテンプレートを使用するように指示する方法はhook_theme()
、モジュールに実装することです。この場合、ビューによって定義されたテンプレートをオーバーライドすることを考えると、hook_theme_registry_alter()
代わりに実装する必要があります。
誰かが実際にすでにそれをしました。リンク先のページのコードスニペットは次のとおりです。
function MYMODULE_theme_registry_alter(&$theme_registry) {
$my_path = drupal_get_path('module', 'MYMODULE');
$hooks = array('node'); // you can do this to any number of template theme hooks
// insert our module
foreach ($hooks as $h) {
_MYMODULE_insert_after_first_element($theme_registry[$h]['theme paths'], $my_path);
}
}
function _MYMODULE_insert_after_first_element(&$a, $element) {
$first_element = array_shift($a);
array_unshift($a, $first_element, $element);
}
もちろん、ノードではなく、ビューのテーマレジストリを変更する必要があります(元の例はCCKタイプを参照しています)。
views_uiでテンプレートを使用する場合と同様に、機能をインストールするときに機能モジュールがテーマキャッシュをすでに空にしているかどうかはわかりません(この場合は問題ありません)。そうでない場合は、インストールファイルからcache_clear_all()を呼び出すことにより、手動でトリガーできます。キャッシュ全体を空にするのが多すぎる場合は、単一のビューに対してキャッシュをフラッシュする方法について、ビューモジュールを詳しく調べる必要があります。
お役に立てれば!
これを機能の .module ファイルに追加してみてください
/**
* Implementation of hook_theme_registry_alter().
*/
function MYMODULE_theme_registry_alter(&$theme_registry) {
$theme_registry['theme paths']['views'] = drupal_get_path('module', 'MYMODULE');
}
.install ファイルでこれを使用します
/**
* Implementation of hook_enable().
*/
function MYMODULE_enable() {
drupal_rebuild_theme_registry();
}
「custom_module」の「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;
}
}
}
それが誰かを助けることを願っています。