嗨我有两种形式的收藏品。当我提交表单时无效且抛出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',
));
}
非常感谢任何帮助。 谢谢。