【问题标题】:Symfony4 Forms - How do you conditionally disable a form field?Symfony4 Forms - 你如何有条件地禁用表单域?
【发布时间】:2018-10-30 08:39:18
【问题描述】:

那么,让表单一遍又一遍地有效呈现相同表单的最佳方法是什么?基于实体的属性值有条件地禁用字段?

我有一个发票实体,需要一个用于创建发票的表单,以及在发票流程的各个阶段(生成、发送、支付等)禁用各个字段的相同表单。

我认为最简单的答案是通过 form_row 选项在 twig 模板中动态禁用它们,但这肯定会影响表单的服务器端验证,因为它不知道该字段已被禁用?

根据数据库中的值禁用字段的最佳方法是什么?

编辑 1:

将问题从Dynamically disable a field in the twig template or seperate class for each form? 更改为Symfony4 Forms - How do you conditionally disable a form field?

【问题讨论】:

  • 您可以使用form events(通常是 PRE_SET_DATE 事件)根据实体值动态修改表单。另一方面,仅仅使用不同的形式往往更容易理解。
  • @Cerad。谢谢你的推动。 PRE_SET_DATE 把我送到了正确的答案:)

标签: forms symfony4


【解决方案1】:

感谢@Cerad。答案其实是Form Events

在表单类型中(对我来说是App\Form\InvoicesType),在builder末尾添加一个方法调用:

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $plus_thirty_days = new \DateTime('+28 days');

    $builder
        ->add('client', EntityType::class, array(
            'class' => Clients::class,
            'choice_label' => 'name',
            'disabled' => false,
        ) )
        // the event that will handle the conditional field
        ->addEventListener(
            FormEvents::PRE_SET_DATA,
            array($this, 'onPreSetData')
        );;
}

然后在同一个类中,创建一个与数组中的字符串同名的公共方法(本例为onPreSetData):

public function onPreSetData(FormEvent $event)
{

    // get the form
    $form = $event->getForm();

    // get the data if 'reviewing' the information
    /**
     * @var Invoices
     */
    $data = $event->getData();


    // disable field if it has been populated with a client already
    if ( $data->getClient() instanceof Clients )
        $form->add('client', EntityType::class, array(
            'class' => Clients::class,
            'choice_label' => 'name',
            'disabled' => true,
        ) );

}

从这里您可以将字段更新为任何有效的FormType 并指定任何有效的选项,就像在 From Builder 中的普通表单元素一样,它将替换前一个,将其放置在相同的原始位置形式。

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多