【发布时间】:2016-02-16 11:29:13
【问题描述】:
所以...我想根据控制器中的 IF 语句禁用 Symfony 3.0.2 中的输入。我怎么做?设置示例字段 first_name 的值
$form->get('firstname')->setData($fbConnect['data']['first_name']);
所以我想到了类似 ->setOption('disabled', true)
【问题讨论】:
所以...我想根据控制器中的 IF 语句禁用 Symfony 3.0.2 中的输入。我怎么做?设置示例字段 first_name 的值
$form->get('firstname')->setData($fbConnect['data']['first_name']);
所以我想到了类似 ->setOption('disabled', true)
【问题讨论】:
按照您的建议,使用表单选项,您可以使用以下内容定义表单类型:
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)));
});
}
【讨论】:
我使用下面的代码来更改我的表单而不使用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()之前做
【讨论】: