多対多の関係を持つ 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',
)
));
しかし、「タグ」タイプのデフォルトオプションとして設定するだけで十分です。しかし、なぜ使われていないのでしょうか。