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.
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 self::doSelect($criteria); }
válido para Symfony 1.2