モジュールのアクティブ化時にビュー テンプレートをロードする

StackOverflow https://stackoverflow.com/questions/1835457

  •  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;
    }
  }
}

それは誰かがお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top