Symfony2表单第3级集合未显示

时间:2014-02-03 15:29:43

标签: forms symfony collections twig multi-level

也许对我所需要的东西有完全不同和更好的方法,但这是我的情况,欢迎任何意见/建议。 我有实体:

/**
 * @var string
 * @ORM\Column(name="title", type="string", length=255, nullable=true)
 */
protected $title;

/**
 * @var string
 * @ORM\Column(name="description", type="string", length=1024, nullable=true)
 */
protected $description;

/**
 * @var string
 * @ORM\Column(name="extra_data", type="json_array", nullable=true)
 */
protected $extraData;

注意$extraData - 这就是json_array

我有FormType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('items', 'collection', array(
        'type' => new ItemType(),
        'allow_add' => true,
        'by_reference' => false,
        'allow_delete' => true,
        'options' => array(
            'em' => $options['em'],
        )
    ));
}


public function getName()
{
    return 'form';
}

的ItemType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title', 'text', array(
            'label' => false,
            'required' => false,
        ))
        ->add('description', 'textarea', array(
            'label' => false,
        ))
        ->add('extra_data', 'collection', array(
            'type' => new ItemExtraDataType(),
            'required' => false,
            'allow_add' => false,
            'by_reference' => false,
            'allow_delete' => false,
        ));
}

public function getName()
{
    return 'item';
}

ItemExtraDataType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('field1', 'text', array(
            'required' => false,
        ))
        ->add('field2', 'text', array(
            'required' => false,
        ));
}

public function getName()
{
    return 'item_extra_data';
}

在Twig:

<form method="post" action="" id="form">
{% for item in form.items %}
    {{ form_row(item.title) }}
    {{ form_row(item.description) }}
    {{ form_row(item.extra_data) }}
    {{ form_rest(item) }}
{% endfor %}
{{ form_rest(form) }}
</form>

也尝试过:

{% for field, value in item.extra_data %}
{{ form_row(value) }}<br><br>
{% endfor %}

并尝试离开{{ form_rest(item) }},但没有改变。

因此永远不会打印出field1field2。我无法输入这些JSON数组字段的值。也许我用它错了?另外,我想知道如何保存这个json_array字段。

由于

P.S。使用Symfony 2.3.7

1 个答案:

答案 0 :(得分:0)

Bellow我要离开旧答案,这对我有用,直到我必须实现更复杂的json_array。这是应该如何做的:

的ItemType:

->add('extra_data', new ItemExtraDataType(), array(
    'label' => false,
    'required' => false,
))

ItemExtraDataType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('field1', 'text', array(
            'required' => false,
            'label' => false,
        ))
        ->add('field2', 'text', array(
            'required' => false,
            'label' => false,
        ))
        ->add('field3', 'choice', array(
            'choices' => MyChoices::getReadables(),
            'empty_value' => 'empty',
            'required' => false,
            'label' => false,
        ))
    ;
}

public function getParent()
{
    return 'form';
}

Twig模板:

{{ form_row(item.extra_data) }}

所以现在一切都按预期工作了。



旧答案

我相信有一个更好的解决方案,但这就是我所做的,并且最终有效。

实体:

/**
 * @param array $extra_data
 * @return Entity
 */
public function setExtraData(array $extra_data)
{
    $this->extraData = $extra_data;
    return $this;
}

/**
 * @return array
 */
public function getExtraData()
{
    $rs = $this->extraData;
    return $rs ?: array('field1' => '', 'field2' => '');
}

ItemType(注意type参数):

->add('extra_data', 'collection', array(
    'type' => 'text',
    'label' => false,
    'required' => false,
    'allow_add' => false,
    'by_reference' => false,
    'allow_delete' => false,
))

Twig模板:

{% for field, data in item.extra_data %}
    {{ form_row(data, {'attr':{'placeholder':'extra_data.' ~ field}}) }}
{% endfor %}

两个字段都打印出来并保存没有任何问题。