Ver índice de contenidos del libro

7.5. Elementos parciales

Si te fijas en el código de la plantilla anterior, verás que hemos copiado y pegado la etiqueta <table> que muestra el listado de ofertas de trabajo directamente de la plantilla indexSuccess.php. Como hemos dicho muchas veces, copiar y pegar siempre es mala idea, por lo que ha llegado el momento de aprender otro concepto importante de Symfony.

Cuando quieres reutilizar un trozo de una plantilla, tienes que crear un elemento parcial. Los elementos parciales son trozos de código de plantilla que se pueden utilizar en varias plantillas. Técnicamente, un elemento parcial es otra plantilla con la única diferencia de que su nombre empieza obligatoriamente por un guión bajo (_).

Crea el siguiente archivo _list.php:

// apps/frontend/modules/job/templates/_list.php
<table class="jobs">
  <?php foreach ($jobs as $i => $job): ?>
    <tr class="<?php echo fmod($i, 2) ? 'even' : 'odd' ?>">
      <td class="location">
        <?php echo $job->getLocation() ?>
      </td>
      <td class="position">
        <?php echo link_to($job->getPosition(), 'job_show_user', $job) ?>
      </td>
      <td class="company">
        <?php echo $job->getCompany() ?>
      </td>
    </tr>
  <?php endforeach; ?>
</table>

Una vez creado, puedes incluir el elemento parcial en la plantilla mediante el helper include_partial():

<?php include_partial('job/list', array('jobs' => $jobs)) ?>

El primer argumento de include_partial() es el nombre del elemento parcial, formado por el nombre del módulo, seguido por / y terminado por el nombre del elemento parcial sin el guión bajo inicial _. El segundo argumento es un array con las variables que se pasan al elemento parcial.

Nota ¿Por qué no se utiliza simplemente la función include() de PHP en vez del helper include_partial()? La principal diferencia entre los dos es que el helper include_partial() incluye soporte para la cache.

Ahora ya puedes reemplazar el código HTML de las tablas de las dos plantillas por la llamada al helper include_partial():

// in apps/frontend/modules/job/templates/indexSuccess.php
<?php include_partial('job/list', array('jobs' => $category->getActiveJobs(sfConfig::get('app_max_jobs_on_homepage')))) ?>
 
// in apps/frontend/modules/category/templates/showSuccess.php
<?php include_partial('job/list', array('jobs' => $category->getActiveJobs())) ?>