私は同様の問題を抱えていたので、Googleがこのページに連れて行ったのはなぜですか:ノードのプリプロセス関数が非常に大きく成長しているため、関数を複数のファイルに分割したいです。
すべてのalter関数を含むtemplate.phpファイルで同様のアプローチを既に実行しましたが、ここでは同じメソッドが完全に機能するため、アプローチを共有すると思いました。
フォルダー内のファイル設定MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
既にnode.preprocess.inc
作成されている必要があります。それらを実際に呼び出す方法はかなりarbitrary意的ですが、それらを適切に識別し、drupalネーミングシステム全体に適合する名前を付ける方がよいでしょう。
これらのファイルのコンテンツに進んでください!
node.preprocess.inc
、ここで私はこのようなことをしています:
<?php
function MYTHEME_preprocess_node(&$variables) {
switch($variables['type']) {
case 'blog_post':
// if the type of the node is a Blog Post, include this:
include 'node--blog-post.preprocess.inc';
break;
case 'device_variation':
// if Device Variation, include this:
include 'node--device-variation.preprocess.inc';
break;
case 'foo':
// ...
break;
}
// additional stuff for all nodes
}
基本的に現在のノードのタイプを切り替えます。切り替えるのはあなた次第です。#id
、#view_mode
、すべてのあなたの正確なニーズに応じました。
一致が見つかると、指定されたファイルをロードし、この関数内で記述されているかのようにその内容を処理します。
これらのincluded
ファイルの内容はnode.preprocess.inc
、前処理関数を再度呼び出さないことを除いて、ファイルに配置した場合とまったく同じです。
node--device-variation.preprocess.inc
<?php
// Device Name
$device = drupal_clean_css_identifier(strtolower($variables['title']));
// Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
$deviceHasVariations = true;
if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
$deviceHasVariations = false;
}
//...
あなたがしたいとさえ複数のスイッチをカスケード接続すると、あなたは基本的には、たとえば、など多くのファイルとに応じて、特定のノードの前処理ファイルをバックアップし、さらに分割を行うことができます#view_mode
いずれかのファイルを持つ、full
ビューモードとのために別のものをteaser
誰かがこの質問に再びつまずいたら、これが役立つことを願っています(:
foo_preprocess_node
実装することで「自動化」することもできますcall_user_func('_preprocess_' . $vars['type'], $vars);
が、おそらくシンプルに保つことが最善です。