Bonjour bonjour,
Voila je rencontre un petit problème avec mon code Symfony.
J'ai un formulaire avec une variable "Dossier" et une variable "Emplacement".
Mon entité Dossier contient plusieurs Emplacements alors qu'un Emplacement n'appartient qu'à un Dossier. OneToMany.
J'aimerai que lorsque je selectionne un dossier dans mon formulaire, ce soit les emplacements correspondant qui saffichent dans mon select emplacements ... j'ai donc suivit la doc symfony : https://symfony.com/doc/master/form/dynamic_form_modification.html
Voilà mon code :
Mon Formulaire :
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class, array('label' => 'Télecharger'))
->add('dossier', EntityType::class, array(
'class' => 'AMContentManagerBundle:Dossier',
'choice_label' => 'nom',
))
->add('piece', EntityType::class, array(
'class' => 'AMCoreBundle:Piece',
'choice_label' => 'nom',
'expanded' => true,
'multiple' => false,
))
->add('save', SubmitType::class,
array('label' => 'Ajouter'));
var_dump($builder);
$formModifier = function (FormInterface $form, Dossier $dossier = null) {
$emplacements = null === $dossier ? array() : $dossier->getAvailableEmplacements();
$form->add('emplacement', EntityType::class, array(
'class' => 'AMContentManagerBundle:Emplacement',
'placeholder' => '',
'choices' => $emplacements,
));
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
// this would be your entity, i.e. SportMeetup
$data = $event->getData();
$formModifier($event->getForm(), $data->getDossier());
}
);
$builder->get('dossier')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
var_dump('entre');
// It's important here to fetch $event->getForm()->getData(), as
// $event->getData() will get you the client data (that is, the ID)
$dossier = $event->getForm()->getData();
// since we've added the listener to the child, we'll have to pass on
// the parent to the callback functions!
$formModifier($event->getForm()->getParent(), $dossier);
}
);
}
Mon controlleur :
$image = new Image();
$form = $this->get('form.factory')->create(ImageType::class, $image, array(
'action' => $this->generateUrl('ContentManager_image_list', array('dossier' => $dossier))
));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if($dossier = 'Galerie'){
$Thumb = $this->get('helper.imageresizer')->resizeImage($image->getFile(), $path, $height=105, $width=140);
}
if($dossier = 'Activites'){
$Thumb = $this->get('helper.imageresizer')->resizeImage($image->getFile(), $path, $height=150, $width=200);
}
$image->setUrlThumbnail($Thumb);
$em = $this->getDoctrine()->getManager();
$em->persist($image);
$em->flush();
$request->getSession()->getFlashBag()->add('notice', 'Image bien créée');
return $this->redirectToRoute('ContentManager_image_home');
}
// L'appel de la vue ne change pas
return $this->render('AMContentManagerBundle:Image:list.html.twig', array(
'form' => $form->createView(),
));
et enfin ma vue ;
{% block body %}
{{ form_start(form) }}
{# -- Image -- #}
<div class="form-group" id="formImage" >
{{ form_label(form.file, "Image", {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(form.file) }}
{{ form_widget(form.file) }}
</div>
{# -- Dossier -- #}
<div class="form-group" id="formDossier" >
{{ form_label(form.dossier, "Dossier", {'label_attr': {'class': 'control-label dossierchange'}}) }}
{{ form_errors(form.dossier) }}
{{ form_widget(form.dossier) }}
</div>
{{ form_row(form.emplacement) }}
<div class="form-group">
{{ form_rest(form) }}
</div>
{{ form_end(form) }}
{% endblock %}
{% block javascripts %}
<script>
$(function(){
jQuery(document).ready(function() {
console.log("jQuery est prêt !");
var $dossier = $('#image_dossier');
$dossier.change(function() {
var $form = $(this).closest('form');
var data = {};
data[$dossier.attr('name')] = $dossier.val();
console.log('url : '+$form.attr('action'));
console.log('type: '+$form.attr('method'));
console.log('data : '+data);
$.ajax({
url : "",
type: $form.attr('method'),
data : data,
success: function(html) {
console.log(html);
$('#image_emplacement').replaceWith(
$(html).find('#image_emplacement')
);
}
});
});
})
});
</script>
L'erreur que j'obtiens est celle-ci : mon URL net::ERR_CONNECTION_RESET
Quelqu'un a une idée ? j'ai tout essayé ... en plus le profiler Symfony ne m'aide pas du tout.
Merci d'avance