在哪里渲染?预处理还是模板?


8

我们正在不断提高编码性能,并且正在监控每个页面的加载情况,以优化网站的呈现时间。
在上面的声明中,我偶然发现了一个问题,我们应该在哪里渲染可渲染数组?

如果在预处理器中渲染它们,则模板将保持整洁,因为您仅打印变量。

预处理器:

function template_preprocess_node__faq(&$variables) {
    $node = node_load($variables['nid']);
    $node_style = node_view($node, $variables['view_mode']);

    $faq_sets = array(
      '#theme'  => 'my_module_faq_set',
      '#sets'   => $variables['field_faq_set'],
    );

    $variables['faq_image']   = render($node_style['field_faq_image']);
}

模板:

<div class="faq_image">
     <?php print $faq_image; ?>
</div>

但是,我不确定这是预处理和打印变量的正确/最快/最近的方法。

我猜Drupal并不是这个问题……在node.tpl.php呈现默认变量的同时,在其他默认模板(如html.php.php)中,变量只是被打印出来。

是否有人有规则和/或一些技巧和建议以最干净,最快的方式解决此问题?


2
这个问题比较主观。一般规则是,计算是在预处理功能中完成的,而渲染是在模板文件中完成的。目前尚不清楚为什么要使用node_view()渲染字段。字段不会在节点模板中以这种方式呈现。
kiamlaluno

谢谢(你的)信息。那么为什么在Drupal中渲染并在其中node.tpl.php打印html.tpl.php?您将如何解决这个node_view()问题?
米歇尔

Answers:


7

我猜Drupal并不是这个问题……在默认的node.tpl.php变量中,而在其他默认模板(如html.php.php)中,变量只是被打印出来。

那不是很正确。如果你看一下template_preprocess_html()你所看到的,没有什么是通过运行render()/ drupal_render()。所以很简单的html.tpl.php变量打印,而不是渲染,因为他们不做需要被渲染。所有的变量都已经是字符串,并且没有使用渲染数组来构建模板。

相反,node.tpl.php中的节点内容渲染数组。因此,必须渲染其中的任何部分,render()而不仅仅是打印。

我很想跟随核心render()在模板中而不是在预处理函数中使用的示例,除非您有特殊的理由要这样做。

从性能的角度来看,差异肯定可以忽略不计,但是在您的站点和硬件的上下文中对代码进行性能分析是确定的唯一方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.