プログラムによるテーマ提案の追加


8

ビューとコンテンツタイプのみを含む機能モジュールを作成しました。

現在、page-node-x.tpl.php私のviews-view-y.tpl.phpファイルは私のテーマディレクトリにあります。

それらを私の機能モジュールに移動することは可能ですか?

回答:


5

変数を変更することにより、新しいテンプレートファイルを実装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()ページがビューに関連付けられているかどうかを関数が理解できるようにする方法が必要です。


3

「テンプレートファイル」キーを追加するソリューション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',
  ),
 );
}

2

テーマレジストリは、Drupalが使用するテンプレートファイル、テーマ関数などに関するあらゆる種類の情報を格納する場所です。物事はデフォルトのように機能しないため、それをいじると、後でWTFの瞬間につながる可能性があります。

とにかくすべてのdrupalのように、フックがありhook_theme_registry_alterます。テーマレジストリを変更して、テンプレートファイルをモジュールに移動するために使用できます。サイトの管理がより複雑になるため、これを行うことはお勧めしません。しかし、あなたがやりたいのであれば、これがそのやり方です。


+1-私はこれを試しましたが、成功しませんでした。例を挙げていただけますか?
jantimon 2011

@Ghommey:提供されているリンクにはサンプルコードが付属していますが、それをよりよく説明する方法はわかりません。
googletorp

2

ビューには理論的にはビューテンプレートのメカニズムがあります(おそらくすべてのテンプレートで機能します)。

カスタムモジュールのhook_views_api実装でキー「テンプレートパス」を設定できます。

このビューを取得すると、指定したディレクトリでテンプレートファイルをスキャンします。悲しいことに、simpletestは現在失敗しているため、この機能はおそらくdrupal7にまだ移植されていませんが、誰かがそれに参加したい場合は、views.moduleの_views_find_module_templates()を参照してください。


2

最も簡単な方法は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');
}

theme()実装を見るtheme pathと、配列のようには見えません。これで問題ありませんか?api.drupal.org/api/drupal/includes%21theme.inc/function/theme/7を
Capi Etheriel

上記の私のコメントについて:theme pathsDrupal 6で動作するように使用されましたが、Drupal 7はdrupal.org/node/678714でその動作を変更 しましたそのモジュールのhook_themeで、しかしそれを行う方法は読者への演習として残されています:/
Capi Etheriel

1

コンテキストリアクションテーマを使用して少し抽象化されたアプローチはどうですか?

http://drupal.org/project/context_reaction_theme

機能でコンテキストをラップすると、エクスポートも可能です。しかし、おそらくこれは実際にはDrupalの第一人者の質問であり、より深い何かを作成し、経路を知ることを目指しています。


D7モジュールはなく、最後のコミットは半年前でした。
ジャンティモン、2011年

それでも私のDrupal 6サイトでうまく機能します:)
doublejosh

1

は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');
}

これにより、Drupalは強制的にモジュールフォルダー内のテンプレートを使用します。テーマはそれをオーバーライドすることはできません(そうする必要があります)。
jcisio

1

@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);
}

私は受け入れられた答えとこの解決策の両方を試しましたが、後者はこれまでのところうまくいきます!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.