Ver índice de contenidos del libro

7.2. El enlace a la página de la categoría

A continuación, edita la plantilla indexSuccess.php del módulo job para añadir el enlace a la página de la categoría:

<!-- some HTML code -->
 
        <h1><?php echo link_to($category, 'category', $category) ?></h1>
 
<!-- some HTML code -->
 
      </table>
 
      <?php if (($count = $category->countActiveJobs() - sfConfig::get('app_max_jobs_on_homepage')) > 0): ?>
        <div class="more_jobs">
          and <?php echo link_to($count, 'category', $category) ?>
          more...
        </div>
      <?php endif; ?>
    </div>
  <?php endforeach; ?>
</div>

El enlace a la página de la categoría sólo se muestra cuando existen más de 10 ofertas de trabajo en esa misma categoría. El enlace muestra el número de ofertas de trabajo adicionales que existen, sin contar las 10 que se muestran en la portada. Para que el código de la plantilla anterior funcione correctamente, debemos añadir el método countActiveJobs() en JobeetCategory:

// lib/model/JobeetCategory.php
public function countActiveJobs()
{
  $criteria = new Criteria();
  $criteria->add(JobeetJobPeer::CATEGORY_ID, $this->getId());
 
  return JobeetJobPeer::countActiveJobs($criteria);
}

Además, el método countActiveJobs() utiliza un método countActiveJobs() que todavía no existe en la clase JobeetJobPeer. Reemplaza el contenido del archivo JobeetJobPeer.php por el siguiente código:

// lib/model/JobeetJobPeer.php
class JobeetJobPeer extends BaseJobeetJobPeer
{
  static public function getActiveJobs(Criteria $criteria = null)
  {
    return self::doSelect(self::addActiveJobsCriteria($criteria));
  }
 
  static public function countActiveJobs(Criteria $criteria = null)
  {
    return self::doCount(self::addActiveJobsCriteria($criteria));
  }
 
  static public function addActiveJobsCriteria(Criteria $criteria = null)
  {
    if (is_null($criteria))
    {
      $criteria = new Criteria();
    }
 
    $criteria->add(self::EXPIRES_AT, time(), Criteria::GREATER_THAN);
    $criteria->addDescendingOrderByColumn(self::CREATED_AT);
 
    return $criteria;
  }
 
  static public function doSelectActive(Criteria $criteria)
  {
    return self::doSelectOne(self::addActiveJobsCriteria($criteria));
  }
 
}

Como habrás observado, hemos refactorizado todo el código de JobeetJobPeer para utilizar un nuevo método compartido llamado addActiveJobsCriteria(), de forma que el código de la clase siga los principios de DRY (Don't Repeat Yourself).

Nota La primera vez que reutilizas una parte de código, es suficiente con copiarla y pegarla. No obstante, si necesitas ese mismo trozo de código otra vez, es necesario que refactorices las apariciones de ese código y las conviertas en un método o función compartida.

En el método countActiveJobs() anterior, en vez de utilizar doSelect() y después contar el número de resultados, hemos utilizado directamente el método doCount() que es mucho más rápido.

Como acabas de comprobar, hemos tenido que modificar un montón de archivos para añadir una sola característica sencilla. No obstante, cada vez que hemos añadido código, lo hemos insertado en la capa correcta (modelo, vista, controlador) y también hemos conseguido que el código sea fácilmente reutilizable. Además, hemos aprovechado estos cambios para refactorizar parte del código existente. Todo este proceso es el flujo normal de trabajo cuando desarrollas un proyecto con Symfony.

Portada de la aplicación

Figura 7.1 Portada de la aplicación