¿Dónde renderizar? Preproceso o plantilla?

8

Estamos mejorando constantemente nuestro rendimiento de codificación y estamos monitoreando cada carga de página para optimizar los tiempos de carga y representación en nuestros sitios web.
Por encima de la declaración en mente, me topé con la pregunta de dónde deberíamos renderizar las matrices renderizables.

Si los procesa en su preprocesador, la plantilla se mantiene bastante ordenada ya que solo está imprimiendo variables.

Preprocesador:

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

Modelo:

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

Sin embargo, no estoy seguro de que esta sea la forma adecuada / más rápida / más ordenada de preprocesar e imprimir variables.

Drupal tampoco consiste en este asunto, supongo ... En las node.tpl.phpvariables predeterminadas se representan, mientras que en otras plantillas predeterminadas (como html.php.php), las variables se imprimen.

¿Alguien tiene una regla y / o algunos consejos y sugerencias sobre cómo abordar este problema de la manera más limpia y rápida?

Michiel
fuente
2
Esta pregunta es bastante subjetiva. La regla general es que la computación se realiza en la función de preproceso y la representación en el archivo de plantilla. No está claro por qué está utilizando node_view()para representar un campo; los campos no se representan de esa manera en una plantilla de nodo.
kiamlaluno
Gracias por la info. Entonces, ¿por qué Drupal está renderizando node.tpl.phpe imprimiendo html.tpl.php? ¿Cómo abordarías el node_view()problema?
Michiel

Respuestas:

7

Drupal tampoco consiste en este asunto, supongo ... En el nodo predeterminado, las variables node.tpl.php se representan, mientras que en otras plantillas predeterminadas (como html.php.php), las variables solo se imprimen.

Eso no es del todo bien. Si observas template_preprocess_html(), puedes ver que nada se ejecuta a través de render()/ drupal_render(). Así que, simplemente, las variables en html.tpl.php se imprimen en lugar de representarse porque no es necesario representarlas. Todos los vars ya son cadenas, y no se utilizaron matrices de renderizado para construir la plantilla.

Por el contrario, el contenido del nodo en node.tpl.php es una matriz de representación. Por lo tanto, cualquier parte de ella que deba renderizarse debe ejecutarse render()y no solo imprimirse.

Me sentiría tentado a seguir el ejemplo central de uso render()en plantillas, no en funciones de preproceso, a menos que tenga una razón específica para hacerlo de manera diferente.

Desde el punto de vista del rendimiento, la diferencia seguramente sería insignificante, pero perfilar el código en el contexto de su sitio y hardware es la única forma de estar seguro.

Clive
fuente