1

私はブロガーのようなアーカイブ機能を開発しました (機能モジュールから)。ビューテンプレート (機能にバンドルされています) をテーマに自動的にロードするために、.module ファイルを編集したいと考えています。それを行う方法はありますか?

4

3 に答える 3

1

一般的なレベルでは、「機能=モジュール」と考え、テーマを...テーマのままにしておく必要があります。これは、機能にテンプレートを含めるべきではないという意味ではありませんが、作成したテンプレートが機能の一般的な使用に適しているか、現在使用しているテーマに固有であるかを評価する必要があります。後者の場合は、テンプレートファイルに機能をパッケージ化するのではなく、テーマを残しておく必要があります。ビューモジュールがどのように機能するかを考えて、私が何を意味するのかを理解してください。

[多分あなたはすでにこれを知っていて、この点に関してあなたの考慮をしました、その場合、単に上記のものを無視してください。「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()を呼び出すことにより、手動でトリガーできます。キャッシュ全体を空にするのが多すぎる場合は、単一のビューに対してキャッシュをフラッシュする方法について、ビューモジュールを詳しく調べる必要があります。

お役に立てれば!

于 2009-12-08T14:40:16.657 に答える
1

これを機能の .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();
}
于 2010-01-19T23:43:57.513 に答える
0

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

それが誰かを助けることを願っています。

于 2015-01-27T10:26:26.657 に答える