aramirez.es

Alberto Ramírez Website


19 de julio de 2010

Acciones en Admin Generator con GeneratorHelper

2 comentarios >>

Cuando tenemos un módulo creado a través del "Admin Generator" se crean varias acciones automáticamente como son: edit, new, delete, list... A veces, se necesitan crear acciones diferentes a éstas y que son más propias del modelo de la aplicación como por ejemplo: "mostrar en portada", "Artículo fuera de Stock".

Para ello normalmente existen dos vías diferentes: desde el generator.yml o sobreescribiendo el partial correspondiente a las acciones del form o list.

Este sería un ejemplo para una acción que pondrá un artículo en la portada de la web:

Desde el generator.yml: 

generator:
  class: sfDoctrineGenerator
  param:
    model_class:           Articulos
    theme:                 admin
    non_verbose_templates: true
    with_show:             false
    singular:              ~
    plural:                ~
    route_prefix:          articulos
    with_doctrine_route:   true
    actions_base_class:    sfActions

    config:
      actions: ~
      list:    ~
      filter:  ~
      form:
          actions:
              portada:
                  action:  'inHome'
                  label:   'En portada'
                  confirm: 'Este artículo pasará a la portada de la web. Continuar?'
              _delete: ~
              _list:   ~
              _save_:  ~
      edit:  ~
      new:  ~

Sobreescribiendo _form_actions.php

<ul class="sf_admin_actions">
<?php if ($form->isNew()): ?>
<?php // Si es un objeto nuevo no se muestra el botón ?>
  <?php // Aquí irían las acciones propias del Form: edit, save... ?>
<?php else: ?>
<?php if (!$articulos->getInHome()): ?>
  <li class="sf_admin_action_portada">
  <?php echo link_to(__('En portada', array(), 'messages'), 'articulos/inHome?id='.$articulos->getId(), array(  'conditional' => 'portada',  'conditional_value' => false,)) ?>
  </li>
<?php endif; ?>
  <?php // Aquí irían las acciones propias del Form: edit, save... ?>
<?php endif; ?>
</ul>

Esta última opción da más control al programador y se pueden tener en cuenta condicionales como por ejemplo que el artículo tenga el campo home=true, en cuyo caso ya no se necesita que aparezca el botón.

Pero las opciones no se acaban aquí, existe otro método de crear nuevas acciones un poco más complejas sin necesidad de sobreescribir el elemento Partial. Cómo? Haciendo uso del Helper propio del módulo creado por el Admin Generator (Articulos en este ejemplo). Este archivo se sitúa en el directorio lib del módulo: apps/backend/modules/##moduleName/lib/##moduleNameGeneratorHelper.class.php y extiende de Base##moduleNameGeneratorHelper que ha su vez extiende de la clase sfModelGeneratorHelper. Si miramos esta clase vemos que contiene los helpers linkToNew, linkToEdit, linkToList, linkToSave y linkToSaveAndAdd que se corresponden con las acciones base y que devuelven el tag li con una llamada al helper link_to configurado con los parámetros de la acción.

Si se mira el Partial de las acciones, primero se comprueba que exista el método ##actionName dentro del helper, si existe se muestra su valor, si no existe se crea la acción parametrizada según el fichero generator.yml

cache/backend/#env/modules/autoArticulos/templates/_form_actions.php

<?php 
// ...
if (method_exists($helper, 'linkToPortada')): ?>
  <?php echo $helper->linkToPortada($form->getObject(), array(  'action' => 'inHome',  'label' => 'En portada',  'confirm' => 'Este artículo pasará a la portada de la web. Continuar?',  'params' =>   array(    'conditional' => 'portada',    'conditional_value' => false,  ),  'class_suffix' => 'portada',)) ?>
<?php else: ?>
  <?php echo link_to(__('En portada', array(), 'messages'), 'articulos/inHome?id='.$articulos->getId(), array(  'conditional' => 'portada',  'conditional_value' => false,)) ?>
<?php endif;
// ...
?>

Entonces, una forma de personalizar acciones es usando el generator.yml y el helper del módulo para pasárle parámetros, condicionales, etc. Siguiendo con el ejemplo:

generator.yml

generator:
  class: sfDoctrineGenerator
  param:
    config:
      form:
        actions:
          novedad:
            action:  'inNew'
              label:   'Novedad'
              confirm: 'Este artículo será marcado como novedad. Continuar?'
              params:
                conditional: 'novedad'
                conditional_value: false

El parámetro 'novedad' se usará para saber qué propiedad del objeto hay que chequear y el parámetro conditional_value para saber qué valor ha de tomar el objeto para que se muestre esta acción.

articulosGeneratorHelper.class.php

<?php 

class articulosGeneratorHelper extends BaseArticulosGeneratorHelper
{
  public function linkToPortada($object, $params)
  {
    $conditional = (isset($params['params']['conditional'])) ? 'get'.ucfirst($params['params']['conditional']) : null;
    $conditional_value = (isset($params['params']['conditional_value'])) ? $params['params']['conditional_value'] : true;
    if ( ($conditional == null) || ($conditional != null && $object->$conditional() == $conditional_value) ) {
      return link_to(__($params['label'], array(), 'sf_admin'), 'articulos/' . $params['action'] . '?id=' . $object, array('confirm' => !empty($params['confirm']) ? __($params['confirm'], array(), 'sf_admin') : $params['confirm']));
    } else {
      return '';
    }
  }
}

Tengo que decir que no he visto nada en la documentación oficial de Symfony al respecto, por lo que no se hasta qué punto es una forma correcta de hacer uso de ésto, sobre todo con el paso de parámetros no estándares (conditional y conditional_value) desde el generator.yml al helper del módulo.

Tags: |


Comentarios

  • Osukaru
  • #1 Osukaru (27/07/2010 14:52)
  • Por si te sirve, en las Jornadas Symfony de Castellón se estuvo hablando de las diferentes formas de personalizar el Admin Generator. Te paso los links:

    http://vimeo.com/13325576
    http://vimeo.com/13326256

    La primera era dedicada en exclusiva al Admin Generator, pero en la segunda hablan de los Plugins y en uno en concreto mencionaban como cambiar completamente el theme del Admin Generator.

    En mi blog tienes los enlaces oficiales a las charlas:

    http://www.osukaru.es/programacion/jornadas-sobre-symfony-en-castellon/
  • Alberto
  • #2 Alberto (28/07/2010 16:47)
  • Osukaru gracias por tu comentario! el vídeo de cómo personalizar el Admin Generator la vi hace unos días. En realidad he visto todas las del primer día.

    Tengo muchas ganas de empezar a ver las del 2º día y sobre todo la ponencia de los plugins y la de Symfony2.

    Un saludo!
Deja tu comentario

zukeidigital 2008