Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 2在原型中形成原型-双$$name字段_Php_Jquery_Forms_Symfony_Symfony 2.0 - Fatal编程技术网

Php Symfony 2在原型中形成原型-双$$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$$进行可怕的查找/替换,但它变得非常混乱。我相信有一

我需要一些关于原型中的原型的帮助。Symfony在生成表单原型方面非常聪明,但一旦您向下一层(即原型中的原型),它将为两个原型重用$$name$$

这就是我的实体的原型字段的外观。JQuery用正确的索引值(基于子节点的数量)交换出$$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 }