web-dev-qa-db-ja.com

自分のテンプレートにテーマプリプロセッサ関数を使用するにはどうすればよいですか?

ノード、CCKフィールド、およびビューテーマ用の複数の.tpl.phpファイルがあります。これらのテンプレートファイルには、物事を移動したり、リンクを削除したり、新しいリンクを作成したりするための多くのロジックが含まれています。これは、「Drupal Way.

私が正しく理解している場合、「Drupal Way」は、template.phpファイルでプリプロセッサ関数を使用して変数を操作し、新しい変数を追加することです。それに関するいくつかの質問:

  • 特定のテーマのプリプロセッサ関数を作成するための命名規則はありますか?たとえば、content-field-field_transmission_make_model.tplというCCKフィールドテンプレートがある場合、プリプロセッサ関数にどのように名前を付けますか?
  • ノードテンプレート、CCKフィールドテンプレート、およびビューテンプレートにテンプレートプリプロセッサ関数を使用できますか?テンプレート変数を変更したり、新しい変数を追加したりするさまざまな方法がありますか?
36
jergason

一般的な概要については、 前処理関数内の変数の操作に関する説明を読んでください


命名規則に関しては、これは通常非常に単純ですが、現在の例にはキャッチがあります(以下を参照)。

前処理関数のシグネチャは

[yourModuleName|yourThemeName]_preprocess_[themeFunctionName](&$variables)

そのため、テーマtemplate.phpファイル内のページテンプレートに1つ実装すると、

themeName_preprocess_page(&$variables)

ほとんどの場合、テーマ関数の名前は* .tpl.phpファイルの名前になり、.tpl.phpの終わりはなく、ハイフンの代わりにアンダースコアが付きます。 ただし、 テンプレートの提案 に基づいてテンプレートファイルが選択されると、catchがあります。追加の提案ではなく、ベース名に対して実装されています! (代替テンプレートファイルの提案は、プリプロセス関数自体に追加されます。)

_content-field-field_transmission_make_model.tpl.php_はそのような提案であり、ベース名は_content-field.tpl.php_であり、対応するテーマ関数は_content_field_であるため、現在の例はそのようなケースの1つです。したがって、yourThemeName_preprocess_content_field(&$variables)という名前のプリプロセス関数を実装し、その中で$ variables配列の利用可能なエントリを調べて、完全に異なるCCKではなく 'field_transmission_make_model'が実際に呼び出されるかどうかを確認する必要があります。フィールド、例:

_function yourThemeName_preprocess_content_field(&$variables) {
  // Are we called for the right field?
  if ('field_transmission_make_model' == $variables['field_name']) {
    // Yes, add/manipulate entries within the variables array
    $variables['new_entry'] = 'A useless new variable';
    $variables['label'] = 'A useless change of the existing label variable';
  }
}
_

(注:テストされていないコード、タイプミスに注意してください)

この後、テンプレートファイルで使用可能な新しい変数_$new_entry_があり、_$label_変数の内容が変更されているはずです($ variables配列内のすべてのトップレベルエントリは個別になります)テンプレートファイルの変数。配列インデックスに基づいて名前が付けられます)。


2番目の質問については、前処理関数の基本的な使用法はすべてのテンプレートファイルで同じですが、注意してください。

  • プリプロセス関数は、*。tpl.phpファイルを使用するテーマ呼び出しでのみ使用可能です。テーマ関数ではnot
  • $ variables配列の内容は、テーマに応じて大きく異なります
  • 他のモジュールもプリプロセス関数を実装する可能性があり、それらは次々に呼び出されるため、別のモジュールによって追加されたものを変更したい場合は、実装がその後呼び出された場合にのみ行うことができますテーマ内の実装はモジュール内のすべての実装の後に呼び出されるため、あなたの場合の問題-一度に多くの実装がある可能性があることに言及したいだけです)
56
Henrik Opel

前処理関数の名前を特定するには、出力がどのテンプレートファイルまたはテーマ関数であるかを知る必要があります。これを行うには、- テーマ開発者 module

これを詳細に説明するビデオがあります- http://buildamodule.com/video/drupal-theming-essentials-template-files-theme-function-overrides-and-preprocessing-functions-how-to- use-simple-preprocessing-functions

2
amitgoyal