Javascript Symfony 4-添加未提交Jquery的CollectionType表单的子项

Javascript Symfony 4-添加未提交Jquery的CollectionType表单的子项,javascript,php,jquery,forms,symfony,Javascript,Php,Jquery,Forms,Symfony,我在我的实体“OrdRecommission”上有一个表格,其中包含儿童实体“OrdRecommissionFraisDrivers”,其集合类型为: php(父类) OrdreMissionFraisDivers.php(子类) OrdreMissionType.php(OrdreMissionType的表单类) ordremissionfraisdiversype.php(OrdreMissionFraisDivers的表单类) 在我的控制器中创建表单 $odm = new Ordr

我在我的实体“OrdRecommission”上有一个表格,其中包含儿童实体“OrdRecommissionFraisDrivers”,其集合类型为:

php(父类)

OrdreMissionFraisDivers.php(子类)

OrdreMissionType.php(OrdreMissionType的表单类)

ordremissionfraisdiversype.php(OrdreMissionFraisDivers的表单类)

在我的控制器中创建表单

    $odm = new OrdreMission();
    $odmtpe = new OrdreMissionFraisDivers();
    $odmtpe->setLibelle('test')->setMontant(15); 
    $odm->addFraisDiver($odmtpe); //i add a child before creating the form to test the mapping

    $form = $this->createForm(OrdreMissionType::class, $odm,[
        'user' => $user,
        'affairesOdm' => $affairesForm,
        'method' => 'PUT'
    ]);

    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid()) {
        $odm = $form->getData();
        $odm->setEtat('C');
        $odm->setDemandeur($demandeur);
        $odm->setSalarie($user);

       dd($odm);

        $em = $this->getDoctrine()->getManager();
        $em->persist($odm);
        $em->flush();
    }

    return $this->render('pages/pointage/odm/creation.html.twig', [
        'form' => $form->createView(),
    ]);
我的视图(我正在使用一个原型在表单中动态添加child,问题就出在这里)

{%macro-printFraisDiversRow(fraisDiversForm)%}
{{form_row(fraisDiversForm.libelle)}
{{表格(fraisDiversForm.montantJour)}
{{form_row(fraisDiversForm.montant)}
{%endmacro%}
赔偿类型
蒙塔特(欧元/日)
蒙塔特(欧元/特派团)
行动
jQuery(文档).ready(函数(){
$collectionHolder=$('tbody.fraisDivers');
$collectionHolder.append($newLinkLi);
$collectionHolder.data('index',$collectionHolder.find(':input').length);
$addFraisDiversButton.on('click',函数(e){
addFraisDiversForm($collectionHolder,$newLinkLi);
});
});
函数addFraisDiversForm($collectionHolder,$newLinkLi){
设thead=$('thead.fraisDiversHead');
让prototype=$collectionHolder.data('prototype');
让index=$collectionHolder.data('index');
让newForm=原型;
newForm=newForm.replace(/\u\u name\u\u/g,索引);
$collectionHolder.data('index',index+1);
让$newFormLi=$('').append(newForm);
AddFraisDriversDeleteLink($newFormLi);
$newLinkLi.before($newFormLi);
};
我的问题是:当我在表单中添加新的子项时,此子项未提交。我认为这是我的原型或宏的问题,但我不知道我忘记了做什么。 在创建表单之前,我在控制器中声明的子级在我提交此表单时发送,如调试图片中所示

提交表单后进行调试:

编辑:下面是表单底部的子项生成的DOM:

<fieldset class="form-group">
    <div id="ordre_mission_fraisDivers">
        <fieldset class="form-group">
            <div id="ordre_mission_fraisDivers_0">
                <div class="form-group">
                    <input type="text" id="ordre_mission_fraisDivers_0_libelle" name="ordre_mission[fraisDivers][0][libelle]" required="required" class="form-control" value="test">
                    </div>
                 <div class="form-group">
                     <div class="input-group">
                         <input type="text" id="ordre_mission_fraisDivers_0_montantJour" name="ordre_mission[fraisDivers][0][montantJour]" disabled="disabled" required="required" class="montantJour form-control">
                         <div class="input-group-append">
                             <span class="input-group-text"> €</span>
                         </div>
                     </div>
                 </div>
                 <div class="form-group">
                     <div class="input-group">
                         <input type="text" id="ordre_mission_fraisDivers_0_montant" name="ordre_mission[fraisDivers][0][montant]" required="required" class="montantTotal form-control" value="15,00"> 
                             <div class="input-group-append">
                                 <span class="input-group-text"> €</span>
                             </div>
                         </div>
                     </div>
                 </div>
             </fieldset>
         </div>
 </fieldset>

€
€
在表上生成的DOM(添加1个子项后):



我相信问题可能与此类似:在任何情况下:您都应该仔细查看生成的dom/html和创建的表单元素的
name
s。您省略了代码,其中呈现了现有的子级…我通过添加生成的DOM更新了我的问题。如您所见,在这两种情况下都正确生成了名称和ID。这可能是一个愚蠢的问题,但这是否也是在
中创建的内容?
class OrdreMissionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('fraisDivers', CollectionType::class, [
            'label' => false,
            'entry_type' => OrdreMissionFraisDiversType::class,
            'entry_options' => ['label' => false],
            'allow_add' => true,
            'by_reference' => false,
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => OrdreMission::class
        ]);
    }
}
class OrdreMissionFraisDiversType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder->add('libelle', TextType::class, [
            'label' => false
        ]);
        $builder->add('montantJour', MoneyType::class, [
            'label' => false,
            'mapped' => false,
            'disabled' => true,
            'attr' => ['class' => 'montantJour']
        ]);
        $builder->add('montant', MoneyType::class, [
            'label' => false,
            'attr' => ['class' => 'montantTotal']
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => OrdreMissionFraisDivers::class,
        ]);
    }
}
    $odm = new OrdreMission();
    $odmtpe = new OrdreMissionFraisDivers();
    $odmtpe->setLibelle('test')->setMontant(15); 
    $odm->addFraisDiver($odmtpe); //i add a child before creating the form to test the mapping

    $form = $this->createForm(OrdreMissionType::class, $odm,[
        'user' => $user,
        'affairesOdm' => $affairesForm,
        'method' => 'PUT'
    ]);

    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid()) {
        $odm = $form->getData();
        $odm->setEtat('C');
        $odm->setDemandeur($demandeur);
        $odm->setSalarie($user);

       dd($odm);

        $em = $this->getDoctrine()->getManager();
        $em->persist($odm);
        $em->flush();
    }

    return $this->render('pages/pointage/odm/creation.html.twig', [
        'form' => $form->createView(),
    ]);
{% macro printFraisDiversRow(fraisDiversForm) %}
    <td>{{ form_row(fraisDiversForm.libelle) }}</td>
    <td>{{ form_row(fraisDiversForm.montantJour) }}</td>
    <td>{{ form_row(fraisDiversForm.montant) }}</td>
{% endmacro %}

