Symfony 2在原型中形成原型 - 双$$名称字段

mog*_*man 2 php forms jquery symfony symfony-2.0

我需要一些原型内原型的帮助.Symfony非常聪明地生成表单原型,但是一旦你是一层向下(即原型中的原型),它就会为这两个原型重用$$ name $$.

这就是我的实体的原型字段.JQuery使用正确的索引值(基于子节点数)交换$$ name $$

 <input type="text" id="entry_entities_$$name$$_contactFax" name="entry[entities][$$name$$][contactFax]" value="" />
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是当你更深入一级时,Symfony也会将$$ name $$用于下一级 - 这里是实体属性的原型:

<div id="entry_entities_123_properties" data-prototype="    
    &lt;label for=&quot;entry_entities_$$name$$_properties_$$name$$_name&quot;&gt;Name&lt;/label&gt;
    &lt;input type=&quot;text&quot; id=&quot;entry_entities_$$name$$_properties_$$name$$_name&quot; name=&quot;entry[entities][$$name$$][properties][$$name$$][name]&quot; value=&quot;&quot; /&gt;
Run Code Online (Sandbox Code Playgroud)

这意味着(在此示例中为实体ID 123)所有属性都获得ID 123:

name="entry[entities][123][properties][123][name]"
name="entry[entities][123][properties][123][name]"
name="entry[entities][123][properties][123][name]"
Run Code Online (Sandbox Code Playgroud)

等等

在我看来,解决这个问题的最好方法是使用$$ somethingelse $$作为属性 - 有谁知道这个设置在哪里 - 或者有没有人有一个完整的例子与JS如何解决这个问题?我开始在每一行上发现/替换第二个$$名称$$,但它变得非常混乱.我确信有一种简单的方法可以做到这一点,但我在互联网上找不到任何指南.

mez*_*eze 5

此代码适用于symfony 2.0(在2.1+中,您只需将名称传递给prototype()函数):

您可以使用所需选项创建自己的集合类型:

<?php

namespace YourBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Extension\Core\EventListener\ResizeFormListener;
use Symfony\Component\Form\Extension\Core\Type\CollectionType as BaseCollectionType;

class CollectionType extends BaseCollectionType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilder $builder, array $options)
    {
        if ($options['allow_add'] && $options['prototype']) {
            $prototype = $builder->create($options['prototype_name'], $options['type'], $options['options']);
            $builder->setAttribute('prototype', $prototype->getForm());
        }

        $listener = new ResizeFormListener(
            $builder->getFormFactory(),
            $options['type'],
            $options['options'],
            $options['allow_add'],
            $options['allow_delete']
        );

        $builder
            ->addEventSubscriber($listener)
            ->setAttribute('allow_add', $options['allow_add'])
            ->setAttribute('allow_delete', $options['allow_delete'])
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function getDefaultOptions(array $options)
    {
        $defaultOptions = parent::getDefaultOptions($options);
        $defaultOptions['prototype_name'] =  '$$name$$';
        return $defaultOptions;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后只需定义一个服务:

tags:
    - { name: form.type, alias: collection }
Run Code Online (Sandbox Code Playgroud)

并将其用作Symfony的集合,但使用prototype_name参数.