我需要一些原型内原型的帮助。 Symfony非常聪明地生成表单原型,但是一旦你是一层下来(即原型中的原型),它就会为这两个原型重用$$ name $$。
这就是我的实体的原型字段。 JQuery使用正确的索引值(基于子节点数)交换$$ name $$
<input type="text" id="entry_entities_$$name$$_contactFax" name="entry[entities][$$name$$][contactFax]" value="" />
到目前为止一切顺利。但是当你更深入一级时,Symfony也会将$$ name $$用于下一级 - 这里是实体属性的原型:
<div id="entry_entities_123_properties" data-prototype="
<label for="entry_entities_$$name$$_properties_$$name$$_name">Name</label>
<input type="text" id="entry_entities_$$name$$_properties_$$name$$_name" name="entry[entities][$$name$$][properties][$$name$$][name]" value="" />
这意味着(在此示例中为实体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]"
等
在我看来,解决问题的最佳方法是使用$$ somethingelse $$作为属性 - 有谁知道这是设置的位置 - 或者有没有人有一个完整的例子与JS如何解决这个问题?我开始在每一行上发现/替换第二个$$名称$$,但它变得非常混乱。我确信有一种简单的方法可以做到这一点,但我在互联网上找不到任何指南。
答案 0 :(得分: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;
}
}
然后使用以下命令定义服务:
tags:
- { name: form.type, alias: collection }
并将其用作Symfony的集合,但使用prototype_name参数。
答案 1 :(得分:0)
我不熟悉Symfony,但在Javascript中使用String.replace()
会默认替换第一次出现,所以你可以非常安全地使用它。
$('mydiv').html
(
$('mydiv').html().replace('$$name$$', 123).replace('$$name$$', 456);
);
如果将内容拆分为不同的行,并且您希望替换这些行,则可以使用.split()
将其分解为数组,for()
覆盖它,然后.join()
回到一起。