如何在Symfony表单中指定默认值

时间:2017-08-02 17:03:05

标签: php symfony symfony-3.2

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

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

如何通知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'
      ])
      // ...
}

2 个答案:

答案 0 :(得分:2)

  

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

     

如果您需要使用某些默认值加载表单(或者您正在构建"编辑"表单),只需在创建表单构建器时传入默认数据。

begin
  for cv1 in (select
                  max(S_ID) keep(dense_rank LAST order by N_PROT) S_ID,              
                  NR_PROTOCOLO
                 from N_TRANS 
                 group by N_PROT
                 order by S_ID)
  loop
    for cv2 in (select
                '7' as M_ID,
                 N_PROT as SUBSCRIPTION_VERSION_ID,
                 /* ..... bunch of other business logic */
              from N_TRANS
              where (CORA in ('0215','0320') or CORA in ('0215', '0320'))
                and N_PROT IS NOT null
                and S_ID = cv1.S_ID)
    loop
      -- Processing logic here. To access either loop's data,
      -- prefix the column with cv1 or cv2, like cv2.M_ID, cv1.NR_PROTOCOLO
    end loop;  
  end loop;
end;

使用$quoteItem = new QuoteItem(); $quoteItem->getQuoteFlight()->setSpecMajorSetupCharge(QuoteFlight::SPEC_MAJOR_SETUP_CHARGE). $form = $this->createForm(QuoteItemType::class, $quoteItem); // ... 选项并不好,因为:

  

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

     

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

因此,建议是在初始化时明确设置带下划线的对象中的数据,可以在data中,也可以在将对象绑定到表单之前。

答案 1 :(得分:0)

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

$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。