Php Symfony 2在原型中形成原型-双$$name字段
我需要一些关于原型中的原型的帮助。Symfony在生成表单原型方面非常聪明,但一旦您向下一层(即原型中的原型),它将为两个原型重用$$name$$ 这就是我的实体的原型字段的外观。JQuery用正确的索引值(基于子节点的数量)交换出$$name$$ 等等Php Symfony 2在原型中形成原型-双$$name字段,php,jquery,forms,symfony,symfony-2.0,Php,Jquery,Forms,Symfony,Symfony 2.0,我需要一些关于原型中的原型的帮助。Symfony在生成表单原型方面非常聪明,但一旦您向下一层(即原型中的原型),它将为两个原型重用$$name$$ 这就是我的实体的原型字段的外观。JQuery用正确的索引值(基于子节点的数量)交换出$$name$$ 等等 在我看来,解决这个问题的最佳方法是使用$$somethingelse$$作为属性-有人知道这是在哪里设置的吗-或者有人有一个完整的JS示例来解决这个问题吗?我开始对每一行的第二个$$name$$进行可怕的查找/替换,但它变得非常混乱。我相信有一
在我看来,解决这个问题的最佳方法是使用$$somethingelse$$作为属性-有人知道这是在哪里设置的吗-或者有人有一个完整的JS示例来解决这个问题吗?我开始对每一行的第二个$$name$$进行可怕的查找/替换,但它变得非常混乱。我相信有一种简单的方法可以做到这一点,但我在互联网上找不到任何指南。我不熟悉Symfony,但在Javascript中使用
String.replace()
默认情况下只替换第一次出现的内容,因此您可以非常安全地使用它
$('mydiv').html
(
$('mydiv').html().replace('$$name$$', 123).replace('$$name$$', 456);
);
如果将内容拆分为不同的行,并且您希望替换这些行中的内容,您可以使用
.split()
将其拆分为一个数组,for()
覆盖它,然后.join()
将其重新组合在一起。此代码适用于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;
}
}
并将其用作Symfony的集合,但使用prototype_name参数。如果在prototype()函数中传递“$$name$$”,您不能在那里更改它吗?实际上,我在发布此消息后查看了Symfony代码$$名称$$硬编码到CollectionType中。查看Symfony\Component\Form\Extension\Core\Type\CollectionType.phpRight@谢谢你。我不确定你是否让我的日子过得更好:-)我是做一些JS黑客还是在SF2.1测试版上运行我的项目?取决于你有多少时间;)2.1测试版尚未发布。您还可以使用“prototype_name”选项定义自己的集合类型(请参见下面的答案)。感谢您的回答-我相信您的想法会奏效,但结果会是大量Javascript。Meze的答案符合Symfony2最佳实践。很公平:)主要作为选项发布,希望有人能提出与Symfony相关的解决方案。很高兴你找到了一种让你满意的方法。我在三天的努力重写和区分占位符后看到了这个答案。我希望早点看到它+10000000 !@雷诺伊布好!但请记住,这是对2.0的黑客攻击。从v2.1开始,您只需将名称传递给
prototype()
函数即可。
name="entry[entities][123][properties][123][name]"
name="entry[entities][123][properties][123][name]"
name="entry[entities][123][properties][123][name]"
$('mydiv').html
(
$('mydiv').html().replace('$$name$$', 123).replace('$$name$$', 456);
);
<?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 }