【问题标题】:How do I specify default values in a Symfony form如何在 Symfony 表单中指定默认值
【发布时间】:2018-01-10 00:55:41
【问题描述】:

我正在尝试在表单中指定默认值,因此在创建实体时,表单字段具有值(不是 null 或空)。然而,当实体被编辑时,它显然应该显示存储的值而不是默认值。

我的实体将自己初始化为构造的一部分 - 因此,当实体是新的且尚未持久化时,应设置这些值。

如何通知 FormType 使用默认值而不是持久化状态?我尝试的一切似乎都表明它是一个或另一个而不是两者?

Symfony 3.2+ 是怎么做到的???

编辑|

控制器:

public function newAction (Request $request)
{
    $quoteItem = new QuoteItem();

    $form = $this->createForm('UniflyteBundle\Form\QuoteItemType', $quoteItem, ['allow_extra_fields' => true]);
    $form->add('QuoteFlight', QuoteFlightType::class);
}

表格类型:

public function configureOptions (OptionsResolver $resolver)
{
    $resolver->setDefaults([
      //'data' => new \UniflyteBundle\Entity\QuoteFlight()
      'data_class' => QuoteFlight::class
    ]);
}


public function buildForm (FormBuilderInterface $builder, array $options)
{
      $builder
      ->add('specMajorSetupCharge', null, [
        //'empty_data' => QuoteFlight::SPEC_MAJOR_SETUP_CHARGE,
        'data'  => QuoteFlight::SPEC_MAJOR_SETUP_CHARGE,
        'label' => '* Setups Charge'
      ])
      // ...
}

【问题讨论】:

  • 你的代码是什么样的?
  • 对不起 - 我错过了 :)
  • 如果我明确设置“数据”,那么这就是表单中始终显示的内容,基本上覆盖了实体值。我不明白为什么在构造实体时不使用实体的默认值 - 从数据库加载实体时也是如此
  • 您是否有权访问buildForm 中的实体?
  • 我同意 - 我只是意识到我的错误:o 我的错。我有一个嵌入到另一个表单中的表单,每个表单有两个实体。我正在实例化的实体是最外层的实体,但我正在测试的表单绑定到最内层的实体。在我提交表单之前,该实体实际上并不存在。解决方法是在将父实体绑定到表单之前创建并设置最里面的实体。对此感到抱歉:)

标签: php symfony symfony-3.2


【解决方案1】:

回答我自己的问题并避免将来给任何人造成混淆:

$quoteItem = new QuoteItem();

// THIS LINE WAS MISSING
$quoteItem->setQuoteFlight(new QuoteFlight()); 

$form = $this->createForm('UniflyteBundle\Form\QuoteItemType', $quoteItem, ['allow_extra_fields' => true]);
$form->add('QuoteFlight', QuoteFlightType::class);

如果没有添加的行,则在创建期间呈现表单时 QuoteFlight 实体为 NULL。

【讨论】:

    【解决方案2】:

    http://symfony.com/doc/current/components/form.html#setting-default-values

    如果您需要在表单中加载一些默认值(或者您正在构建“编辑”表单),只需在创建表单构建器时传入默认数据即可。

    $quoteItem = new QuoteItem();
    $quoteItem->getQuoteFlight()->setSpecMajorSetupCharge(QuoteFlight::SPEC_MAJOR_SETUP_CHARGE).
    
    $form = $this->createForm(QuoteItemType::class, $quoteItem);
    // ...
    

    使用data 选项不好,因为:

    http://symfony.com/doc/current/reference/forms/types/form.html#data

    渲染时数据选项总是覆盖从域数据(对象)中获取的值。这意味着当表单编辑一个已经持久化的对象时,对象值也会被覆盖,导致它在提交表单时丢失它的持久化值。

    因此建议在初始化时明确设置带下划线的对象中的数据,无论是在__constructor() 中还是在将对象绑定到表单之前。

    【讨论】:

    • 原来如此:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多