2

プロトタイプ内にあるプロトタイプについて助けが必要です。symfonyはフォームのプロトタイプを生成するのに非常に巧妙ですが、1つ下のレイヤー(つまり、プロトタイプ内のプロトタイプ)になると、両方のプロトタイプに$$name$$を再利用します。

これは、私のエンティティのプロトタイプフィールドがどのように見えるかです。JQueryは$$name$$を正しいインデックス値(子ノードの数に基づく)と交換します

 <input type="text" id="entry_entities_$$name$$_contactFax" name="entry[entities][$$name$$][contactFax]" value="" />

ここまでは順調ですね。しかし、1レベル深くなると、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;

これは、(この例ではエンティティID 123で)すべてのプロパティがID123を取得することを意味します。

name="entry[entities][123][properties][123][name]"
name="entry[entities][123][properties][123][name]"
name="entry[entities][123][properties][123][name]"

私の意見では、この問題を解決する最善の方法は、プロパティに$$ somethingelse $$を使用することです-これがどこに設定されているかを知っている人はいますか?または、これを解決する方法についてJSの完全な例を持っている人はいますか?各行の2番目の$$name$$の恐ろしい検索/置換に着手しましたが、非常に面倒になりました。これを行う簡単な方法があると確信していますが、インターネット上でガイドを見つけることができませんでした。

4

2 に答える 2

5

このコードはsymfony2.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パラメーターを使用します。

于 2012-02-24T10:18:55.600 に答える
0

私はSymfonyに精通していませんがString.replace()、Javascriptで使用すると、デフォルトで最初のオカレンスのみが置き換えられるため、かなり安全に使用できます。

$('mydiv').html
(
    $('mydiv').html().replace('$$name$$', 123).replace('$$name$$', 456);
);

物事が別の行に分割されていて、それらの行を置き換えたい場合は、.split()それを配列に分割し、そのfor()上に配置してから、元.join()に戻すことができます。

于 2012-02-24T09:42:18.960 に答える