Ver índice de contenidos del libro

7.4. Actualizando la base de datos

Debido a los problemas explicados en la sección anterior, debemos añadir una columna llamada slug en la tabla category:

# config/schema.yml
propel:
  jobeet_category:
    id:           ~
    name:         { type: varchar(255), required: true }
    slug:         { type: varchar(255), required: true, index: unique }

Ahora que slug es una columna auténtica de la tabla, puedes eliminar el método getSlug() de la clase JobeetCategory.

Cada vez que se modifica el nombre de una categoría, es necesario calcular el nuevo valor de su slug y guardarlo en la base de datos. Para ello, puedes redefinir el método setName():

// lib/model/JobeetCategory.php
public function setName($name)
{
  parent::setName($name);
 
  $this->setSlug(Jobeet::slugify($name));
}

Ejecuta la tarea propel:build-all-load para volver a generar todas las tablas de la base de datos y para cargar los datos de prueba de los archivos de datos:

$ php symfony propel:build-all-load --no-confirmation

Ahora ya tenemos todo listo para crear el nuevo método executeShow(). Reemplaza el contenido del archivo de acciones del módulo category por el siguiente código:

// apps/frontend/modules/category/actions/actions.class.php
class categoryActions extends sfActions
{
  public function executeShow(sfWebRequest $request)
  {
    $this->category = $this->getRoute()->getObject();
  }
}

Nota Como hemos eliminado el método executeIndex() generado automáticamente, también puedes borrar la plantilla indexSuccess.php asociada, que se encuentra en el archivo apps/frontend/modules/category/templates/indexSuccess.php.

Por último, crea la plantilla showSuccess.php:

// apps/frontend/modules/category/templates/showSuccess.php
<?php use_stylesheet('jobs.css') ?>
 
<?php slot('title', sprintf('Jobs in the %s category', $category->getName())) ?>
 
<div class="category">
  <div class="feed">
    <a href="">Feed</a>
  </div>
  <h1><?php echo $category ?></h1>
</div>
 
<table class="jobs">
  <?php foreach ($category->getActiveJobs() 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>