Ver índice de contenidos del libro

4.4. La portada del módulo de las ofertas de trabajo

Como se explicó en la lección anterior, la portada del módulo job se genera en una acción llamada index. La acción es la parte del controlador de esta página y la plantilla asociada (llamada indexSuccess.php) es la parte de la vista:

apps/
  frontend/
    modules/
      job/
        actions/
          actions.class.php
        templates/
          indexSuccess.php

4.4.1. La acción

Las acciones se definen como métodos de una clase. Para la portada que estamos creando, la clase se llama jobActions (siempre es el nombre del módulo seguido por la palabra Actions) y el método se llama executeIndex() (siempre es la palabra execute seguida del nombre de la acción). Lo único que hace esta acción es obtener la información de todas las ofertas de trabajo de la base de datos:

// apps/frontend/modules/job/actions/actions.class.php
class jobActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
    $this->jobeet_job_list = JobeetJobPeer::doSelect(new Criteria());
  }
 
  // ...
}

Entrando en el detalle del código anterior, se puede observar que el método executeIndex() (que es el controlador) realiza llamadas a los métodos de la clase JobeetJobPeer del modelo para obtener la lista de todas las ofertas de trabajo (gracias a new Criteria()). Este método devuelve un array de objetos de tipo JobeetJob, que se asigna a la propiedad jobeet_job_list del objeto.

Todas las propiedades de este objeto se pasan automáticamente a la plantilla, que es la parte de la vista. Para pasar datos del controlador a la vista, lo único que tienes que hacer es crear una propiedad en el objeto mediante $this->nombreDeLaPropiedad:

public function executeFooBar(sfWebRequest $request)
{
  $this->foo = 'bar';
  $this->bar = array('bar', 'baz');
}

El código anterior permite que en la plantilla existan dos variables llamadas $foo y $bar que contienen los valores establecidos en la acción.

4.4.2. La plantilla

Symfony utiliza por defecto una convención para deducir el nombre de la plantilla asociada a cada acción y que consiste en el nombre de la acción seguido de la palabra Success. Por tanto, la plantilla llamada indexSuccess.php es la que genera todo el código HTML de la tabla que muestra el listado de ofertas de trabajo. A continuación se muestra el código completo de la plantilla:

<!-- apps/frontend/modules/job/templates/indexSuccess.php -->
<?php use_stylesheet('jobs.css') ?>
 
<h1>Job List</h1>
 
<table>
  <thead>
    <tr>
      <th>Id</th>
      <th>Category</th>
      <th>Type</th>
<!-- more columns here -->
      <th>Created at</th>
      <th>Updated at</th>
    </tr>
  </thead>
  <tbody>
    <?php foreach ($jobeet_job_list as $jobeet_job): ?>
    <tr>
      <td>
        <a href="<?php echo url_for('job/show?id='.$jobeet_job->getId()) ?>">
          <?php echo $jobeet_job->getId() ?>
        </a>
      </td>
      <td><?php echo $jobeet_job->getCategoryId() ?></td>
      <td><?php echo $jobeet_job->getType() ?></td>
<!-- more columns here -->
      <td><?php echo $jobeet_job->getCreatedAt() ?></td>
      <td><?php echo $jobeet_job->getUpdatedAt() ?></td>
    </tr>
    <?php endforeach; ?>
  </tbody>
</table>
 
<a href="<?php echo url_for('job/new') ?>">New</a>

En el código de la plantilla anterior, se emplea una sentencia foreach para recorrer la lista de objetos de tipo Job (almacenados en la variable $jobeet_job_list) y para cada oferta de trabajo, se muestra el valor de todas sus columnas. Para acceder al valor de cada columna, puedes utilizar un método generado automáticamente y que se construye uniendo la palabra get junto con el nombre de la columna en formato camelCase. El formato camelCase consiste en eliminar los guiones bajos del nombre original de la columna y escribir en mayúsculas la primera letra de cada palabra. De esta forma, la columna created_at tiene un método asociado llamado getCreatedAt().

El código anterior muestra el valor de todas las columnas de los objetos, pero en la aplicación real sólo queremos mostrar algunas de las columnas disponibles:

<!-- apps/frontend/modules/job/templates/indexSuccess.php -->
<?php use_stylesheet('jobs.css') ?>
 
<div id="jobs">
  <table class="jobs">
    <?php foreach ($jobeet_job_list as $i => $job): ?>
      <tr class="<?php echo fmod($i, 2) ? 'even' : 'odd' ?>">
        <td class="location"><?php echo $job->getLocation() ?></td>
        <td class="position">
          <a href="<?php echo url_for('job/show?id='.$job->getId()) ?>">
            <?php echo $job->getPosition() ?>
          </a>
        </td>
        <td class="company"><?php echo $job->getCompany() ?></td>
      </tr>
    <?php endforeach; ?>
  </table>
</div>
La página principal

Figura 4.5 La página principal

La función url_for() utilizada en la plantilla anterior es un helper muy útil de Symfony que explicaremos en la lección de mañana.