Javascript Symfony 4-添加未提交Jquery的CollectionType表单的子项
我在我的实体“OrdRecommission”上有一个表格,其中包含儿童实体“OrdRecommissionFraisDrivers”,其集合类型为: php(父类) OrdreMissionFraisDivers.php(子类) OrdreMissionType.php(OrdreMissionType的表单类) ordremissionfraisdiversype.php(OrdreMissionFraisDivers的表单类) 在我的控制器中创建表单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
$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>