Di mana harus merender? Preprocess atau templat?

8

Kami terus meningkatkan kinerja pengkodean kami dan kami memantau setiap pemuatan halaman untuk mengoptimalkan pemuatan dan waktu rendering di situs web kami.
Di atas pernyataan dalam pikiran, saya menemukan pertanyaan di mana kita harus membuat array yang dapat diulang?

Jika Anda membuatnya di preprocessor Anda, templat tetap cukup rapi karena Anda hanya mencetak variabel.

Preprosesor:

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']);
}

Templat:

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

Namun, saya tidak yakin ini adalah cara yang tepat / tercepat / tertata rapi untuk preprocess dan mencetak variabel.

Drupal tidak terdiri dalam hal ini, saya kira ... Dalam node.tpl.phpvariabel default diberikan sementara dalam template default lainnya (seperti html.php.php), variabel hanya dicetak.

Apakah ada yang punya aturan dan / atau beberapa tips dan saran tentang cara mengatasi masalah ini dengan cara yang paling bersih dan tercepat?

Michiel
sumber
2
Pertanyaan ini agak subyektif. Aturan umum adalah bahwa komputasi dilakukan dalam fungsi preprocess dan rendering dalam file templat. Tidak jelas mengapa Anda menggunakan node_view()untuk membuat bidang; bidang tidak dirender seperti itu di templat simpul.
kiamlaluno
Terimakasih atas infonya. Lalu mengapa Drupal merender dalam node.tpl.phpdan mencetak html.tpl.php? Bagaimana Anda mengatasi node_view()masalah ini?
Michiel

Jawaban:

7

Drupal tidak terdiri dalam hal ini, saya kira ... Dalam variabel default node.tpl.php diberikan sementara di templat default lainnya (seperti html.php.php), variabel hanya dicetak.

Itu tidak benar. Jika Anda melihat template_preprocess_html()Anda dapat melihat bahwa tidak ada yang dijalankan melalui render()/ drupal_render(). Jadi sederhananya variabel dalam html.tpl.php dicetak daripada dirender karena tidak perlu dirender. Semua vars sudah berupa string, dan tidak ada render array yang digunakan untuk membangun template.

Sebaliknya, konten simpul di node.tpl.php adalah array render. Jadi setiap bagian yang perlu dirender harus dijalankan render()dan tidak hanya dicetak.

Saya akan tergoda untuk mengikuti contoh inti tentang penggunaan render()dalam templat, bukan pada fungsi preproses, kecuali jika Anda memiliki alasan khusus untuk melakukannya secara berbeda.

Dari sudut pandang kinerja perbedaan pasti akan diabaikan, tetapi profiling kode dalam konteks situs Anda dan perangkat keras adalah satu-satunya cara untuk memastikan.

Clive
sumber