Listes déroulantes liées ajax

Fermé
NicoWebMaster - Modifié par NicoWebMaster le 25/08/2011 à 16:39
 NicoWebMaster - 26 août 2011 à 08:17
Bonjour,

je suis actuellement en stage dans une entreprise et je dois refondre leur site avec Prestashop, c'est pour cela que j'ai besoin d'aide, je dois créer une page de recherche de produit avec 3 liste déroulantes liées entre elles, pour l'instant je n'ai réussi qu'a en faire seulement 2 et qui ne sont pas totalement liées. Je m'explique, la première liste déroulante demande de choisir le fabricant du produit et la seconde la famille du produit. Lorsque je sélectionne le fabricant, la liste des familles doit se mettre à jour en ne sélectionnant que les familles de produit que le fabricant à fabriqué, comme ça lors que je veux sélectionner une famille, il n'y a que celle du fabricant et non pas toutes les familles de la bdd. Or moi je voudrais que lorsqu'on sélectionne une famille parmi celle déjà triées, la liste des fabricants se met à jour selon la famille sélectionnée.
J'espère que vous aurez compris ou je veux en venir ?
Merci d'avance à tous ceux qui ont eu le courage de me lire jusqu'au bout!

Voici mon code :

----------------------------------------------------------------------------------------------------------------
index.php

<?php 
require './config.inc.php'; 

$mysqli = new mysqli($db['server'], $db['user'], $db['passwd'], $db['name']); 

if (0 !== mysqli_connect_errno()) { 
        exit('Could not connect to database: ' . mysqli_connect_error()); 
} 

$sql = 'SELECT id_manufacturer, name FROM ps_manufacturer order by name'; 
$sql_fam = 'SELECT cl.id_category, cl.name FROM ps_category_lang cl LEFT JOIN ps_category c ON cl.id_category = c.id_category WHERE c.level_depth = 3 order by name'; 
?> 

<script type="text/javascript" src="regions.js"></script> 

<form action="#" method="post" id="form"> 

<p>Sélectionnez un fabricant: 
        <select name="regions" id="regions" onchange="updateDepartements(this.value)"> 
  <option selected value="">Choisir un fabricant...</option> 
        <?php 
        if (FALSE !== ($res = $mysqli->query($sql))) { 

                while ($row = $res->fetch_assoc()) { 
                     printf('<option value="%s">%s</option>', $row['id_manufacturer'],  $row['name']); 
                } 
                $res->close(); 
        } 
        ?> 
        </select> 
</p> 

<p>Sélectionnez une famille: 
        <select name="departements" id="departements" onchange="updateFabricants(this.value)"> 
  <option selected value="">Choisir une famille...</option> 
        <?php 
        if (FALSE !== ($res = $mysqli->query($sql_fam))) { 

                while ($row = $res->fetch_assoc()) { 
                     printf('<option value="%s">%s</option>', $row['id_category'],  $row['name']); 
                } 
                $res->close(); 
        } 
        ?> 
        </select> 
</p> 

<p><input type="submit" value="Soumettre" /> 

</form> 

----------------------------------------------------------------------------------------------------------------

rpc.php
<?php 

if (TRUE === isset($_GET['region'])) { 
        $region = intval($_GET['region']); 
} else { 
        exit; 
} 
if ($region == "" or $region == " "){ 
  exit; 
} else { 
require './config.inc.php'; 

$mysqli = new mysqli($db['server'], $db['user'], $db['passwd'], $db['name']); 

if (0 !== mysqli_connect_errno()) { 
        exit('Could not connect to database: ' . mysqli_connect_error()); 
} 

header('Content-Type: text/xml; charset=UTF-8'); 

$dom = new DOMDocument('1.0', 'utf-8'); 
$message = $dom->createElement('message'); 
$message = $dom->appendChild($message); 

$sql = 'SELECT id_category, name From ps_category_lang Where id_category IN (SELECT DISTINCT ps_category.id_parent FROM ps_category INNER JOIN ps_manufacturer_category_lien ON ps_category.id_category = ps_manufacturer_category_lien.id_category WHERE (((ps_manufacturer_category_lien.id_manufacturer_category_lien) Like '.$region.') AND ((ps_category.level_depth) Like 4)))'; 

if (FALSE !== ($res = $mysqli->query($sql))) { 

        while ($row = $res->fetch_assoc()) { 
                $departement = $dom->createElement('departement', utf8_encode($row['name'])); 
                $departement = $message->appendChild($departement); 
                $departement->setAttribute('id', $row['id_category']); 
        } 

        $res->close(); 
} 

echo $dom->saveXML(); 
         
} 
?> 

