Bonjour , Si quelqu'un peut m'aider, j'ai un soucis sur un formulaire dynamique dans une collection.
AppointType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('profs', EntityType::class, [
// looks for choices from this entity
'class' => Professeur::class,
'placeholder' => 'Selectionner un Professeur',
'required' => true,
'attr' => [
'class' => 'profs_Select',
],
])
->add('times', ChoiceType::class, [
'attr' => [
'class' => 'time_Select',
],
])
;
$builder->get('profs')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$this->addTimeField($form->getParent(), $form->getData());
}
);
}
private function addTimeField(FormInterface $form, ?Professeur $prof)
{
$builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
'times',
EntityType::class,
null,
[
'class' => TimeSlot::class,
'placeholder' => $prof ? 'Sélectionnez votre TimeSlot' : 'Sélectionnez votre professeur',
'attr' => [
'class' => 'time_Select',
],
'mapped' => false,
'required' => true,
'auto_initialize' => false,
'query_builder' => function (EntityRepository $er) use ($prof) {
return $er->createQueryBuilder('t')
->where('t.is_available = true')
->andWhere('t.prof = :prof')
->setParameter('prof', $prof)
;
},
'choice_value' => function (?TimeSlot $time) {
return $time ? $time->getTime() : '';
}
]
);
$form->add($builder->getForm());
}
public function __construct(EntityManagerInterface $em) {
$this->em = $em;
}
ParentsType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nom')
->add('prenom')
->add('nom_app')
->add('prenom_app')
->add('mail')
->add('phone')
->add('appoints', CollectionType::class, [
'entry_type' => AppointsType::class,
'by_reference' => false,
'allow_add' => true,
'allow_delete' => true,
'error_bubbling' => false,
'entry_options' => [
'attr' => ['class' => 'appoints-box'],
],
])
;
}
Ma vue Twig
{{ form_start(form) }}
<div class="card devis-form">
<!-- Step 1 -->
<div id="clientinfo" class="card-body p-5 step">
<div class="row pt-3">
<div class="col-md-6 col-6 col-lg-6">
{{ form_row(form.nom, {
'label': 'Nom :' ,
}
)}}
</div>
<div class="col-md-6 col-12 col-lg-6">
{{ form_row(form.prenom, {
'label': 'Prénom :' ,
}
)}}
</div>
</div>
<div class="row pt-3">
<div class="col-md-6 col-6 col-lg-6">
{{ form_row(form.nom_app, {
'label': 'Nom de l\'apprent(e):' ,
}
)}}
</div>
<div class="col-md-6 col-12 col-lg-6">
{{ form_row(form.prenom_app, {
'label': 'Prénom de l\'apprent(e):' ,
}
)}}
</div>
</div>
<div class="row pt-3">
<div class="col-md-6 col-6 col-lg-6">
{{ form_row(form.mail, {
'label': 'E-mail :' ,
}
)}}
</div>
<div class="col-md-6 col-12 col-lg-6">
{{ form_row(form.phone, {
'label': 'Télephone :' ,
}
)}}
</div>
</div>
<div class="text-left text-muted" style="font-size:.7em;"><b style="color: #dc3545">*</b> Champs obligatoire</div>
</div>
<div class="card-body p-5 step" style="display: none" id="rendez-vous">
{{ form_label(form.appoints) }}
{{ form_errors(form.appoints) }}
<ul id="appoints-fields-list"
data-prototype="{{ form_widget(form.appoints.vars.prototype)|e }}"
data-widget-tags="{{ '<li></li>'|e }}"
data-widget-counter="{{ form.appoints|length }}"
>
{% for appoints in form.appoints %}
<li class="form-rdv">
{{ form_errors(appoints) }}
{{ form_widget(appoints) }}
</li>
{% endfor %}
</ul>
<button type="button"
class="rendez-vous-add"
data-list-selector="#appoints-fields-list">Add another email</button>
</div>
<div class="card-footer">
<div class="d-flex flex-row-reverse bd-highlight">
<a class="action back btn btn-sm btn-outline-warning bd-highlight m-2" style="display: none">Précédent</a>
<a class="action next btn btn-sm btn-outline-secondary ms-auto bd-highlight m-2" disabled="" data-button="save">Suivant</a>
<button class="action submit btn btn-sm btn-outline-success ms-auto bd-highlight m-2" style="display: none">Envoyer</button>
</div>
</div>
</div>
{{ form_end(form) }}
Mon Jquery
//Pour le formulaire dynamique
$(document).on('change', '.profs_Select ', function() {
let $field = $(this)
let $degreeField = $('.profs_Select')
let $form = $field.closest('form')
// Les données à envoyer en Ajax
let data = {}
data[$degreeField.attr('name')] = $degreeField.val()
data[$field.attr('name')] = $field.val()
// On soumet les données
$.post($form.attr('action'), data).then(function(data) {
// On récupère le nouveau <select>
let $input = $(data).find('.time_Select')
// On remplace notre <select> actuel
$('.time_Select').replaceWith($input)
$('.time_Select').prop("disabled", false);
})
});
//Ajouter ma collection
jQuery('.rendez-vous-add').click(function (e) {
var list = jQuery(jQuery(this).attr('data-list-selector'));
var counter = list.data('widget-counter') || list.children().length;
var newWidget = list.attr('data-prototype');
newWidget = newWidget.replace(/__name__/g, counter);
counter++;
list.data('widget-counter', counter);
var newElem = jQuery(list.attr('data-widget-tags')).html(newWidget);
newElem.appendTo(list);
});
Ce que je veux
Ce que je veux que le parent (ParentsType) peut ajouter un ou plusieur rendez vous avec des profs, à la selection du prof, on lui affiche les créneaux disponible(AppointType)
Il peut ajouter par exemple 10 rendez avec 10 profs differents
Ce que j'obtiens
ce que j'obtiens avec mon code que à la selection du prof j'ai bien les créneau disponible , mais on ajoutant un nouveau ça me mets deux select pour le times, si j'aijoute un nouveau rdv ça me mets 3 select de temps....
J'espète que j'etais claire.
Je vous remercie d'avance pour votre aide.