モジュールのアクティブ化時にビュー テンプレートをロードする
-
11-09-2019 - |
質問
私はブロガーのようなアーカイブ機能を開発しました (ご存知のとおり、機能モジュールから)。.module ファイルを編集して、ビュー テンプレート (機能にバンドルされている) をテーマに自動的にロードしたいと考えています。それを行う方法はありますか?
解決
一般的なレベルでは:と思ったほうがいいよ」機能 = モジュール」とテーマを残します...テーマ!これは、機能にテンプレートを含めるべきではないという意味ではありませんが、含めるべきだということです。 作成したテンプレートが機能の一般的な用途に適しているか、または現在使用しているテーマに固有のものであるかを評価します. 。後者の場合は、テンプレート ファイルを機能とともにパッケージ化せず、代わりにテーマとともに残しておく必要があります。どのようにして ビューモジュール 私の言いたいことを理解してください。
[もしかしたら、あなたはすでにこのことに気づいていて、この点について考慮しているかもしれませんが、その場合は上記の内容を単に無視してください。あなたの文章が気になったので書こうと思いました 「tpl.php を実際に機能で使用できるようにしたいのですが (アクティブなテーマ フォルダーにあるかのように)」 一般用のテンプレートはテーマ フォルダーではなくモジュール フォルダー内に存在し、さらにビューにはすでに「一般用」テンプレートが提供されているので、私は驚きました。]
そうは言っても、通常、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 でのテンプレートの使用と同様に、機能をインストールするときに機能モジュールがテーマ キャッシュをすでに空にしているかどうかはわかりません (その場合は問題なく実行できるはずです)。そうでない場合は、次のコマンドを実行して手動でトリガーできます。 キャッシュクリアオール() インストールファイルから。キャッシュ全体を空にするのが多すぎる場合は、単一のビューに対して相対的にキャッシュをフラッシュする方法についてビュー モジュールを詳しく調べる必要があります。
お役に立てれば!
他のヒント
あなたの機能.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」の「テンプレート」フォルダに保存されたビューテンプレートを宣言するために私の抜粋です。
/**
* 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;
}
}
}
それは誰かがお役に立てば幸いです。