我一直在学习Symfony 3教程中有关嵌入表单集合的embedding,我想将其扩展到更深层次的嵌套。我查看了一些资料,虽然Symfony 2有部分答案,但并不全面(而且没有针对3的)。
如果我们以教程中
到目前为止,我认为我理解了表单类:
但是此时我不确定原型和JavaScript如何工作。有人能解释一下我该如何进行下一步吗?这是否是正确的方法?
我的第一个想法是,如果我们要添加其他级别,可能最好将JS泛化为任意数量的级别,因为教程使用的JS仅适用于单个级别。
我能找到的最接近可行的代码是这个堆栈溢出答案here。然而,它似乎没有像描述的那样工作,我很难弄清楚问题出在哪里。
如果我们以教程中
Task
有多个Tag
为例,那么如何编写代码使其扩展到:Task
有多个Tag
,每个Tag
都有多个SubTag
?到目前为止,我认为我理解了表单类:
Task:
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('description');
$builder->add('tags', CollectionType::class, array(
'entry_type' => TagType::class,
'allow_add' => true,
'by_reference' => false,
'allow_delete' => true
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Task',
));
}
}
标签:
class TagType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
$builder->add('sub_tags', CollectionType::class, array(
'entry_type' => SubTagType::class,
'allow_add' => true,
'by_reference' => false,
'allow_delete' => true
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Tag',
));
}
}
子标签:
class SubTagType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\SubTag',
));
}
}
还有基本的Twig类:
{{ form_start(form) }}
{# render the task's only field: description #}
{{ form_row(form.description) }}
<h3>Tags</h3>
<ul class="tags">
{# iterate over each existing tag and render its only field: name #}
{% for tag in form.tags %}
<li>{{ form_row(tag.name) }}</li>
{% for sub_tag in tag.sub_tags %}
<li>{{ form_row(sub_tag.name) }}</li>
{% endfor %}
{% endfor %}
</ul>
{{ form_end(form) }}
但是此时我不确定原型和JavaScript如何工作。有人能解释一下我该如何进行下一步吗?这是否是正确的方法?
我的第一个想法是,如果我们要添加其他级别,可能最好将JS泛化为任意数量的级别,因为教程使用的JS仅适用于单个级别。
我能找到的最接近可行的代码是这个堆栈溢出答案here。然而,它似乎没有像描述的那样工作,我很难弄清楚问题出在哪里。