----------------------------------------------------------------------------------------------------------------

regions.js
var ajax; 
var ajax1; 

try { 
        ajax = new ActiveXObject("Msxml2.XMLHTTP"); 
} catch (e) { 
        try { 
                ajax = new ActiveXObject("Microsoft.XMLHTTP"); 
        } catch (e) { 
                if (typeof XMLHttpRequest!='undefined') { 
                        ajax = new XMLHttpRequest(); 
                } 
        } 
} 

function updateDepartements(region) { 
        ajax.open('get', 'rpc.php?region=' + region); 
        ajax.onreadystatechange = handleResponse; 
        ajax.send(null); 
} 

function updateFabricants(departement) { 
        ajax1.open('get', 'fabricant.php?departement=' + departement); 
        ajax1.onreadystatechange = handleResponse1; 
        ajax1.send(null); 
} 

function handleResponse() { 

        if(ajax.readyState == 4) { 

                var data = ajax.responseXML.getElementsByTagName('departement'); 

                document.getElementById('departements').innerHTML = ''; 
                for(var i=0;i<data.length;i++) { 

                        var option = document.createElement('option'); 
                        option.setAttribute('value',data[i].getAttribute("id")); 
                        option.appendChild(document.createTextNode(data[i].firstChild.nodeValue)); 
                        document.getElementById('departements').appendChild(option); 
                } 
        } 
} 

function handleResponse1() { 

        if(ajax1.readyState == 4) { 

                var data = ajax1.responseXML.getElementsByTagName('region'); 

                document.getElementById('regions').innerHTML = ''; 
                for(var i=0;i<data.length;i++) { 

                        var option = document.createElement('option'); 
                        option.setAttribute('value',data[i].getAttribute("id")); 
                        option.appendChild(document.createTextNode(data[i].firstChild.nodeValue)); 
                        document.getElementById('regions').appendChild(option); 
                } 
        } 
} 

function initForm() { 
        document.getElementById('regions').selectedIndex = 0; 
        updateDepartements(document.getElementById('regions').value); 
} 

function initForm1() { 
        document.getElementById('departements').selectedIndex = 0; 
        updateFabricants(document.getElementById('departements').value); 
} 

if (window.addEventListener) { 
        window.addEventListener("load", initForm, false);  
} else if (window.attachEvent){  
        window.attachEvent("onload", initForm);  
} 

----------------------------------------------------------------------------------------------------------------

fabricant.php
<?php 

if (TRUE === isset($_GET['departement'])) { 
        $departement = intval($_GET['departement']); 
} else { 
        exit; 
} 
if ($departement == "" or $departement == " "){ 
  exit; 
} else { 
require './config.inc.php'; 

$mysqli = new mysqli($db['server'], $db['user'], $db['passwd'], $db['name']); 

if (0 !== mysqli_connect_errno()) { 
        exit('Could not connect to database: ' . mysqli_connect_error()); 
} 

header('Content-Type: text/xml; charset=UTF-8'); 

$dom = new DOMDocument('1.0', 'utf-8'); 
$message = $dom->createElement('message'); 
$message = $dom->appendChild($message); 

$sql = 'SELECT ps_manufacturer.id_manufacturer, ps_manufacturer.name FROM ps_manufacturer INNER JOIN (ps_manufacturer_category_lien INNER JOIN ps_category ON ps_manufacturer_category_lien.id_category = ps_category.id_category) ON ps_manufacturer.id_manufacturer = ps_manufacturer_category_lien.id_manufacturer_category_lien WHERE ps_category.id_category = '.$region.';'; 

if (FALSE !== ($res = $mysqli->query($sql))) { 

        while ($row = $res->fetch_assoc()) { 
                $region = $dom->createElement('region', utf8_encode($row['name'])); 
                $region = $message->appendChild($region); 
                $region->setAttribute('id', $row['id_category']); 
        } 

        $res->close(); 
} 

echo $dom->saveXML(); 
         
} 
?> 

1 réponse

NicoWebMaster
26 août 2011 à 08:17
up!
0