【问题标题】:Symfony2 Form 3rd level collection not showing upSymfony2 Form 3rd 级集合未显示
【发布时间】:2014-02-03 15:29:42
【问题描述】:

也许有完全不同和更好的方法来满足我的需要,但这是我的情况,欢迎任何 cmets/建议。 我有实体:

/**
 * @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';
}

物品类型:

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';
}

在树枝中:

<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 字段。

谢谢

附:使用 Symfony 2.3.7

【问题讨论】:

    标签: forms symfony collections twig multi-level


    【解决方案1】:

    下面我要离开旧的答案,它对我有用,直到我不得不实现更复杂的 json_array。应该这样做:

    物品类型:

    ->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';
    }
    

    树枝模板:

    {{ 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,
    ))
    

    树枝模板:

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

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

    【讨论】:

    • 所以这对我来说不再适用了,因为我现在需要在 extra_data 中将 field3 设置为 choice 类型
    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多