Monday, February 11, 2013

Symfony 2 - Ignorar Campos Vacios en Formas

Estoy creando un administrador de cuentas y usuarios usando Symfony 2.1 y el Proyecto Sonata, un requerimiento es que al momento de actualizar una cuenta, si el usuario no introdujo una contraseña la aplicación debe de ignorar este campo y no actualizarlo en la base de datos.

Para realizar esto, se debe de utilizar una clase que implemente la interfaz EventSubscriberInterface y suscribirla al objeto de la Forma en el evento PRE-BIND, luego esta verificará si el usuario no envió valor al campo, si es asi se eliminará el campo para que no sea considerado al momento de la actualización.

Mas Información
Asociarlo al objeto en sonata:
protected function configureFormFields(FormMapper $formMapper)
{

///BLLA
////.....
$subscriber = new IgnoreBlankFieldListener($formMapper->getFormBuilder()->getFormFactory(), 'password');
            
$formMapper->getFormBuilder()->addEventSubscriber($subscriber);

//SEGUIR
}
Este es la clase que utilice que cree, sirve para objetos normales o arreglos.
namespace Acme\TestBundle\Admin;
 
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
class IgnoreBlankFieldListener implements EventSubscriberInterface
{
    private $factory;
    private $name;
 
    public function __construct(FormFactoryInterface $factory, $name)
    {
        $this->factory = $factory;
        $this->name = $name;
    }
    
    public static function isNotEmpty($var )
    {
        if(is_array($var))
        {
            $notempty = false;
            
            foreach( $var as $v )
            {
                $notempty = $notempty || !IgnoreBlankFieldListener::isNotEmpty($v);
            }
            
            return $notempty;
        }
        else
            return !empty ($var);
    }
    
    public static function isEmpty( $var )
    {
        
        return IgnoreBlankFieldListener::isNotEmpty($var);
    }
 
    public function preBind(FormEvent $event)
    {
        
        $data = $event->getData();
        $data_name = $data[$this->name];
        
        
        
        if( IgnoreBlankFieldListener::isEmpty($data_name) )
        {
           $form = $event->getForm();
           unset( $data[$this->name] );
           $event->setData($data);
           $form->remove($this->name);
        }
    }

    public static function getSubscribedEvents() {
        
        return array(FormEvents::PRE_BIND => 'preBind');
    }
}

No comments:

Post a Comment