gudule1er Posted September 4, 2014 Share Posted September 4, 2014 (edited) Bonjour, j'essai de faire une liste déroulante dynamique avec jquery dans mon fichier tpl j'ai mis ça <script src="js/jquery/jquery-1.11.0.min.js" type="text/!javascript!"></script> <script>$(document).ready(function() { var $modele_moto = $('#modele_moto'); var $marque_moto = $('#marque_moto'); // à la sélection d une marque de moto $marque_moto.on('change', function() { var val = $(this).val(); // on récupère la valeur de la marque //if(val != '') { //$model_moto.empty(); // on vide la liste des modeles $.ajax({ url: 'controller/front/CompatibiliteController.php', data: 'marque_moto='+ val, // on envoie $_GET['marque_moto'] dataType: 'json', success: function(json) { $.each(json, function(index, value) { $modele_moto.append('<option value="'+ index +'">'+ value +'</option>'); }); } }); }); });</script> <select name="marque_moto" id="marque_moto"> <option value="select">-- Sélectonner une marque --</option> {foreach from=$value_select_req item=option} <option value="{$option.id_feature_value}">{$option.value}</option> {/foreach} </select> <select name="model_moto" id="modele_moto" "> <option value="select">-- Sélectonner le modèle --</option> </select> et dans mon fichier php j'ai fait ça if (isset($_GET['marque_moto'])) { $marque_moto=$_GET['marque_moto']; $req_sortie2=Db::getInstance()->ExecuteS('select fl.value, f.id_feature_value from '._DB_PREFIX_.'feature_value_lang fl, '._DB_PREFIX_.'feature_value f where f.id_feature=12 AND f.id_feature_value=$marque_moto'); while($donnees = $req_sortie2->fetch(PDO::FETCH_ASSOC)) { // je remplis un tableau et mettant l'id en index (que ce soit pour les marques ou les modèles) $json[$donnees['id_feature_value']][] = utf8_encode($donnees['value']); } // envoi du résultat au success echo json_encode($json); } bien entendu ça ne fonctionne pas, si quelqu'un peu me filer un coup de main ça serai sympa. je suis en 1.6 merci Edited September 5, 2014 by gudule1er (see edit history) Link to comment Share on other sites More sharing options...
YopixelAE Posted September 4, 2014 Share Posted September 4, 2014 Bonjour, qu'avez-vous comme infos dans la console ? Postez une démo, ce sera + simple de vous aider. Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 (edited) Bonjour, qu'appelle tu "la console" ? Dans les logs il y a rien du tout... la bouutique est en maintenance, donne moi ton IP en PM et je te donne un accès Edited September 5, 2014 by gudule1er (see edit history) Link to comment Share on other sites More sharing options...
YopixelAE Posted September 5, 2014 Share Posted September 5, 2014 Bonjour, la console de développement du navigateur, par exemple Ctrl+Shift+J pour Chrome. Link to comment Share on other sites More sharing options...
YopixelAE Posted September 5, 2014 Share Posted September 5, 2014 (edited) // à la sélection d une marque de moto $marque_moto.on('change', function() { ... Rien n'est envoyé au serveur. Essayez quelque chose de + clean. Évitez de mettre le JS dans un .tpl. Inutile aussi d'appeler Jquery, qui est déjà présent de base. Vérifiez que votre event est bien lancé, et que la valeur est bien récupérée, et ensuite appelez votre fonction AJAX. Quelque chose comme ça par exemple : $("#page").on('change', '#marque_moto', function () { console.log('select change fired'); var selectedVal = $('#marque_moto :selected').val(); // Or var selectedVal = $(this).val(); console.log('Selected value : ' + selectedVal); requestServer(selectedVal); }); var requestServer = function (selectedVal) { // Ajax }; Edited September 5, 2014 by Yopixel (see edit history) Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 si je te suis bien, je rajoute la partie du code avant de faire mes appels pour vérifier que tout fonctionne ? Link to comment Share on other sites More sharing options...
YopixelAE Posted September 5, 2014 Share Posted September 5, 2014 Oui, dissociez la function qui gère le change event de celle qui réalise la requête. Et placez des console.log. Ce sera + clair. Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 ok je regarde pour faire ça... Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 j'ai l'impression que rien ne ce passe dans la page... aucun log rien... Link to comment Share on other sites More sharing options...
YopixelAE Posted September 5, 2014 Share Posted September 5, 2014 Il doit y avoir pas mal d'erreurs JS dans la page. Activez le template par défaut + désactivez tous les modules et scripts pour ne garder que celui sur lequel vous travaillez. La page doit être quasi-vide, avec seulement votre menu select et le fichier.js contenant votre code. Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 alors quand je met ce code $( "#marque_mto" ).change(function() { alert( "Handler for #marque moto() called." ); }); j'ai bien un avertissement à l'écran par contre avec ça $( "#marque_moto" ).change(function() { console.log('select change fired'); var selectedVal = $('#marque_moto :selected').val(); // Or var selectedVal = $(this).val(); console.log('Selected value : ' + selectedVal); requestServer(selectedVal); }); rien ne ce passe Link to comment Share on other sites More sharing options...
YopixelAE Posted September 5, 2014 Share Posted September 5, 2014 Le nom des IDs #marque_... est différent. Rien ne se passe, c'est à dire que rien n'est inscrit dans la console ? Placez un alert au lieu d'un console.log. Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 quand je met un alert j'ai bien un message à l'écran au changement dans le menu... Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 $( "#marque_moto" ).change(function() { alert( "ça fonctionne #marque_moto() " ); }); avec ça j'ai bien une alerte à l'écran... donc je met ça dans mon fichier .js $.ajax({ url: 'controller/front/CompatibiliteController.php', data: 'marque_moto='+ val, // on envoie $_GET['marque_moto'] dataType: 'json', success: function(json) { $.each(json, function(index, value) { $modele_moto.append('<option value="'+ index +'">'+ value +'</option>'); }); et dans mon fichier .php j'ai cette requête if (isset($_GET['marque_moto'])) { $marque_moto=$_GET['marque_moto']; $req_sortie2=Db::getInstance()->ExecuteS('select fl.value, f.id_feature_value from '._DB_PREFIX_.'feature_value_lang fl, '._DB_PREFIX_.'feature_value f where f.id_feature=12 AND f.id_feature_value=$marque_moto'); while($donnees = $req_sortie2->fetch(PDO::FETCH_ASSOC)) { // je remplis un tableau et mettant l'id en index (que ce soit pour les marques ou les modèles) $json[$donnees['id_feature_value']][] = utf8_encode($donnees['value']); } // envoi du résultat au success echo json_encode($json); Link to comment Share on other sites More sharing options...
YopixelAE Posted September 5, 2014 Share Posted September 5, 2014 donc je met ça dans mon fichier .js Vous mettez TOUT ce qui est JS. Pas de JS dans le .tpl. Excepté l'appel du fichier, encore que ce serait mieux de faire cet appel depuis le code du module (fonction hookEtc). Une fois que vous aurez réussi à lancer la requête, vous pourrez vous intéresser au fichier php quand je met un alert j'ai bien un message à l'écran au changement dans le menu Alors faites-en sorte de voir pourquoi votre console n'affiche rien sur un simple console.log() Essayez en changeant de navigateur, avec la console FF par exemple. Car vous aurez besoin de la console. Link to comment Share on other sites More sharing options...
loulou66 Posted September 5, 2014 Share Posted September 5, 2014 Coucou essayes cette requette SQL remplacer $req_sortie2=Db::getInstance()->ExecuteS('select fl.value, f.id_feature_value from '._DB_PREFIX_.'feature_value_lang fl, '._DB_PREFIX_.'feature_value f where f.id_feature=12 AND f.id_feature_value=$marque_moto'); par $req_sortie2=Db::getInstance()->ExecuteS(' SELECT fl.value, f.id_feature_value FROM '._DB_PREFIX_.'feature_value_lang fl LEFTJION '._DB_PREFIX_.'feature_value f WHERE f.id_feature="12" AND f.id_feature_value="'.$marque_moto.'" '); @++ Loulou66 Link to comment Share on other sites More sharing options...
Eolia Posted September 5, 2014 Share Posted September 5, 2014 LEFT JOIN à la place de LEFTJION Link to comment Share on other sites More sharing options...
loulou66 Posted September 5, 2014 Share Posted September 5, 2014 Coucou tu as aussi la Class FeatureValue ( classes/FeatureValues.php) ou tu a la function getFeatureValuesWithLang($id_lang, $id_feature, $custom = false) que tu appelles avec $req_sortie2 = FeatureValue::getFeatureValuesWithLang($id_lang, $id_feature); il faudra bien sur récupèerré avant $id_lang, $id_feature $id_lang = (int)$this->context->language->id; $id_feature ='12'; @++ Loulou66 Link to comment Share on other sites More sharing options...
loulou66 Posted September 5, 2014 Share Posted September 5, 2014 Coucou vi merci eolia @++ Loulou66 Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 dans la console j'ai bien les valeurs que je sélectionne... #marque_moto:selected compatibilite.js:2 Selected value : 48 Link to comment Share on other sites More sharing options...
YopixelAE Posted September 5, 2014 Share Posted September 5, 2014 (edited) dans la console j'ai bien les valeurs que je sélectionne... Vous pouvez donc commencer à vous intéresser à votre fonction $.ajax. Utilisez le code que je vous ai donné dans les premiers posts. Vérifiez également que JQuery est bien appelé avant votre fichier compatibilite.js Edit : Et si vous n'avez toujours pas utilisé la console jusque là, faites une pause et apprenez à utiliser cette console. Edited September 5, 2014 by Yopixel (see edit history) Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 merci pour votre aide à tous, c'est très cool... j'ai ça comme fonction donc $.ajax({ url: 'controller/front/CompatibiliteController.php', data: 'marque_moto='+ val, // on envoie $_GET['marque_moto'] dataType: 'json', success: function(json) { $.each(json, function(index, value) { $modele_moto.append('<option value="'+ index +'">'+ value +'</option>'); }); } }); et je voudrais tout mettre dans la console, comment je fais Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 re tout le monde, maintenant dans la console j'ai ça : POST https://moto-test.fr/controllers/front/CompatibiliteController.php 500 (Internal Server Error) jquery-1.11.0.min.js:4 sendjquery-1.11.0.min.js:4 n.extend.ajaxjquery-1.11.0.min.js:4 (anonymous function)compatibilite.js:5 n.event.dispatchjquery-1.11.0.min.js:3 r.handle Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 bon j'avance un peu, plus d'erreur 500 mais ça maintenant dans la console Uncaught TypeError: Cannot read property 'length' of null jquery-1.11.0.min.js:2 n.extend.eachjquery-1.11.0.min.js:2 $.ajax.successcompatibilite.js:11 jjquery-1.11.0.min.js:2 k.fireWithjquery-1.11.0.min.js:2 xjquery-1.11.0.min.js:4 b Link to comment Share on other sites More sharing options...
gudule1er Posted September 5, 2014 Author Share Posted September 5, 2014 je faisais une petite erreur dans mon code... mais maintenant je me retrouve avec une erreur 500 GET http://moto-test.fr/controllers/front/CompatibiliteSuite.php?marque_moto=383 500 (Internal Server Error) jquery-1.11.0.min.js:4 sendjquery-1.11.0.min.js:4 n.extend.ajaxjquery-1.11.0.min.js:4 (anonymous function)compatibilite.js:5 n.event.dispatchjquery-1.11.0.min.js:3 r.handle Link to comment Share on other sites More sharing options...
loulou66 Posted September 5, 2014 Share Posted September 5, 2014 Coucou tu doit avoir une erreur a la ligne 5 dans le compatibilite.js @++ Loulou66 Link to comment Share on other sites More sharing options...
YopixelAE Posted September 6, 2014 Share Posted September 6, 2014 (edited) Le controller n'est pas bon (chemin ou structure du fichier). + vous utilisez GET alors que vous envoyez un paramètre au serveur (ce qui est contraire aux spécifications XHR) + votre script compatibilite.js est appelé avant Jquery (modifiez votre module). J'ai l'impression que vous ne lisez pas les réponses qui vous sont données. Créez votre module sur un site de démo (pas votre site en prod passé en maintenance) et quand tout sera ok basculez le module sur le site en prod. Edited September 6, 2014 by Yopixel (see edit history) Link to comment Share on other sites More sharing options...
gudule1er Posted September 7, 2014 Author Share Posted September 7, 2014 (edited) Bonjour, bien sur que je lis vos réponses... si je comprend bien dans ma fonction ajax il faut que je mette method:POST ? je suis bien sur un site de test (moto-test.fr) comment je peux vérifier ou est appelé jquery ? jquery est pas appelé dans le header ? merci Edited September 7, 2014 by gudule1er (see edit history) Link to comment Share on other sites More sharing options...
YopixelAE Posted September 7, 2014 Share Posted September 7, 2014 Bonjour, oui POST. Ensuite regardez votre fichier php. Corrigez votre controller en parcourant les tutos de création de modules. Link to comment Share on other sites More sharing options...
gudule1er Posted September 8, 2014 Author Share Posted September 8, 2014 Bonjour, j'ai parcouru les tutos de création de module et je ne vois pas ce qui déconne dans mon controller contenue de mon fichier php : class CompatibiliteControllerCore extends FrontController { public $php_self = 'Compatibilite'; public $ssl=false; public function initContent() { parent::initContent(); global $smarty; $req_sortie=Db::getInstance()->ExecuteS('select fl.value, f.id_feature_value from '._DB_PREFIX_.'feature_value_lang fl, '._DB_PREFIX_.'feature_value f where f.id_feature=11 AND f.id_feature_value=fl.id_feature_value'); $this->context->smarty->assign('value_select_req',$req_sortie); if(isset($_GET['marque_moto'])) { $marque_moto=$_GET['marque_moto']; $req_sortie2=Db::getInstance()->ExecuteS(' SELECT fl.value, f.id_feature_value FROM '._DB_PREFIX_.'feature_value_lang fl LEFT JOIN '._DB_PREFIX_.'feature_value f WHERE f.id_feature="12" AND f.id_feature_value="'.$marque_moto.'" '); while($donnees = $req_sortie2->fetch(PDO::FETCH_ASSOC)) { // je remplis un tableau et mettant l'id en index (que ce soit pour les marques ou les modèles) $test_visu = $donnees['f.id_feature_value']; $json[$donnees['f.id_feature_value']][] = utf8_encode($donnees['fl.value']); } // envoi du résultat au success echo json_encode($json); } $this->setTemplate(_PS_THEME_DIR_.'Compatibilite.tpl'); } } Link to comment Share on other sites More sharing options...
YopixelAE Posted September 8, 2014 Share Posted September 8, 2014 Je me suis arrêté à la première ligne : class CompatibiliteControllerCore extends FrontController La class d'un module étends ModuleFrontController, pas FrontController. Link to comment Share on other sites More sharing options...
gudule1er Posted September 8, 2014 Author Share Posted September 8, 2014 Mais je suis en train de faire un controller, pas un module... pour l'instant... Link to comment Share on other sites More sharing options...
loulou66 Posted September 8, 2014 Share Posted September 8, 2014 Coucou en relisant le post je voit des petite erreur des le sript au debut remplaces var $modele_moto = $('#modele_moto'); var $marque_moto = $('#marque_moto'); // à la sélection d une marque de moto $marque_moto.on('change', function() { var val = $(this).val(); // on récupère la valeur de la marque par // à la sélection d une marque de moto $('#modele_moto').on('change', function() { var val = $(this).val(); // on récupère la valeur de la marque a savoir qu'on ne met pas de $ quand on déclare les var en js (var modele_moto = .... ensuite refait ta 1er requête sql req_sortie comme req_sorite2 tu peut afficher les resultat en FO avec p($req_sortie); pour affiche les résultat tout en haut du site (la 1ere ligne)et continuer le traitement du php d($req_sortie); pour affiche les résultat tout en haut du site (la 1ere ligne)et arrêter le traitement du php tu vérifier comme ça chacune de tes variable @++ Loulou66 Link to comment Share on other sites More sharing options...
YopixelAE Posted September 8, 2014 Share Posted September 8, 2014 j'ai parcouru les tutos de création de module et je ne vois pas ce qui déconne dans mon controller Mais je suis en train de faire un controller, pas un module Si vous n'êtes pas en train de créer un module c'est sûr que les tutos de création de modules ne vont pas beaucoup vous avancer... J'ai l'impression qu'on ne va jamais pouvoir le résoudre votre souci. Heureusement Loulou66 est là ! Link to comment Share on other sites More sharing options...
gudule1er Posted September 8, 2014 Author Share Posted September 8, 2014 @loulou66, mon script est comme ça... $( "#marque_moto" ).change(function() { var selectedVal = $('#marque_moto :selected').val(); console.log('Selected value : ' + selectedVal); var val = $(this).val(); $.ajax({ method : POST, url: 'controllers/front/CompatibiliteController.php', data: 'marque_moto='+ val, // on envoie $_GET['marque_moto'] dataType: 'html', success: function(json) { $.each(json, function(index, value) { $modele_moto.append('<option value="'+ index +'">'+ value +'</option>'); }); } }); console.log('Data : ' + val); }); comme le "change" doit ce faire au changement du select "#marque_moto" je ne pense pas que je doit le faire sur "#modele_moto" @yopixel, c'est pour ça j'ai suivi des tutos de création de controller... d'autre part j'ai ça dans la console : Uncaught ReferenceError: $ is not defined compatibilite.js:1 (anonymous function) j'ai essayer de mettre çette commande au début de mon controleur public function setMedia() { $this->addJqueryUI('ui.change'); } et avec ça j'ai encore plus d'erreur... et je ne trouve toujours pas comment vérifier ou est appeler jQuery... Link to comment Share on other sites More sharing options...
YopixelAE Posted September 8, 2014 Share Posted September 8, 2014 (edited) $this->addJqueryUI('ui.change'); A quoi devrait servir ce fichier (fichier qui n'existe pas) ? .change() est une méthode JQuery, il n'y a pas besoin d'extension UI par dessus pour l'utiliser. Surtout que vous n'avez pas de problème avec l’événement change (vous dites vous-même que votre select menu vous retourne la bonne valeur), vous avez un problème principal d'erreur 500 à cause d'un mauvais controlleur + un problème secondaire de JS à cause d'un mauvais ordre d'appel. Edit: Vous n'avez pas besoin de savoir où est appelé JQuery pour tenter de modifier je ne sais pas quoi, vous devez seulement appeler votre propre script .js correctement. Placez la balise dans le footer par exemple. Faites un module, ce sera beaucoup + simple. Edited September 8, 2014 by Yopixel (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now