Kết xuất ở đâu? Tiền xử lý hay mẫu?


8

Chúng tôi liên tục cải thiện hiệu suất mã hóa của mình và chúng tôi đang theo dõi mọi tải trang để tối ưu hóa thời gian tải en trong trang web của chúng tôi.
Trên đây, tôi vấp phải câu hỏi chúng ta nên kết xuất các mảng có thể kết xuất ở đâu?

Nếu bạn kết xuất chúng trong bộ xử lý trước, mẫu sẽ giữ gọn gàng vì bạn chỉ in các biến.

Tiền xử lý:

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

Bản mẫu:

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

Tuy nhiên, tôi không chắc đây là cách thích hợp / nhanh nhất / gọn gàng nhất để tiền xử lý và in các biến.

Drupal không bao gồm trong vấn đề này hoặc tôi đoán ... Trong các node.tpl.phpbiến mặc định được hiển thị trong khi trong các mẫu mặc định khác (như html.php.php), các biến chỉ được in.

Có ai có một quy tắc và / hoặc một số lời khuyên và lời khuyên về cách giải quyết vấn đề này một cách nhanh nhất và sạch nhất không?


2
Câu hỏi này khá chủ quan. Nguyên tắc chung là tính toán được thực hiện trong chức năng tiền xử lý và kết xuất trong tệp mẫu. Không rõ tại sao bạn lại sử dụng node_view()để kết xuất một trường; các trường không được kết xuất theo cách đó trong một mẫu nút.
kiamlaluno

Cảm ơn bạn về thông tin. Vậy thì tại sao Drupal render trong node.tpl.phpvà in html.tpl.php? Làm thế nào bạn sẽ giải quyết node_view()vấn đề?
Michiel

Câu trả lời:


7

Tôi đoán Drupal không bao gồm vấn đề này ... Trong các biến node.tpl.php mặc định được hiển thị trong khi trong các mẫu mặc định khác (như html.php.php), các biến chỉ được in.

Điều đó không hoàn toàn đúng. Nếu bạn nhìn vào template_preprocess_html()bạn có thể thấy rằng không có gì được chạy qua render()/ drupal_render(). Vì vậy, khá đơn giản là các biến trong html.tpl.php được in chứ không phải được hiển thị vì chúng không cần phải được hiển thị. Tất cả các vars đã là chuỗi và không có mảng kết xuất nào được sử dụng để xây dựng mẫu.

Ngược lại, nội dung nút trong node.tpl.php một mảng kết xuất. Vì vậy, bất kỳ phần nào của nó cần được hiển thị phải được chạy qua render()và không chỉ được in.

Tôi sẽ được khuyến khích làm theo ví dụ cốt lõi của việc sử dụng render()trong các mẫu, không phải trong các chức năng tiền xử lý, trừ khi bạn có một lý do cụ thể để làm điều đó khác đi.

Từ quan điểm hiệu suất, sự khác biệt chắc chắn sẽ không đáng kể, nhưng cấu hình mã trong bối cảnh trang web và phần cứng của bạn là cách duy nhất để chắc chắn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.