0

多対多の関係を持つ 2 つのエンティティがあります。

1 つの「エントリ」には n 個の「タグ」があります。ここで、タグ付きの新しいエントリを挿入したいと考えています。このフォームは、javascript を介して動的に追加できる「タグ」フォームのコレクションで構成されています。コントローラ コードには、デフォルトで 1 つのフィールドが追加されます。

フォームがsubmittetを取得し、エントリのタグを反復すると、最初のタグ(javascriptではなくコントローラーに追加されたもの)のみが適切なエンティティタイプを持ちます。他のものは単なる配列です:

object(Entity\Type)[88]
   private 'id' => null
   private 'field' => null
   private 'type' => string 'S' (length=1)

array (size=3)
  'field' => null
  'type' => string 'S' (length=1)

「エントリー」コントローラー:

$entity = new Entry();
$entity->getParameters()->add(new EntryTag());

$form = $this->createForm($this->get('entryform'),$entity);

if($request->getMethod() == 'POST'){
    $form->bindRequest($request);

    $formData = $form->getData();
    foreach ($formData->getParameters() as $par) {
        var_dump($par);
    }
}

「エントリ」タイプ: $this->tagType は、コンストラクターに注入されます。

public function buildForm(FormBuilder $builder, array $options){
    $builder->add('parameters', 'collection', array(
        'type' => $this->tagType,
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
    ));
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Entity\Entry',
    ));
}

「タグ」タイプ:

public function buildForm(FormBuilder $builder, array $options){
    $builder->add('field', 'text', array('label' => 'Key'));
    $builder->add('type', 'choice', array('label' => 'Type', 'required' => false, 'choices' => $this->getTypes()));
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
            'data_class' => 'Entity/Tag',
    ));
}

フィールドを追加するために使用するJavaScript:

var $childs = $container.find('.form-child');

fieldIndindex++; 

var template = $container
            .addClass('form-child')
    .attr('data-prototype')
    .replace(/\$\$name\$\$/g, fieldIndindex);

if($childs.length == 0){
    $container.prepend($template);
}else{
    $childs.last().after($template);
}

では、エンティティのタイプが検出されないのはなぜですか?

編集:

「コレクション」フィールドに「data_class」オプションを追加すると、機能します。

$builder->add('parameters', 'collection', array(
        'type' => $this->parameterType,
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
        'options' => array(
            'data_class' => 'Entity/Tag',
        )
    ));

しかし、「タグ」タイプのデフォルトオプションとして設定するだけで十分です。しかし、なぜ使われていないのでしょうか。

4

1 に答える 1

1

わかった.....

私は2.0でSymfony2.1構文を使用していました。setDefaultオプションをgetDefaultOptionsに変更した後、機能するようになりました。

于 2012-10-08T12:25:44.027 に答える