Ejemplo de un crud Con tecnologia AJAX, en symfony2

827 views
Skip to first unread message

jean mendoza

unread,
Sep 17, 2011, 10:05:14 PM9/17/11
to symfo...@googlegroups.com
Buenas, compañeros desarrolladores de software necesito ayuda con un ejemplo , de un crud completo basandonos en la tecnologia ajax, si hay algo que me ha llamado la atencion de symfony es la validacion que hace, de acuerdo a las reglas de cada campo que estan reflejadas en las entidades, y cuando uno envia un formulario el paso es el siguiente 

 public function newAction()
    {
        $peticion = $this->getRequest();
        $formulario = $this->get('form.factory')->create(new AeronaveType());
        if ($peticion->getMethod() == 'POST') {
            $formulario->bindRequest($peticion);
            if ($formulario->isValid()) {
                $em = $this->getDoctrine()->getEntityManager();
                $aeronave = $formulario->getData();
                $em->persist($aeronave);
                $em->flush();
                $peticion->getSession()->setFlash('notice', 'Se ha creado correctamente la aeronave');

                return $this->redirect($this->generateUrl('_AeronauticoBundle_edit', array(
                    'id' => $aeronave->getId()
                )));
            }//fin si es valido
        }//fin post

        return $this->render('AeronauticoBundle:Aeronave:new.html.twig', array(
            'form' => $formulario->createView()
        ));
    }//fin new
    

Esto funciona muy bien, pero cuando la peticion se hace de manera sencilla enviando el formulario por peticion http, pero  si nos fijamos 
la validacion que se hace es muy elegante 
           $formulario->bindRequest($peticion);
            if ($formulario->isValid()) {
codigo o logica de lo que se quiere hacer si el formulario es valido
}

$formulario->bindRequest($peticion); lo que hace es casarme el formulario con la peticion, y ela siguiente line verfica si el formulario es valido, esto funciona bien pero cuando uso tecnologia ajax, solo puedo haceer un $(form).serialize(); para enviar todos los campos asociaciados al form, pero cuando reciba eso en el controller , tengo una duda debo hacer mis validaciones y desperdiciar las que sy2 me ofrece y ya se han programado en las entidades? o como hago para hacerlo de manera facil y elegante? sin pasar por encima de las validaciones que sy2 me ofrece

Rigoberto Reyes sv

unread,
Sep 19, 2011, 7:02:38 PM9/19/11
to symfo...@googlegroups.com

Usando el servicio validator

Si deseamos validar un objeto que no esté asociado a un formulario, debemos hacer uso del servicio validator. El trabajo del validador es fácil: lee las restricciones (es decir, las reglas) de una clase y comprueba si los datos en el objeto satisfacen esas restricciones. Si la validación falla, devuelve un arreglo de errores. Veamos un ejemplo sencillo:

use Symfony\Component\HttpFoundation\Response;

use Acme\BlogBundle\Entity\Autor;

// ...

public function indexAction()

{

$autor = new Autor();

// ... haz algo con el objeto $autor, como asignar los valores de sus propiedades a partir de datos enviados en el formulario

$validador = $this->get(’validator’);

$errores = $validador->validate($autor);

if (count($errores) > 0) {

return new Response(print_r($errores, true));

} else {

return new Response(’¡El autor es válido!¡Sí!’);

}

}

Para tu caso particular sería recuperar el objeto Request para obtener los datos enviados en el formulario y luego asignarlos al objeto para posteriormente validar el objeto, lo que yo voy a probar (aún no he tenido el tiempo de hacerlo) es de que al momento de generar el formulario, con algo que no sea el componente de formularios de Symfony2, se creen los nombres de los controles tal como lo hace el componente para poder mandar el formulario, con ajax o normal, y que al recibirlo se pueda realizar un simple $formulario->bindRequest($peticion); claro que además de los nombres de los controles además deberá haber (supongo) otro información de control para el Componente de formularios.
La opción que utilicé por el momento es recuperar los valores enviados en el formulario y asignarlo a su correspondiente propiedad del objeto y luego validar el objeto, tal como se muestra arriba, que eso resolvería tu problema de tener que volver a escribir las validaciones.



