Remplir dynamiquement un champ select avec ajax
Bonjour,
Je débute avec Symfony2 et j'utilise la libraire FOSUserBundle pour la gestion de mon espace membre.
J'ai modifié mon formulaire d'inscription en ajoutant deux champs de type select ( pays et région). Je voudrais qu'en sélectionnant le pays que la liste région soit celle du pays sélectionné.
J'utilise ajax pour remplir ma liste de régions, cependant quand je sélectionne un pays et que j'affiche sa valeur, elle est indéfinie.
Quelqu'un pourrait-il m'aider à résoudre ce problème. Ci-dessous mes différents codes.
Le formulaire twig:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
{% block javascripts %}
<script src="{{ asset('bootstrap-3.0.3/userbundle/js/fillRegistration.js') }}" type="application/javascript"></script>
{% endblock %}
<form "action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register
form-horizontal" role="form">
<div class="col-md-3 white-background"></div>
<div class="col-md-6">
<div class="row">
<div class="form-group">
<label class="col-sm-5 control-label">{{ form_label(form.country) }}</label>
<div class="col-sm-7">
{{ form_widget(form.country, {'attr': { 'class': 'form-control', 'onChange': 'fillRegion();', 'id': 'country'}}) }}
</div>
</div>
<div class="form-group">
<label class="col-sm-5 control-label">{{ form_label(form.region) }}</label>
<div class="col-sm-7">
{{ form_widget(form.region, {'attr': {'class': 'form-control'}}) }}
</div>
</div>
</div>
<div class="form-group">
<div class=" col-sm-12 align-center-button">
<button type="submit" id="_submit" name="_submit" class="btn btn-btn btn-primary">{{ 'registration.submit'|trans({}, 'FOSUserBundle') }}</button>
</div>
</div>
</div>
<div class="col-md-3 white-background"></div> |
Le code javascript:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
function fillRegion()
{
var id_country = "";
alert(' avant ===> '+id_country);
id_country = $("select.country option:selected").val();
alert(' après ===> '+id_country);
$.ajax({
url: "{{ path('pme_registration_fill_region }}",
type: 'POST',
data: {'id': id_country},
dataType: 'json',
success: function(json){
$('#region').html('');
$.each(json, function(index, value) {
$('#region').append('<option value="'+ value.regCode +'">'+ value.regName +'</option>');
});
}
});
} |
Le code du controller:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public function fillRegionAction()
{
$request = $this->getRequest();
$em = $this->getDoctrine()->getEntityManager();
if($request->isXmlHttpRequest()) // pour vérifier la présence d'une requete Ajax
{
$id = '';
$id = $request->get('id');
if ($id != '')
{
$tesObjets = $em->getRepository('PmeUserBundle:Countries')
->find($id); // qui retourne une collection d'objet je présume
$tabObjet = array();
$i = 0;
foreach($tesObjets as $tonObjet) // pour transformer la réponse à ta requete en tableau qui replira le select2
{
$tabObjet[$i]['regCode'] = $tonObjet->getAlpha2();
$tabObjet[$i]['regName'] = $tonObjet->getLangFr();
}
$response = new Response();
$data = json_encode($tabObjet); // c'est pour formater la réponse de la requete en format que jquery va comprendre
$response->headers->set('Content-Type', 'application/json');
$response->setContent($data);
return $response;
}
}
return new Response('Erreur');
}
} |
la route vers l'appel ajax:
Code:
1 2 3 4 5 6
|
pme_registration_fill_region:
pattern: /fillRegion
defaults: { _controller: PmeUserBundle:UserBundle:fillRegion}
requirements:
_method: POST |
Merci d'avance pour votre aide