36

ノード、CCKフィールド、およびビューのテーマ用の.tpl.phpファイルがいくつかあります。これらのテンプレートファイルには、物事を移動したり、リンクを削除したり、新しいリンクを作成したりするための多くのロジックが含まれています。これは悪い開発であり、「DrupalWay」ではないことを理解しています。

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

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

2 に答える 2

56

一般的な概要については、前処理関数内の変数の操作について読む必要があります。


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

前処理関数の署名が必要です

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

そのため、テーマの template.php ファイル内でページ テンプレート用に 1 つ実装すると、次のようになります。

themeName_preprocess_page(&$variables)

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

現在の例は、そのcontent-field-field_transmission_make_model.tpl.phpような提案と同様に、ベース名がcontent-field.tpl.phpであり、対応するテーマ関数が であるケースの 1 つですcontent_field。したがって、という名前の前処理関数を実装し、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 ファイルを使用するテーマ呼び出しでのみ使用できます
  • $variables 配列の内容は、何をテーマにするかによって大きく異なります。
  • 他のモジュールも前処理関数を実装している可能性があり、それらは次々と呼び出されるため、別のモジュールによって追加されたものを変更したい場合は、実装がその後に呼び出された場合にのみ変更できます (これは no になります)。あなたの場合の問題、テーマ内の実装はモジュール内のすべての実装の後に呼び出されるため、一度に多くの実装が存在する可能性があることに言及したかっただけです)
于 2010-03-05T15:23:15.573 に答える
2

前処理関数の名前を決めるには、出力の元になるテンプレート ファイルまたはテーマ関数を知る必要があります。これを行う優れた方法の 1 つは、テーマ開発者モジュールを使用することです。

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

于 2013-01-21T09:42:57.140 に答える