--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para ver este debate en la Web, visita https://groups.google.com/d/msg/symfony-es/-/MidcOHyYkiMJ.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.

jean mendoza

unread,
Sep 22, 2011, 5:12:22 PM9/22/11
to symfo...@googlegroups.com
Primero que nada, te doy las gracias por la idea que me haz dado y quiero decirte que logre hacerlo de la siguiente manera

 public function newAction()
    {
       
        $peticion = $this->getRequest();
        $formulario = $this->get('form.factory')->create(new AeronaveType(array("serial"=>'as')));
         if ($peticion->getMethod() == 'POST') {
                $em = $this->getDoctrine()->getEntityManager();
                     if ($peticion->isXmlHttpRequest()) {  
                         $aeronave = new \Taller\AeronauticoBundle\Entity\Aeronave();
                         $aeronave_array_form=$peticion->get("Aeronave");
                         foreach ($aeronave_array_form as $key=>$value){                             
                             if($key=="tipoAeronave")
                             {
                                if (null ==$tipoAeronave = $em->find('AeronauticoBundle:TipoAeronave', $aeronave_array_form[$key]))
                                        return new Response("No se Encontro el Tipo de Aeronave ");
                                $aeronave->{'set'.ucfirst($key)}($tipoAeronave);
                             }
                             else if($key=="cliente")
                             {
                                $cliente = $em->find('AeronauticoBundle:Cliente',  $aeronave_array_form[$key]);
                                $aeronave->{'set'.ucfirst($key)}($cliente);
                             }                                 
                             else if($key!="_token")
                                $aeronave->{'set'.ucfirst($key)}( $aeronave_array_form[$key]);
                         }
                         $msg = array();
                         $errores = $this->get('validator')->validate($aeronave);
                         if (count($errores) > 0) {
                             foreach ($errores as $err) {
                                $msg[$err->getPropertyPath()]= $this->get('translator')->trans($err->getMessage(), array(), 'validators');
                            }
                            $code = false;
                        
                        } else {
                         $code = true;
                        }
                        $response = new Response(json_encode(array('code' => $code, 'msg' => $msg,"locale" => $this->get('session')->getLocale())));
                        $response->headers->set('Content-Type', 'application/json');
                        return $response;
                    }//fin si la peticion es por ajax
                    
            $formulario->bindRequest($peticion);
            if ($formulario->isValid()) {
                $aeronave = $formulario->getData();
                $em->persist($aeronave);
                $em->flush();
                $peticion->getSession()->setFlash('notice', 'Se ha creado correctamente la aeronave');

                return $this->redirect($this->generateUrl('_AeronauticoBundle_edit', array(
                    'id' => $aeronave->getId()
                )));
            }//fin si es valido
        }//fin post
        

        return $this->render('AeronauticoBundle:Aeronave:new.html.twig', array(
            'form' => $formulario->createView()
        ));
    }//fin new

eso en el controller 

en la vista lo deje de esta manera

   $('#new_form').load($('#new_form').attr("href")).dialog({
autoOpen: false,
width: 980,
buttons: {
"Guardar": function() { 
                                                    $.post($('#new_form').attr("href"), $("form").serializeArray() ,function(data) {
                                                    if(data.code)
            $.achtung({message: 'El dato fue guardado', timeout:5});
        else
        $.each(data.msg,function(key,val){
            $.achtung({message: 'Campo \"'+key+"\" : "+val, timeout:5});
        });                                                      
                                                    });//fin post
}, //fin guardar
"Cancelar": function() { 
$(this).dialog("close"); 
}
});



para tener al final un resultado como este 




Dado que por json estoy mandando lo siguiente



{"code":false,"msg":{"siglas":"Este valor no deber\u00eda estar vac\u00edo","serial":"Este valor no deber\u00eda estar vac\u00edo"},"locale":"es_ES"}

Claro la variable locale, no la utilizo en este momento para nada, solo queria que las verificar que las validaciones me las mandara en español, bueno de nuevo muchas gracias hermano y que viva el software libre.......


Me despido dando el tema como solucionado, gracias de nuevo

Reply all
Reply to author
Forward
0 new messages