モジュールがテーマを定義する場所を提供し、他のモジュール/テーマでオーバーライドできます。mymodule_preprocess_theme_name
また、最終的なテーマ関数またはテンプレートファイルに渡される変数を変更するなど、モジュールがフックを使用する機会も提供します。
テーマ関数を初期化するには、基本的に2つの方法があります。
theme('poll_results', array('raw_title' => 'title', 'results' => $results, etc...));
と
$build = array(
'#theme' => 'poll_results',
'#raw_title' => 'title',
'#results' => $results,
etc...
); // Note the '#' at the beginning of the argument name, this tells Drupal's `render` function that this is an argument, not a child element that needs to be rendered.
$content = render($build); // Exact equivalent of calling the previous example now that you have a render array.
次の理由から、theme()を直接(theme.incのドキュメントに従って)呼び出さないようにする必要があることに注意してください。
- キャッシングを回避します。
- アタッチされたアセットを含む、hook_element_info()で定義されたタイプのデフォルトを回避します
- pre_renderステージとpost_renderステージを回避します。
- JavaScriptの状態情報を回避します。
Drupal 8では、theme()はプライベート関数_theme()です。詳細については、www.drupal.org / node/2173655を参照してください。
これらの2つを上記の例の要素と比較すると、poll_results
おそらく何が起こっているのかを理解できます... PHPは強く型付けされた言語ではないため、Drupalはtheme
関数に渡されるキー配列のいずれかを介して「名前付き引数」を提供しています、またはレンダリング配列のハッシュキーとして。
'render element'に関する限り、これは基本的に、このテーマ関数が1つの名前付き引数(この場合form
)を使用してrender配列を使用して呼び出されることをテーマシステムに通知します。コードは次のようになります。
$build = array(
'#theme' => 'poll_choices',
'#form' => $form
);
$form
これにより、変数に含まれるものはすべて、唯一の引数としてテーマ関数に渡されます。
template
キーについて:
'poll_vote' => array(
'template' => 'poll-vote',
'render element' => 'form',
)
'poll-vote.tpl.php'という名前のpoll_vote
テンプレートファイル(したがってキー)を使用するというテーマを定義します(これは慣例によるものです)。template
そのテンプレートファイルへのパスは、それを実装するモジュールへのパス(例:modules / poll / poll-vote.tpl.php)を使用して検出されるため、メインモジュールフォルダーのサブフォルダーにテンプレートファイルを配置することは問題ありません。 。
テーマ関数の出力を実際に返すには、物理関数名(この場合はtheme_poll_vote
)を実装する方法と、テンプレートファイルを使用する方法の2つがあります。キーが空の場合、template
Drupalは物理関数を実装したと見なし、それを呼び出そうとします。
テーマ用に出力するHTMLがかなりある場合、またはPHP内で文字列にHTMLを記述したくない場合は、テンプレートファイルが適しています(個人的にはそうではありません)。ただし、どちらの場合でも、テーマを呼び出すときに渡される変数(theme()
上記のようにまたはレンダリング配列を使用)は、それ自体がテンプレートファイルまたはテーマ関数に渡されます。それで:
function theme_poll_results(&$vars) {
$raw_title = $vars['raw_title'];
$results = $vars['results'];
// etc...
}
同じメソッドの代わりにテンプレートファイルを使用している場合、Drupalはテンプレートファイルを解析する前に実行されるため、変数は$raw_title
、$results
などとして使用できます。extract
$vars
私がここで見逃したことはたくさんあると思いますが、もっと具体的な質問があれば、遠慮なく質問してください。私がお手伝いします。