<table class="table">
    <thead class="thead-light fraisDiversHead" style="display: none">
        <tr>
            <th scope="col">Type d'indemnité</th>
            <th scope="col">Montant (€/jour)</th>
            <th scope="col">Montant (€/mission)</th>
            <th scope="col">Action</th>
        </tr>
    </thead>
        <tbody class="fraisDivers"  data-prototype="{{ 
          formMacros.printFraisDiversRow(form.fraisDivers.vars.prototype) | e('html_attr') }}">

        </tbody>
</table>

<script>
    jQuery(document).ready(function() {
        $collectionHolder = $('tbody.fraisDivers');
        $collectionHolder.append($newLinkLi);
        $collectionHolder.data('index', $collectionHolder.find(':input').length);
        $addFraisDiversButton.on('click', function(e) {
            addFraisDiversForm($collectionHolder, $newLinkLi);
        });
    });

    function addFraisDiversForm($collectionHolder, $newLinkLi) {
        let thead = $('thead.fraisDiversHead');
        let prototype = $collectionHolder.data('prototype');
        let index = $collectionHolder.data('index');
        let newForm = prototype;
        newForm = newForm.replace(/__name__/g, index);
        $collectionHolder.data('index', index + 1);
        let $newFormLi = $('<tr></tr>').append(newForm);
        addFraisDiversDeleteLink($newFormLi);
        $newLinkLi.before($newFormLi);
    };
</script>
<fieldset class="form-group">
    <div id="ordre_mission_fraisDivers">
        <fieldset class="form-group">
            <div id="ordre_mission_fraisDivers_0">
                <div class="form-group">
                    <input type="text" id="ordre_mission_fraisDivers_0_libelle" name="ordre_mission[fraisDivers][0][libelle]" required="required" class="form-control" value="test">
                    </div>
                 <div class="form-group">
                     <div class="input-group">
                         <input type="text" id="ordre_mission_fraisDivers_0_montantJour" name="ordre_mission[fraisDivers][0][montantJour]" disabled="disabled" required="required" class="montantJour form-control">
                         <div class="input-group-append">
                             <span class="input-group-text"> €</span>
                         </div>
                     </div>
                 </div>
                 <div class="form-group">
                     <div class="input-group">
                         <input type="text" id="ordre_mission_fraisDivers_0_montant" name="ordre_mission[fraisDivers][0][montant]" required="required" class="montantTotal form-control" value="15,00"> 
                             <div class="input-group-append">
                                 <span class="input-group-text"> €</span>
                             </div>
                         </div>
                     </div>
                 </div>
             </fieldset>
         </div>
 </fieldset>
<table class="table">
    <!-- thead -->
    <tbody class="fraisDivers" data-prototype="<!-- prototype generated -->">
        <tr>    
            <td>
                <div class="form-group">
                    <input type="text" id="ordre_mission_fraisDivers_1_libelle" name="ordre_mission[fraisDivers][1][libelle]" required="required" class="form-control">
                </div>
            </td>
            <td>
                <div class="form-group">
                    <div class="input-group">
                        <input type="text" id="ordre_mission_fraisDivers_1_montantJour" name="ordre_mission[fraisDivers][1][montantJour]" disabled="disabled" required="required" class="montantJour form-control">
                        <div class="input-group-append">
                            <span class="input-group-text"> €</span>
                        </div>
                    </div>
                </div>
            </td>
            <td>
                <div class="form-group">
                    <div class="input-group">
                        <input type="text" id="ordre_mission_fraisDivers_1_montant" name="ordre_mission[fraisDivers][1][montant]" required="required" class="montantTotal form-control">
                        <div class="input-group-append">
                            <span class="input-group-text"> €</span>
                        </div>
                    </div>
                </div>
            </td>
            <td>
                <button type="button" class="btn btn-outline-danger">
                    <i class="fas fa-trash-alt"></i>
                </button>
            </td>
        </tr>
        <tr>
            <button type="button" class="btn btn-secondary add_tag_link">
                <i class="fas fa-plus" style="margin-right: 5px"></i> 
                Ajouter un frais
            </button>
        </tr>
    </tbody>
</table>