El tutorial Jobeet

10.5. Activando y publicando las ofertas de trabajo

En la sección anterior existe un enlace para publicar una oferta de trabajo. Debemos modificar la dirección del enlace para que apunte a una nueva acción llamada publish. En vez de crear una ruta nueva, podemos simplemente modificar la configuración de la ruta job existente:

# apps/frontend/config/routing.yml
job:
  class:   sfPropelRouteCollection
  options:
    model:          JobeetJob
    column:         token
    object_actions: { publish: put }
  requirements:
    token: \w+

En la opción object_actions se incluye un array con las acciones adicionales del objeto, por lo que ahora ya podemos modificar el enlace "Publish":

<!-- apps/frontend/modules/job/templates/_admin.php -->
<li>
  <?php echo link_to('Publish', 'job_publish', $job, array('method' => 'put')) ?>
</li>

Por último, crea la acción publish:

// apps/frontend/modules/job/actions/actions.class.php
public function executePublish(sfWebRequest $request)
{
  $request->checkCSRFProtection();

  $job = $this->getRoute()->getObject();
  $job->publish();

  $this->getUser()->setFlash('notice', sprintf('Your job is now online for %s days.', sfConfig::get('app_active_days')));

  $this->redirect($this->generateUrl('job_show_user', $job));
}

Si te fijas atentamente, verás que el enlace "Publish" se envía con el método PUT de HTTP. Para simular el método PUT, el enlace se convierte automáticamente en un formulario cuando se pincha sobre el.

Además, como al crear la aplicación activamos la protección frente a los ataques CSRF, el helper link_to() incluye en el enlace un token para CSRF y el método checkCSRFProtection() del objeto que representa a la petición comprueba la validez del token después de realizar la petición.

El método executePublish() utiliza a su vez un método publish() nuevo que puede ser tan sencillo como el código que se muestra a continuación:

// lib/model/JobeetJob.php
public function publish()
{
  $this->setIsActivated(true);
  $this->save();
}

Ahora ya está todo preparado para que pruebes en el navegador la nueva funcionalidad para publicar ofertas de trabajo.

No obstante, todavía tenemos que retocar una cosa. Las ofertas de trabajo que no están activas no deberían verse, lo que significa que no se deben mostrar en la página principal de Jobeet y tampoco se deben poder acceder mediante su URL. Como en su día creamos un método llamado addActiveJobsCriteria() para restringir un objeto Criteria para que sólo obtenga las ofertas de trabajo activas, podemos modificar ese método para añadir este nuevo requerimiento:

// lib/model/JobeetJobPeer.php
static public function addActiveJobsCriteria(Criteria $criteria = null)
{
  // ...

  $criteria->add(self::IS_ACTIVATED, true);

  return $criteria;
}

Y eso es todo, por lo que ya puedes probarlo en tu navegador. En la portada de Jobeet ya no se muestra ninguna oferta de trabajo que no esté activada y tampoco se puede acceder a estas ofertas a través de su URL. No obstante, todavía se puede acceder a estas ofertas si se conoce la URL que contiene el token. En ese caso, se muestra la página de previsualización de la oferta de trabajo junto con la barra de administrador.

Esta es una de las grandes ventajas del patrón de diseño MVC y de la refactorización que hemos hecho hasta el momento: un solo cambio en un solo método es suficiente para añadir una nueva funcionalidad de la aplicación.

Nota Cuando creamos el método getWithJobs(), se nos olvidó utilizar el método addActiveJobsCriteria(). Por tanto, modifica el método y añade este nuevo requrimiento:

class JobeetCategoryPeer extends BaseJobeetCategoryPeer
{
  static public function getWithJobs()
  {
    // ...
     $criteria->add(JobeetJobPeer::IS_ACTIVATED, true);

     return $criteria;
  }