symfony形式集合中的空元素

时间:2015-05-13 15:21:50

标签: php forms symfony

我有一个包含项目集合的简单表单。就像这里描述的那样: http://symfony.com/doc/current/cookbook/form/form_collections.html

问题是当我添加新元素(或多个元素)而没有触及其中的内容(不改变它们的输入)时,我得到一个空集合。

我希望获得一系列添加的元素,无论其内容如何。即使theris字段是空的,也没关系。

在我提交表格后,我有:

var_dump($request->get('my_form_name'));

/* dump result: 
array (size=19)
   ...
   'partners' => 
    array (size=1)
        0 => 
          array (size=2)
            'fullname' => string '' (length=2)
            'manager' => string '' (length=0)
   ...
*/

var_dump($form->getData()->getPartners()); 
// EMPTY!!! WTF? I expect an array of 1 element of Partner class which fields are set to '' and ''

另一方面,如果设置了somethig,则表示没问题:

var_dump($request->get('my_form_name'));

/* dump result: 
array (size=19)
   ...
   'partners' => 
    array (size=1)
        0 => 
          array (size=2)
            'fullname' => string ' NAME HERE ' (length=2)
            'manager' => string '' (length=0)
   ...
*/

var_dump($form->getData()->getPartners()); 
// ok, we have an array of 1 element which is an object of Partner class

任何想法如何摆脱那个错误?

/////////修订///////// 合作伙伴的类映射是:

Bundle\Entity\Partner:
  ...
  fields:
    fullname: 
      type: string
      lenght: 255
      nullable: True
    manager: 
      type: string
      lenght: 255
      nullable: True
  manyToOne:
    owner:
      targetEntity: Step2
      inversedBy: partners
      joinColumn:
        name: owner_id
        referencedColumnName: id

field'合作伙伴'添加到' Step2'的形式实体喜欢'集合'与' allow_add',' allow_delete',' by_reference' = false

2 个答案:

答案 0 :(得分:1)

您需要将第二个参数传递给submit()方法false。它会告诉Form组件,提交空数据不得更改任何现有数据。

$form->submit($request->get('my_form_name'), false);

答案 1 :(得分:0)

好的,我发现了一个问题。

我必须在子表单(合作伙伴类)中设置empty_data

我不明白为什么,但是当相关类(合作伙伴)的所有字段都提交为""(空)时,那么在类sumbit的方法Symfony\Component\Form\Form

            if (FormUtil::isEmpty($viewData)) {
                $emptyData = $this->config->getEmptyData();

                if ($emptyData instanceof \Closure) {
                    /* @var \Closure $emptyData */
                    $emptyData = $emptyData($this, $viewData);
                }

                $viewData = $emptyData;
            }

在$ null中为空字段的合作伙伴提供viewData。对于提交为合作伙伴的对象,其中至少有一个字段为空$viewData是必需对象。

所有这一切都是因为

$this->config->getEmptyData() 

对于空对象Closure最终会产生null,但对于Partner且至少有一个字段不为空,它会提供直接需要的对象。