Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Problema al registrar datos de un formulario embebido

12 de julio de 2015

Hola que tal? Estoy teniendo algunos problemas a la hora de registrar los datos de un formulario embebido para una relación OneToMany.

LugarType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nombre')
            ->add('descripcion')
            ->add('direccion')
            ->add('coordenadas')
            ->add('facebook')
            ->add('twitter')
            ->add('detalles', new DetalleLugarType(), array('data_class'=> null))
            // agregue el data_class=>null, porque sino me daba error de que tengo que convertir el formulario de arrayCollection a una vista o algo así.
// y esta forma de agregar el form embebido como una colección, no me muestra nada en twig! :S
//->add('detalles', 'collection', array('type'=> new DetalleLugarType(), 'allow_add'=> true ))
        ;
    }

DetalleLugarType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('urlFoto');
    }

Twig:

<div id="contenedor_file" class=""form-group>
                    <a href="#" id="foto_add" data-toggle="tooltip" title="Agregar Foto">
                        <i class="fa fa-plus-circle abmButtonAdd"></i> 
                    </a>
                    {{ form_row(form.detalles) }}
                </div>
 
<script>
        $(document).ready(function(){
 
            $('#contenedor_file input').each(function(){
                $(this).attr('name', $(this).attr('name') + '[0]');
            });
 
            $('#foto_add').click(function(e){
                //var name = "" + $('#em_eventosbundle_lugar_detalles_urlFoto').attr('name');
                //var indice = parseInt(name.substr(name.length - 2 , 1));
                $('#em_eventosbundle_lugar_detalles_urlFoto').clone().appendTo('#contenedor_file');
 
                var indice = -1;    
                $('#contenedor_file input').each(function(){
                    indice ++;
                    var name = "" + $(this).attr('name');
                    var nuevo_name = name.substr(0, name.length - 3);
                    nuevo_name =  nuevo_name + '[' + indice + ']';
 
                    $(this).attr('name', nuevo_name );
                });
 
                e.preventDefault();
            });
        });
    </script>

Controller:

{
        $em = $this->getDoctrine()->getManager();
        $entity = new Lugar(); $errores = false;  
 
        $form = $this->createCreateForm($entity);
        $form->handleRequest($request);
 
        if ($form->isValid()) {   
            $results = $request->request->get('em_eventosbundle_lugar');
            $arrayFotos = $results['detalles']['urlFoto'];
 
            for($i=0; $i < count($arrayFotos); $i ++){
                $entity->setFotoLugar($arrayFotos[$i]);
            }
            //echo "Entidad: ";
            //var_dump($entity);
            //die();
            $em->persist($entity);
            $em->flush();
        } else {
            //var_dump($form->getErrors());
        }
 
        $entities = $em->getRepository('EventosBundle:Lugar')->findAll();
        return $this->render('EventosBundle:Lugar:index.html.twig', array(
            'entities' => $entities, 
            'entidad' => $entity,
            'errores' => $errores,
            'form'   => $form->createView(),
            'accion' => 'add',
        ));
    }

Esto trae el var_dump() comentado:

Entidad:

object(EM\EventosBundle\Entity\Lugar)[510]
  private 'id' => null
  private 'nombre' => string 'Villa gral. Belgrano' (length=4)
  private 'descripcion' => null
  private 'direccion' => null
  private 'coordenadas' => null
  private 'facebook' => null
  private 'twitter' => null
  private 'eventos' => 
    object(Doctrine\Common\Collections\ArrayCollection)[509]
      private 'elements' => 
        array (size=0)
          empty
  private 'detalles' => 
    object(Doctrine\Common\Collections\ArrayCollection)[508]
      private 'elements' => 
        array (size=3)
          'urlFoto' => 
            array (size=2)
              ...
          0 => string 'Texto de prueba 1' (length=17)
          1 => string 'Texto de prueba 2' (length=17)

Pero cuando quiero hacer:

$em->persist($entity);
$em->flush();

me sale esta excepción! :S

ContextErrorException: Warning: spl_object_hash() expects parameter 1 to be object, array given
in C:\xampp\htdocs\EM\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1367

¿Alguien puede ayudarme ? Gracias! :)