El tutorial Jobeet

6.3. Serializando objetos

Aunque el código anterior funciona correctamente, no es suficiente para cumplir con el requerimiento que establecimos durante el segundo día: "los usuarios pueden reactivar y extender la validez de la oferta por otros 30 días...".

El problema del código anterior es que utiliza el valor de created_at, que es la columna que guarda la fecha de creación del objeto. El valor de esta columna no se debería modificar, por lo que no se puede cumplir con el requerimiento establecido.

Si haces memoria, recordarás que el esquema de la base de datos dispone de una columna llamada expires_at. Por el momento, esta columna no guarda ningún valor porque no la hemos utilizado en los archivos de datos fixtures). Cuando se crea una nueva oferta de trabajo, el valor de esta columna debe establecerse a un valor equivalente a 30 días después de la fecha actual.

Para modificar un objeto de Propel antes de que se guarde en la base de datos, debes redefinir el método save() de la clase del modelo:

// lib/model/JobeetJob.php
class JobeetJob extends BaseJobeetJob
{
  public function save(PropelPDO $con = null)
  {
    if ($this->isNew() && !$this->getExpiresAt())
    {
      $now = $this->getCreatedAt() ? $this->getCreatedAt('U') : time();
      $this->setExpiresAt($now + 86400 * 30);
    }

    return parent::save($con);
  }

  // ...
}

El método isNew() devuelve true cuando el objeto no se ha guardado todavía en la base de datos y false en cualquier otro caso.

Ahora ya se puede modificar la acción para que haga uso de la columna expires_at en vez de created_at al obtener las ofertas de trabajo activas:

public function executeIndex(sfWebRequest $request)
{
  $criteria = new Criteria();
  $criteria->add(JobeetJobPeer::EXPIRES_AT, time(), Criteria::GREATER_THAN);

  $this->jobeet_job_list = JobeetJobPeer::doSelect($criteria);
}

El objeto Criteria se restringe para que sólo seleccione las ofertas de trabajo cuya fecha de expiración todavía no se ha cumplido, es decir, las ofertas de trabajo para las que su valor expires_at es una fecha futura.