【问题标题】:symfony 3 how to disable input in controllersymfony 3 如何禁用控制器中的输入
【发布时间】:2016-02-16 11:29:13
【问题描述】:

所以...我想根据控制器中的 IF 语句禁用 Symfony 3.0.2 中的输入。我怎么做?设置示例字段 first_name 的值

            $form->get('firstname')->setData($fbConnect['data']['first_name']);

所以我想到了类似 ->setOption('disabled', true)

【问题讨论】:

    标签: php symfony input


    【解决方案1】:

    按照您的建议,使用表单选项,您可以使用以下内容定义表单类型:

    class FormType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('first_name',TextType::class,array('disabled'=>$option['first_name_disabled']));
    }
    
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('first_name_disabled'=>false));
    }
    }
    

    然后在你的控制器中创建表单:

    $form=$this->createForm(MyType::class, $yourEntity, array('first_name_disabled'=>$disableFirstNameField));
    

    但是如果disabled的值取决于实体中的值,你应该使用formevent:

    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;
    
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('first_name',TextType::class);
    
        // Here an example with PreSetData event which disables the field if the value is not null :
        $builder->addEventListener(FormEvents::PRE_SET_DATA,function(FormEvent $event){
            $lastName = $event->getData()->getLastName();
    
            $event->getForm()->add('first_name',TextType::class,array('disabled'=>($lastName !== null)));
        });
    }
    

    【讨论】:

    • 使用表单事件的好技巧,很容易忘记它们的存在。
    【解决方案2】:

    在控制器中更改 Symfony 表单字段的另一种方法

    我使用下面的代码来更改我的表单而不使用FormEvents。 构建 $form 后,只需获取所有配置并进行更改,删除该字段并使用新的 $attrs 重新创建

    注意:我正在使用 Symfony 4

    $form = $this->createForm(YourEntityFormType::class, $yourEntity);
    // Change one or more fields through certain condition
    if (true === SOME_CONDITION) {
        $field = $form->get('your_field');
        $attrs = $field->getConfig()->getOptions();
        $attrs['attr']['readonly'] ='readonly';
        $attrs['disabled'] ='disabled';
        $form->remove($field->getName());
        $form->add($field->getName(),
             get_class($field->getConfig()->getType()->getInnerType()),
             $attrs);
    }
    

    记得打电话$form->handleRequest()之前做

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      相关资源
      最近更新 更多