我只有一个类似的问题,这就是Google为什么将我带到此页面的原因:我的节点预处理功能变得非常大,以至于我宁愿将该功能拆分为多个文件。
我已经在template.php文件中完成了类似的方法,该文件包含了所有的alter函数,并且由于相同的方法在这里可以很好地工作,所以我想我应该分享一下我的方法:
文件夹内的文件设置MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
您应该已经拥有node.preprocess.inc
,您可以创建自己的其他人。您如何称呼它们确实是很随意的,但最好给它们起一个能很好地识别它们并适合整个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);
以避免重复ifs,但最好还是保持简单。