Friday, January 15, 2010

Modificar widgets defaults del módulo sfGuardUser (sfDoctrineGuardPlugin)

Sigo con la onda symfony pues estoy trabajando en un proyecto con el framework.

En este caso estaba usando el plugin sfDoctrineGuardPlugin el cúal supongo, si están leyendo estas líneas, conocen para que funciona.

En este caso tengo un formulario de registro de usuarios y requería que el campo para permisos del usuario, que por default es:

//lib/form/doctrine/sfDoctrineGuardPlugin/BasesfGuardUserForm.class.php
       ...
      'permissions_list' => new sfWidgetFormDoctrineChoiceMany(array('model' => 'sfGuardPermission'))
       ...


y su validator:
      ...
      'permissions_list' => new sfValidatorDoctrineChoiceMany(array('model' => 'sfGuardPermission', 'required' => false)),
      ...


cambiase la validación a un campo requerido, es decir
'required' => true.

Dado que la idea NO es modificar el plugin, de manera que se mantenga el código mantenible y el plugin actualizable (Principios básicos de calidad del software), intenté sobreescribir el validator desde la clase sfGuardUser.class.php, que es creada automáticamente en el directorio /lib/form/doctrine/sfDoctrineGuardPlugin. Procedí a añadir dentro de la función configure, la siguiente línea:

     $this->validatorSchema['permissions_list']->setOption('required', true);

Sin embargo esto no funciona. Ningún tipo de modificación que hiciera sobre la lista de widgets autogenerados (username, group_list, is_active, permissions_list, etc..) funciona.

Solución

Googleando y preguntando en los foros, encontré que la solución es hacer las modificaciones sobre el archivo sfGuardAdminUser.class.php en lugar de sfGuardUser.class.php. Este se encuentra en el directorio del plugin. Pueden copiarlo y agregarlo a la ubicación /lib/form/doctrine. De esta manera cualquier modificación realizada sobre alguno de los widgets SÍ tendrá efecto.

Una segunda opción:

Copiar el generator.yml  de
/plugins/sfDoctrineGuardPlugin/modules/sfGuardUser/config/generator.yml
a
/apps/tu_app/modules/sfGuardUser/config/generator.yml

Luego cambiar el form class en el generator.yml:

     form:
            class: sfGuardUserAdminForm


Crear una nueva clase form así:

//lib/form/doctrine
      class sfGuardMyUserAdminForm extends sfGuardUserAdminForm
     {
        public function configure()
       {
            $this->validatorSchema['permissions_list']->setOption('required', True);
       }
     }

Eso es todo:

Fuente:
-
Modify sfGuardUserForm fields


No comments: