Foros del Web » Programando para Internet » PHP » Symfony »

problema en persistencia con formulario tipo entity

Estas en el tema de problema en persistencia con formulario tipo entity en el foro de Symfony en Foros del Web. Estimados, luego de buscar por todo el Foro, y googlear por mas de 24 hrs, les pido ayuda con el siguiente problema: tengo un formulario ...
  #1 (permalink)  
Antiguo 07/08/2012, 16:55
 
Fecha de Ingreso: agosto-2012
Mensajes: 6
Antigüedad: 11 años, 9 meses
Puntos: 0
problema en persistencia con formulario tipo entity

Estimados, luego de buscar por todo el Foro, y googlear por mas de 24 hrs, les pido ayuda con el siguiente problema: tengo un formulario con campo select del tipo entity, cuando realizo el enviar me aparece el siguiente error al hacer la persistencia:

Catchable Fatal Error: Object of class Doctrine\ORM\PersistentCollection could not be converted to string in /var/www/sf2/scge/vendor/doctrine/lib/Doctrine/ORM/UnitOfWork.php line 2266

Código:
El Formulario:

<?php

namespace scge\scgeBundle\Form\Usuarios;

use Symfony\Component\Form\AbstractType;

use Symfony\Component\Form\FormBuilder;
use scge\scgeBundle\Entity\TipoCandidato;

use scge\scgeBundle\Validator\Constraints\DNI;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Doctrine\ORM\EntityManager;

class UsuarioType extends AbstractType
{

    public function buildForm(FormBuilder $builder, array $options)
    {
              
    
        $builder->add('rut', 'text', array('label' => 'RUT'));
        $builder->add('serial_rut');
        $builder->add('nombre');
        $builder->add('apellidos');
        $builder->add('direccion');
        $builder->add('comuna_id','integer');
       
       /*cca
        * Aca se Carga el Combo Box desde la Base de Datos
        */
        $builder->add('tipocandidato', 'entity',
                array(
                    'class' => 'scgeBundle:TipoCandidato',
                    'property' => 'tipocandidato',
                    'label'=>'Candidato',
                    'empty_value' => false,
                    'multiple' => false
                    
                    
        ));
       
       //$builder->add('tipocandidato','integer');
        $builder->add('gastolimite');
        $builder->add('fono');
        $builder->add('movil');
        $builder->add('email', 'email');
        $builder->add('rol');
        $builder->add('password', 'repeated', array('type' => 'password'));
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'scge\scgeBundle\Entity\Usuario',
        );
    }

    public function getName()
    {
        return 'usuario';
    }


    
}


Código:
EL controlador

public function registroAction()
    {
       $form = $this->get('form.factory')->create(new UsuarioType(), array());
       
        
        
        $request = $this->get('request');
        if ($request->getMethod() == 'POST') {
            $form->bindRequest($request);

            if ($form->isValid()) {

                // Mensaje para notificar al usuario que todo ha salido bien
                $session = $this->get('request')->getSession();
                $session->setFlash('notice', 'Usuario Creado Satisfactoriamente');

                // cca -- Obtenemos el usuario
                $usuario = new Usuario();
                $tipo =new TipoCandidato;
                $usuarios = $form->getData();
                
               // $tipo = $usuarios['tipocandidato'];
               
              

                /*cca --
                 Aca se lee el dato para mantener la 
                 persistenacia de  N a 1 sin escribir en ambas tablas ...
                */
                $comuna=  $this->getDoctrine()->getRepository('scgeBundle:Comuna')->find($usuarios['comuna_id']);
                
/* Aca es donde tengo el problema, si lo envio como int, no tengo problemas, pero si lo envio como entity comienzan los Errores*/

$tipocandidato=  $this->getDoctrine()->getRepository('scgeBundle:TipoCandidato')->find($usuarios['tipocandidato']);
                
                $usuario->setRut($usuarios['rut']);
                $usuario->setSerialRut($usuarios['serial_rut']);
                $usuario->setNombre($usuarios['nombre']) ;
                $usuario->setApellidos($usuarios['apellidos']);
                $usuario->setDireccion($usuarios['direccion']);
                $usuario->setFono($usuarios['fono']);
                $usuario->setMovil($usuarios['movil']);
                $usuario->setGastolimite($usuarios['gastolimite']);
                // cca -- Aca se pone el dato en la tabla 1 a N
                $usuario->setComuna($comuna);
            
                $usuario->setTipocandidato($tipocandidato);
                // cca- Fin persistencia
                $usuario->setRol('ROLE_USER');
                $usuario->setEmail($usuarios['email']) ;
                $usuario->setPassword($usuarios['password']);
                $usuario->setBloqueado('0') ;


                // Codificamos el password
                
                $factory = $this->get('security.encoder_factory');
                $codificador = $factory->getEncoder($usuario);
                $password = $codificador->encodePassword($usuario->getPassword(), $usuario->getSalt());
                $usuario->setPassword($password);
                
                
                // Guardamos el objeto en base de datos
                $em = $this->get('doctrine')->getEntityManager();
                $em->persist($usuario);
                $em->persist($comuna);
                $em->persist($tipocandidato);
                $em->flush();

                // Logueamos al usuario
                $token = new UsernamePasswordToken($usuario, null, 'main', $usuario->getRoles());
                $this->get('security.context')->setToken($token);

                return $this->redirect($this->generateUrl('portada'));
            }
        }
        return $this->render('scgeBundle:Usuario:registro.html.twig', array('form' => $form->createView()));
    }

Código:
La Vista

{% extends "scgeBundle::layout.html.twig" %}

{% block title %}Registro de Candidatos{% endblock %}
{% block metadesc %}Registro de Usuarios SCGE{% endblock %}
{% block pageid 'registro' %}

{% block contenido %}

<h1>Registro</h1>

{% if( app.session.flash('notice') ) %}
<div class="notice">
    <p>{{ app.session.flash('notice') }}</p>
</div>
{% endif %}

{{ form_errors(form) }}

<form action="{{ path('registro') }}" method="post" {{ form_enctype(form) }}>

    <div class="grid_6 alpha">
        {{ form_errors(form.rut) }}
        <p>
            {{ form_label(form.rut) }}
            {{ form_widget(form.rut) }}
        </p>
        
          {{ form_errors(form.serial_rut) }}
        <p>
            {{ form_label(form.serial_rut) }}
            {{ form_widget(form.serial_rut) }}
        </p>


        {{ form_errors(form.nombre) }}
    <p>
        {{ form_label(form.nombre) }}
        {{ form_widget(form.nombre) }}
    </p>

    {{ form_errors(form.apellidos) }}
    <p>
        {{ form_label(form.apellidos) }}
        {{ form_widget(form.apellidos) }}
    </p>
      
        {{ form_errors(form.direccion) }}
    <p>
        {{ form_label(form.direccion) }}
        {{ form_widget(form.direccion) }}
    </p>
    
        {{ form_errors(form.tipocandidato) }}
    <p>
        {{ form_label(form.tipocandidato) }}
        {{ form_widget(form.tipocandidato) }}
    </p>
        {{ form_errors(form.gastolimite) }}
    <p>
        {{ form_label(form.gastolimite) }}
        {{ form_widget(form.gastolimite) }}
    </p>
        {{ form_errors(form.comuna_id) }}
    <p>
        {{ form_label(form.comuna_id) }}
        {{ form_widget(form.comuna_id) }}
    </p>

        {{ form_errors(form.fono) }}
    <p>
        {{ form_label(form.fono) }}
        {{ form_widget(form.fono) }}
    </p>
    
           {{ form_errors(form.movil) }}
    <p>
        {{ form_label(form.movil) }}
        {{ form_widget(form.movil) }}
    </p>
    
    {{ form_errors(form.email) }}
    <p>
        {{ form_label(form.email) }}
        {{ form_widget(form.email) }}
    </p>
    
        {{ form_errors(form.rol) }}
    <p>
        {{ form_label(form.rol) }}
        {{ form_widget(form.rol) }}
    </p>

 </div> 
    
    
    <div class="grid_6 alpha">
        {{ form_errors(form.password.first) }}
        <p>
            {{ form_label(form.password.first, 'Contraseña') }}
            {{ form_widget(form.password.first) }}
        </p>
    </div>
    
    <div class="grid_6 omega">
        {{ form_errors(form.password.second) }}
        <p>
            {{ form_label(form.password.second, 'Repetir contraseña') }}
            {{ form_widget(form.password.second) }}
        </p>
    </div>
    {{ form_errors(form._token) }}
    {{ form_widget(form._token) }}

    <input type="submit" value="Regístrate" />
</form>
{% endblock %}

{% block lateral %}
<div class="usuario">
<p>¿Ya estás registrado? <a href="{{ path('login') }}">Haz login</a></p>
</div>

<h3>Ventajas de asistir a las jornadas</h3>
<ul>
    <li>Lorem ipsum et dolor</li>
    <li>Lorem ipsum et dolor</li>
    <li>Lorem ipsum et dolor</li>
</ul>

<h3>Preguntas frecuentes</h3>
<ul>
    <li>Lorem ipsum et dolor</li>
    <li>Lorem ipsum et dolor</li>
    <li>Lorem ipsum et dolor</li>
</ul>
{% endblock %}
  #2 (permalink)  
Antiguo 07/08/2012, 21:07
 
Fecha de Ingreso: agosto-2012
Mensajes: 6
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: problema en persistencia con formulario tipo entity

Era una estupidez, pero como soy nuevo en esto de Symfony no me habia dado cuenta: Cada vez me Gusta mas Symfony....

Código:
EL controlador

public function registroAction()
    {
       $form = $this->get('form.factory')->create(new UsuarioType(), array());
       
        
        
        $request = $this->get('request');
        if ($request->getMethod() == 'POST') {
            $form->bindRequest($request);

            if ($form->isValid()) {

                // Mensaje para notificar al usuario que todo ha salido bien
                $session = $this->get('request')->getSession();
                $session->setFlash('notice', 'Usuario Creado Satisfactoriamente');

                // cca -- Obtenemos el usuario
                $usuario = new Usuario();
              //  $tipo =new TipoCandidato;
                $usuarios = $form->getData();
                
               // $tipo = $usuarios['tipocandidato'];
               
              

                /*cca --
                 Aca se lee el dato para mantener la 
                 persistenacia de  N a 1 sin escribir en ambas tablas ...
                */
               // $comuna=  $this->getDoctrine()->getRepository('scgeBundle:Comuna')->find($usuarios['comuna_id']);
                
/* Aca es donde tengo el problema, si lo envio como int, no tengo problemas, pero si lo envio como entity comienzan los Errores*/

//$tipocandidato=  $this->getDoctrine()->getRepository('scgeBundle:TipoCandidato')->find($usuarios['tipocandidato']);
                
                $usuario->setRut($usuarios['rut']);
                $usuario->setSerialRut($usuarios['serial_rut']);
                $usuario->setNombre($usuarios['nombre']) ;
                $usuario->setApellidos($usuarios['apellidos']);
                $usuario->setDireccion($usuarios['direccion']);
                $usuario->setFono($usuarios['fono']);
                $usuario->setMovil($usuarios['movil']);
                $usuario->setGastolimite($usuarios['gastolimite']);
                // cca -- Aca se pone el dato en la tabla 1 a N
                $usuario->setComuna($usuarios['comuna_id']);
            
                $usuario->setTipocandidato($usuarios['tipocandidato']);
                // cca- Fin persistencia
                $usuario->setRol('ROLE_USER');
                $usuario->setEmail($usuarios['email']) ;
                $usuario->setPassword($usuarios['password']);
                $usuario->setBloqueado('0') ;


                // Codificamos el password
                
                $factory = $this->get('security.encoder_factory');
                $codificador = $factory->getEncoder($usuario);
                $password = $codificador->encodePassword($usuario->getPassword(), $usuario->getSalt());
                $usuario->setPassword($password);
                
                
                // Guardamos el objeto en base de datos
                $em = $this->get('doctrine')->getEntityManager();
                $em->persist($usuario);
              //  $em->persist($comuna);
              //  $em->persist($tipocandidato);
                $em->flush();

                // Logueamos al usuario
                $token = new UsernamePasswordToken($usuario, null, 'main', $usuario->getRoles());
                $this->get('security.context')->setToken($token);

                return $this->redirect($this->generateUrl('portada'));
            }
        }
        return $this->render('scgeBundle:Usuario:registro.html.twig', array('form' => $form->createView()));
    }
  #3 (permalink)  
Antiguo 07/08/2012, 21:32
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: problema en persistencia con formulario tipo entity

Deberias mirar la doc del fw, gran parte del codigo que tienes en el controller no es necesaria(los setters), la idea seria algo asi:

Código PHP:
Ver original
  1. $user = new User();
  2. $form = $this->get('form.factory')->create(new UsuarioType(), $user);
  3. ...
  4. if ($request->getMethod() == 'POST') {
  5.     $form->bindRequest($request);
  6.     if($form->isValid()){
  7.        ...
  8.        $om->persist($user);
  9.        $om->flush();
  10.     }
  11. }

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 08/08/2012, 16:01
 
Fecha de Ingreso: agosto-2012
Mensajes: 6
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: problema en persistencia con formulario tipo entity

Muchas gracias, lo probare...

Etiquetas: symfony2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:22.