symfony中复合形式出错

时间:2016-03-09 17:43:34

标签: php symfony symfony-2.8

嗨我有两种形式的收藏品。当我提交表单时无效且抛出symfony的错误:

  

的Symfony \元器件\验证\ ConstraintViolation   对象(Symfony \ Component \ Form \ Form).children [registrosusuario] =   对象(学说\共同\类别\ ArrayCollection的)

     

引起:   Symfony的\分量\表格\异常\ TransformationFailedException   复合形式在提交时需要数组或NULL。

AsistenciaType:

class AsistenciaType extends AbstractType
{
    protected $em;

    public function __construct($em) {
        $this->em = $em;

    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('fecha', DateTimeType::class,array(
                'widget' => 'single_text',
                'input'  => 'datetime',
                'format' => 'dd-MM-yyyy',
                'html5' => false,
                'label' => "Fecha",
                'compound'=>false
            ))

            ->add('comentario', TextareaType::class, array(
                'attr'=>array(
                    'rows'=>5
                )
            ))
            ->add('enviar', SubmitType::class,
                array(
                    'label'=>'Enviar',
                    'attr'=>array(
                        'class'=>'btn-info btn-block btn-lg'
                    ))
            );

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) {
                $form = $event->getForm();
                $data = $event->getData();

                $fecha = $data->getFecha();
                if(is_null($fecha)){
                    $registros =  array();
                } else {
                    $datos = $this->em->getRepository('ControlAsistenciaBundle:RegistroTiempo')
                        ->ObtenerRegistrosFechaUsuario($data->getUsuario(), $fecha);

                    $registros = new ArrayCollection();
                    foreach($datos as $dato){
                        $rtime = new AsistenciaRegistroTiempo();
                        if(!is_null($dato->getFechahoraentrada()))
                            $rtime->setHoraentrada($dato->getFechahoraentrada());
                        if(!is_null($dato->getFechahorasalida()))
                            $rtime->setHorasalida($dato->getFechahorasalida());
                        $rtime->setTiporegistro($dato->getTiporegistro());
                        $registros->add($rtime);
                    }

                }

                $form->add('registrosusuario', CollectionType::class, array(
                    'entry_type' => AsistenciaRegistrosTiempoType::class,
                    'allow_add'    => true,
                    'allow_delete' => false,
                    'by_reference' => false,
                    'data' => $registros,
                ));
            });


        $builder->addEventListener(
            FormEvents::PRE_SUBMIT,
            function (FormEvent $event) {
                $submittedData = $event->getData();
                $asistencia = $event->getForm()->getData();
                if (!strlen($submittedData['fecha'])) {
                    return;
                }
                $fecha = new \DateTime($submittedData['fecha']);
                $datos = $this->em->getRepository('ControlAsistenciaBundle:RegistroTiempo')
                    ->ObtenerRegistrosFechaUsuario($asistencia->getUsuario(),$fecha);

                $registros = new ArrayCollection();
                foreach($datos as $dato){
                    $rtime = new AsistenciaRegistroTiempo();
                    if(!is_null($dato->getFechahoraentrada()))
                        $rtime->setHoraentrada($dato->getFechahoraentrada());
                    if(!is_null($dato->getFechahorasalida()))
                        $rtime->setHorasalida($dato->getFechahorasalida());
                    $rtime->setTiporegistro($dato->getTiporegistro());
                    $registros->add($rtime);
                }

                $submittedData['registrosusuario'] = $registros;
                $event->setData($submittedData);
            });

        $builder->get('fecha')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) {
                // It's important here to fetch $event->getForm()->getData(), as
                // $event->getData() will get you the client data (that is, the ID)
                $fecha = $event->getForm()->getData();
                $form = $event->getForm()->getParent();

                $asistencia = $form->getData();
                if(is_null($fecha)){
                    $registros =  array();
                } else {
                    $datos = $this->em->getRepository('ControlAsistenciaBundle:RegistroTiempo')
                        ->ObtenerRegistrosFechaUsuario($asistencia->getUsuario(), $fecha);
                    $registros = new ArrayCollection();
                    foreach($datos as $dato){
                        $rtime = new AsistenciaRegistroTiempo();
                        if(!is_null($dato->getFechahoraentrada()))
                            $rtime->setHoraentrada($dato->getFechahoraentrada());
                        if(!is_null($dato->getFechahorasalida()))
                            $rtime->setHorasalida($dato->getFechahorasalida());
                        $rtime->setTiporegistro($dato->getTiporegistro());
                        $registros->add($rtime);
                    }
                }
                $form->add('registrosusuario', CollectionType::class, array(
                    'entry_type' => AsistenciaRegistrosTiempoType::class,
                    'allow_add'    => true,
                    'allow_delete' => false,
                    'by_reference' => false,
                    'data' => $registros,
                ));
            }
        );

        //Data Transformer
        $builder->get('fecha')
            ->addModelTransformer(new CallbackTransformer(
                function ($asistencia) {
                    $fechausuario = null;
                    if($asistencia instanceof  \DateTime) {
                        $fechausuario = $asistencia;
                        $mes = $fechausuario->format("m");
                        $dia = $fechausuario->format("d");
                        $anio = $fechausuario->format("Y");
                        $hora = $fechausuario->format("H");
                        $minuto = $fechausuario->format("i");

                        $fechausuario = new \DateTime($anio.'-'.$mes.'-'.$dia.' '.$hora.':'.$minuto);
                    }else{
                        if(strlen($asistencia)==10){
                            $partesfecha = explode("-",$asistencia);
                            $fechausuario = new \DateTime($partesfecha[2].'-'.$partesfecha[1].'-'.$partesfecha[0]);
                        }
                    }

                    return $fechausuario;
                },
                function ($asistencia) {
                    $fechausuario = null;
                    if($asistencia instanceof  \DateTime) {
                        $fechausuario = $asistencia;
                        $mes = $fechausuario->format("m");
                        $dia = $fechausuario->format("d");
                        $anio = $fechausuario->format("Y");
                        $hora = $fechausuario->format("h");
                        $minuto = $fechausuario->format("i");

                        $fechausuario = new \DateTime($anio.'-'.$mes.'-'.$dia.' '.$hora.':'.$minuto);
                    }else{
                        if(strlen($asistencia)==10){
                            $partesfecha = explode("-",$asistencia);
                            $fechausuario = new \DateTime($partesfecha[2].'-'.$partesfecha[1].'-'.$partesfecha[0]);
                        }
                    }

                    return $fechausuario;
                }
            ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Company\Apps\ControlAsistenciaBundle\Entity\Asistencia',
        ));
    }
}

AsistenciaRegistroTiempoType.php

class AsistenciaRegistrosTiempoType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('tiporegistro',EntityType::class,array(
                'class' => 'ControlAsistenciaBundle:TipoRegistroTiempo',
                'choice_label' => 'titulo',
                'expanded'=>false,
                'placeholder' => false,
                'multiple'=>false,
                'label'=>'Tipo',
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('t')
                        ->orderBy('t.id', 'ASC');
                },
                'choices_as_values' => true,
                'compound' => false
            ))
            ->add('horaentrada', TimeType::class,array(
                'widget' => 'single_text',
                'input'  => 'datetime',
                'html5' => false,
                'label' => "Entrada",
                'with_seconds'=>false

            ))
            ->add('horasalida', TimeType::class,array(
                'widget' => 'single_text',
                'input'  => 'datetime',
                'html5' => false,
                'label' => "Salida",
                'with_seconds'=>false
            ));

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Company\Apps\ControlAsistenciaBundle\Entity\AsistenciaRegistroTiempo',
        ));
    }

非常感谢任何帮助。 谢谢。

0 个答案:

没有答案
相关问题