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

Problemas deshabilitando checkbox en formulario con PRE_SET_DATA

21 de diciembre de 2014

Buenas,

Tengo un formulario de una entidad Certificado. Lo que hago es ver si es un Certificado nuevo o que no está facturado y muestro el formulario normal con sus requeridos y demás. Pero si el Certificado no es nuevo y está facturado, sólo permito la edición de algunos campos.

Tengo un problema y es que solo el checkbox llamado part me sale deshabilitado. Los demás me salen para habilitar o deshabilitar y no sé por qué: ni automático, ni turbo, ni 4x4 y están hechos igual. ¿Alguna ayuda?

Os pego el fichero CertificadoType. Uso symfony 2.6.0-BETA1 (que no sé porque se me instalan las betas, ¿qué opción hay en composer para que se me instalen versiones finales?) ¡Gracias por adelantado!


Respuestas

#1
class CertificadoType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
 
            $certificado = $event->getData();
            $form = $event->getForm();
 
            // Comprobamos si es un certificado nuevo o que no esté facturado
            if ((!$certificado || null === $certificado->getCodigo()) || $certificado->getFactura() === null) {
                $form->add('codigo', 'text', array('required' => false))
                        ->add('cobertura', 'entity', array(
                            'empty_value' => 'Seleccione una cobertura',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\Cobertura')
                        )
                        ->add('tarifa', 'entity', array(
                            'empty_value' => 'Seleccione una tarifa',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\Tarifa')
                        )
                        ->add('empresa', 'entity', array(
                            'empty_value' => 'Seleccione una empresa',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\Empresa')
                        )
                        ->add('tipoalta', 'choice', array(
                            'choices' => array('nueva' => 'Alta nueva', 'cambio' => 'Cambio Titular'),
                            'label' => 'Tipo de Alta',
                            'empty_value' => 'Seleccione tipo de alta',
                            'required' => true,
                        ))
                        ->add('certificadoasociado', 'genemu_jqueryautocompleter_entity', array(
                            'attr' => array(
                                'placeholder' => 'Escriba el certificado',
                            ),
                            'route_name' => 'admin_ajax_certificadoasociado',
                            'label' => 'Certificado Asociado',
                            'class' => 'ExtranetBundle:Certificado',
                            'query_builder' => function(EntityRepository $er) {
                        return $er
                                ->createQueryBuilder('c');
                    },
                        ))
                        ->add('vendedor', 'genemu_jqueryautocompleter_entity', array(
                            'attr' => array(
                                'placeholder' => 'Escriba el vendedor',
                            ),
                            'route_name' => 'admin_ajax_pventa',
                            'class' => 'ExtranetBundle:Pventa',
                            'query_builder' => function(EntityRepository $er) {
                        return $er
                                ->createQueryBuilder('pv');
                    },
                        ))
                        ->add('recargo')
                        ->add('periodoContratado', 'choice', array(
                            'choices' => array('6' => '6', '12' => '12', '24' => '24'),
                            'label' => 'Periodo contratado',
                            'empty_value' => 'Seleccione',
                            'required' => true,
                        ))
                        ->add('fechaCompra', 'genemu_jquerydate', array(
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                        ))
                        ->add('vendedor', 'genemu_jqueryautocompleter_entity', array(
                            'attr' => array(
                                'placeholder' => 'Escriba el vendedor',
                            ),
                            'route_name' => 'admin_ajax_pventa',
                            'class' => 'ExtranetBundle:Pventa',
                            'query_builder' => function(EntityRepository $er) {
                        return $er
                                ->createQueryBuilder('pv');
                    },
                        ))
                        ->add('cliente', new CompradorType())
                        ->add('modelo', 'genemu_jqueryautocompleter_entity', array(
                            'attr' => array(
                                'placeholder' => 'Escriba un modelo',
                            ),
                            'route_name' => 'admin_ajax_modelo',
                            'class' => 'ExtranetBundle:Modelo',
                            'query_builder' => function(EntityRepository $er) {
                        return $er
                                ->createQueryBuilder('mod');
                    },
                        ))
                        ->add('automatico', 'checkbox', array('required' => false))
                        ->add('turbo', 'checkbox', array('required' => false))
                        ->add('todoterreno', 'checkbox', array('required' => false, 'label' => '4x4'))
                        ->add('clasevehiculo', 'entity', array(
                            'empty_value' => 'Seleccione una cilindrada',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\ClaseVehiculo',
                            'label' => 'Cilindrada'
                                )
                        )
                        ->add('combustible', 'entity', array(
                            'empty_value' => 'Seleccione un combustible',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\Combustible')
                        )
                        ->add('observaciones', 'textarea', array('required' => false))
                        ->add('matricula')
                        ->add('bastidor', 'text', array('required' => false))
                        ->add('fechaMatriculacion', 'genemu_jquerydate', array(
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                        ))
                        ->add('km')
                        ->add('precioCompra', 'money')
                        ->add('fechaEntregaGarantia', 'genemu_jquerydate', array(
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'label' => 'Fecha de Venta'
                                )
                        )
                        ->add('fechaEfectoGarantia', 'genemu_jquerydate', array(
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'label' => 'Fecha Comienzo Garantía'
                                )
                        )
                        ->add('fechaAnulacion', 'genemu_jquerydate', array(
                            'required' => false,
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                                )
                        )
                        ->add('comercial', 'entity', array('empty_value' => 'Seleccione un comercial', 'required' => true, 'class' => 'Lider\ExtranetBundle\Entity\Colaborador'))
                        ->add('asistencia', 'checkbox', array('required' => false))
                        ->add('formapago', 'entity', array('empty_value' => 'Seleccione la forma de pago', 'required' => true, 'class' => 'Lider\ExtranetBundle\Entity\FormaPago', 'label' => 'Forma de pago'))
                        ->add('fechaPago', 'genemu_jquerydate', array(
                            'required' => false,
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                                )
                        )
                        ->add('estadoGarantia', 'checkbox', array('required' => false))
                        ->add('fechaEnvioCartaAnulacion', 'genemu_jquerydate', array(
                            'required' => false,
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'label' => 'Fecha Envío Carta Anulación'
                                )
                        )
                        ->add('part', 'checkbox', array('required' => false))
                        ->add('files', 'collection', array(
                            'type' => new FileCertificadoType(),
                            'allow_add' => true,
                            'allow_delete' => true,
                            'by_reference' => false,
                            'label' => 'Adjuntos'
                ));
            } else if ($certificado->getFactura() !== null) {
                $form->add('codigo', 'text', array('required' => false, 'disabled' => true))
                        ->add('cobertura', 'entity', array(
                            'empty_value' => 'Seleccione una cobertura',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\Cobertura',
                            'disabled' => true
                        ))
                        ->add('tarifa', 'entity', array(
                            'empty_value' => 'Seleccione una tarifa',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\Tarifa',
                            'disabled' => true
                        ))
                        ->add('empresa', 'entity', array(
                            'empty_value' => 'Seleccione una empresa',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\Empresa',
                            'disabled' => true
                                )
                        )
                        ->add('tipoalta', 'choice', array(
                            'choices' => array('nueva' => 'Alta nueva', 'cambio' => 'Cambio Titular'),
                            'label' => 'Tipo de Alta',
                            'empty_value' => 'Seleccione tipo de alta',
                            'required' => true,
                            'disabled' => true
                        ))
                        ->add('certificadoasociado', 'genemu_jqueryautocompleter_entity', array(
                            'attr' => array(
                                'placeholder' => 'Escriba el certificado asociado',
                            ),
                            'route_name' => 'admin_ajax_certificadoasociado',
                            'label' => 'Certificado Asociado',
                            'required' => false,
                            'class' => 'ExtranetBundle:Certificado',
                            'query_builder' => function(EntityRepository $er) {
                        return $er
                                ->createQueryBuilder('c');
                    },
                            'disabled' => true
                        ))
                        ->add('recargo', null, array('disabled' => true))
                        ->add('periodoContratado', 'choice', array(
                            'choices' => array('6' => '6', '12' => '12', '24' => '24'),
                            'label' => 'Periodo contratado',
                            'empty_value' => 'Seleccione',
                            'required' => true,
                            'disabled' => true
                        ))
                        ->add('fechaCompra', 'genemu_jquerydate', array(
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'disabled' => true
                        ))
                        ->add('vendedor', 'genemu_jqueryautocompleter_entity', array(
                            'attr' => array(
                                'placeholder' => 'Escriba el vendedor',
                            ),
                            'route_name' => 'admin_ajax_pventa',
                            'class' => 'ExtranetBundle:Pventa',
                            'query_builder' => function(EntityRepository $er) {
                        return $er
                                ->createQueryBuilder('pv');
                    },
                            'disabled' => true
                        ))
                        ->add('cliente', new CompradorType(), array('disabled' => true))
                        ->add('modelo', 'genemu_jqueryautocompleter_entity', array(
                            'attr' => array(
                                'placeholder' => 'Escriba un modelo',
                            ),
                            'route_name' => 'admin_ajax_modelo',
                            'class' => 'ExtranetBundle:Modelo',
                            'query_builder' => function(EntityRepository $er) {
                        return $er
                                ->createQueryBuilder('mod');
                    },
                            'disabled' => true
                        ))
                        ->add('automatico', 'checkbox', array('required' => false, 'disabled' => true))
                        ->add('turbo', 'checkbox', array('required' => false, 'disabled' => true))
                        ->add('todoterreno', 'checkbox', array('required' => false, 'label' => '4x4', 'disabled' => true))
                        ->add('clasevehiculo', 'entity', array(
                            'empty_value' => 'Seleccione una cilindrada',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\ClaseVehiculo',
                            'label' => 'Cilindrada',
                            'disabled' => true
                                )
                        )
                        ->add('combustible', 'entity', array(
                            'empty_value' => 'Seleccione un combustible',
                            'required' => true,
                            'class' => 'Lider\ExtranetBundle\Entity\Combustible',
                            'disabled' => true)
                        )
                        ->add('observaciones', 'textarea', array('required' => false))
                        ->add('matricula', null, array('required' => false, 'disabled' => false))
                        ->add('bastidor', 'text', array('required' => false, 'disabled' => true))
                        ->add('fechaMatriculacion', 'genemu_jquerydate', array(
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'disabled' => true
                        ))
                        ->add('km', null, array('disabled' => true))
                        ->add('precioCompra', 'money', array('disabled' => true))
                        ->add('fechaEntregaGarantia', 'genemu_jquerydate', array(
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'label' => 'Fecha de Venta',
                            'disabled' => true
                                )
                        )
                        ->add('fechaEfectoGarantia', 'genemu_jquerydate', array(
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'label' => 'Fecha Comienzo Garantía',
                            'disabled' => true
                                )
                        )
                        ->add('fechaAnulacion', 'genemu_jquerydate', array(
                            'required' => false,
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy'
                                )
                        )
                        ->add('comercial', 'entity', array('empty_value' => 'Seleccione un comercial', 'required' => true, 'class' => 'Lider\ExtranetBundle\Entity\Colaborador', 'disabled' => true))
                        ->add('asistencia', 'checkbox', array('required' => false, 'disabled' => true))
                        ->add('formapago', 'entity', array('empty_value' => 'Seleccione la forma de pago', 'required' => true, 'class' => 'Lider\ExtranetBundle\Entity\FormaPago', 'disabled' => true, 'label' => 'Forma de pago'))
                        ->add('fechaPago', 'genemu_jquerydate', array(
                            'required' => false,
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'disabled' => true
                                )
                        )
                        ->add('estadoGarantia', 'checkbox', array('required' => false))
                        ->add('fechaEnvioCartaAnulacion', 'genemu_jquerydate', array(
                            'required' => false,
                            'widget' => 'single_text',
                            'format' => 'dd-MM-yyyy',
                            'label' => 'Fecha Envío Carta Anulación'
                                )
                        )
                        ->add('part', 'checkbox', array('required' => false, 'disabled' => true))
                        ->add('files', 'collection', array(
                            'type' => new FileCertificadoType(),
                            'allow_add' => true,
                            'allow_delete' => true,
                            'by_reference' => false,
                            'label' => 'Adjuntos'
                        ))
                ;
            }
 
        });
    }

@CampoySoft

21 diciembre 2014, 18:40
#2

Respecto a la pregunta de por qué se te instalan las versiones beta de las dependencias de Composer, seguramente tiene que ver con la opción minimum-stability. Por defecto las versiones recientes de Composer sólo instalan dependencias estables, así que es posible que la opción minimum-stability en tu archivo composer.json tenga un valor igual a beta.

Respecto al problema con el formulario, me temo que yo no voy a poder ayudarte porque los formularios complejos de Symfony no son lo mío. En cualquier caso, sí que me gustaría aconsejarte algo: en casos como el que comentas, puede venir bien dividir el formulario grande en dos formularios más pequeños.

Podrías definir por ejemplo un formulario simple llamado CertificadoPagadoType o PedidoType o cualquier otro nombre apropiado y después crear el formulario completo llamado CertificadoType. Además, como el formulario simple y el completo comparten muchos campos, puedes hacer que uno herede de otro y así aprovechas todos sus campos.

@javiereguiluz

21 diciembre 2014, 19:55