8791 sujets

Développement web côté serveur, CMS

Bonjour,

Dans un premier temps, je lisais une bdd, pour la convertir en xml.
Que de temps perdu !
J'ai donc créer directement mes xml :
cat00.xml (avec id, libelle) et
cat01.xml (avec id, libelle, parent).

Mais dons mon code de page "boutique00.php", je n'y arrive plus.
Pour une lecture plus efficace du code,
j'ai volontairement supprimer tout ce qui avait rapport avec "simpleXML".
Bon, je sais "oXHR.js" et "cat01.php" n'ont plus rien à faire, maintenant.
Idem pour le code javascript en début de page "boutique00.php" !
A la lecture du code, vous aurez vite compris qu'il s'agit de listes déroulantes
dépendante de la précédente (d'où l'utilisation d'une zone "parent" dans "cat01.xml").
Ce code fonctionne nickel (tel quel, avec lecture des 2 bdds) !

Pouvez-vous m'aider à modifier mon code pour que :
la lecture de la bdd "shop_categorie00" soit remplacée par la lecture de "cat00.xml", et que
la lecture de la bdd "shop_categorie01" soit remplacée par la lecture de "cat01.xml".
Les structures sont toutefois identiques :
shop_categorie00 (avec id, libelle) remplacée par cat00.xml (avec id, libelle) et
shop_categorie01 (avec id, libelle, parent) remplacée par cat01.xml (avec id, libelle, parent).

J'ai aussi un souci avec le onchange dans :
<select id="categorie00" style="width:280px;" onChange="request(this);">
(dans "boutique00.php")

J'ai quand même laissé "oXHR.js" (dans /js)

function getXMLHttpRequest() {
	var xhr = null;
	
	if (window.XMLHttpRequest || window.ActiveXObject) {
		if (window.ActiveXObject) {
			try {
				xhr = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				xhr = new ActiveXObject("Microsoft.XMLHTTP");
			}
		} else {
			xhr = new XMLHttpRequest(); 
		}
	} else {
		alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest...");
		return null;
	}
	
	return xhr;
}


J'ai aussi laissé "cat01.php" (dans /php)

	header("Content-Type: text/xml");
	echo '<?xml version="1.0" encoding="UTF-8" ?>';
	echo "<list>";
	$parent = (isset($_POST["parent"])) ? htmlentities($_POST["parent"]) : NULL;
	if ($parent) {
		date_default_timezone_set('Europe/Brussels');
		require_once("connexionMysql.inc.php");
		$query = mysql_query("SELECT * FROM shop_categorie01 ".
			"WHERE parent=".
			mysql_real_escape_string($parent).
			" ORDER BY libelle");
		while ($back = mysql_fetch_assoc($query)) {
			echo '<item id="'.$back['id'].'" libelle="'.$back['libelle'].'" />';		
		}
		echo "</list>";
	}


Voici maintenant "boutique00.php"

<html>
<head>
...
<script type="text/javascript" src="js/oXHR.js"></script>
<script type="text/javascript">
<!--
function request(oSelect) {
	var value = oSelect.options[oSelect.selectedIndex].value;
	var xhr = getXMLHttpRequest();
	
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
			readData(xhr.responseXML);
			document.getElementById("loader00").style.display = "none";
		} else if (xhr.readyState < 4) {
			document.getElementById("loader00").style.display = "inline";	
		}
	}
	xhr.open("POST","php/cat01b.php",true);
	xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	xhr.send("parent="+value);
}

function readData(oData) {
	var nodes = oData.getElementsByTagName("item");
	var oSelect = document.getElementById("categorie01");
	var oOption, oInner;
	
	oSelect.innerHTML = "";
	for (var i=0, c=nodes.length; i<c ; i++) {
		oOption = document.createElement("option");
		oInner = document.createTextNode(nodes[i].getAttribute("libelle"));
		oOption.value = nodes[i].getAttribute("id");
		oOption.appendChild(oInner);
		oSelect.appendChild(oOption);
	}
}
-->
</script>
</head>

<body>
...
    <table id="tableoptions" border="0" cellspacing="0" style="vertical-align:middle;">
...
        <tr>
        <td style="padding:7px;">Document</td>
        <td style="padding-left:5px;">
            <select id="categorie00" style="width:280px;" onChange="request(this);">
            <option value="none">Choisissez, svp !</option>
            <?php
				require_once("php/connexionMysql.inc.php");
				$query = mysql_query("SELECT * FROM shop_categorie00 ORDER BY libelle");
				while ($back = mysql_fetch_assoc($query)) {
					echo "\t\t\t\t<option value='".$back['id']."' >".$back['libelle']."</option>\n";		
				}
			?>
            </select>
            <span id="loader00" style="display: none;"><img src="images/boutique/loader.gif" alt="loading" width="16" height="16" /></span>
        </td>
        </tr>
        <tr>
        <td style="padding:7px;">Descriptif</td>
        <td style="padding-left:5px;">
        	<select id="categorie01" style="width:280px;">
            </select>
            <span id="loader01" style="display: none;"><img src="images/boutique/loader.gif" alt="loading" width="16" height="16" /></span>
        </td>
        </tr>
...
    </table>
</body>
[/i][/i]
Modifié par jytest (28 Jul 2011 - 11:29)
Voici mon début de solution


$xml=simplexml_load_file('cat00.xml');
foreach ($xml AS $categorie) {
      $parent=$categorie->parent;
}


Mais comment remplir mes select,
pour que cela soit fait quasiment de façon instantanée
depuis ce code php ?
Salutation jytest » amitié.

Je te dirais qu'au départ nous devons savoir si une BDD est nécessaire, sinon XML.
Pour de gros volume, une BDD est possiblement la solution, Sinon XML.

Subitement tu change d'orientation (BDD vers XML). Si tu avais réfléchit d'avance, dès le départ du projet, tu n'aurais pas à t'orienté différemment.

Moi perso j'utiliserais DomDocument plutôt que simplexml. Si tu utlisie simplexml, tu prouve en même temps le non-nécessaire de te tourné vers les BDD. Petit volume : simplexml. Plus complexe, DomDocument et plus encore (très gros volume), BDD.

Si ta recherche comprend un plus petit volume, XML est de pointe.

Tu pourras remplir ton select, même à partir d'une interface administrative. Via un fichier XML écrit sous validation d'un formulaire (création d'un fichier XML), et exploiter par la suite, dans le but d'un affichage. Sans nécessairement utiliser AJAX, JavaScript.

Uniquement PHP et XML.

..
Modifié par zardoz (29 Jul 2011 - 00:13)
Bonjour,

Merci Zardoz !
Encore là pour aider ! Génial ! Merci !
J'en profite d'ailleurs pour remercier tout le monde !

Tu veux dire quoi ?
a écrit :

Tu pourras remplir ton select, même à partir d'une interface administrative. Via un fichier XML écrit sous validation d'un formulaire (création d'un fichier XML), et exploiter par la suite, dans le but d'un affichage. Sans nécessairement utiliser AJAX, JavaScript.
Uniquement PHP et XML


Pour ma part, je précise.
En fait, c'est parce que je me suis apreçu
que remplir ma bdd par php/myAdmin était
beaucoup plus long et galère
que de créer une liste en xml...

Voilà pourquoi je voulais passer directement en xml,
au lieu de convertir une bdd en xml pour l'exploiter.

Qu'en penses-tu ?

En sachant que la dernière liste comprendrait
entre 300 et 500 éléments.

Et puis, autre chose, j'ai remarqué qu'actuellement,
pour une liste de 50 éléments, cela prenait presque 1 seconde...
d'où ma 2e inquiétude : le temps pour charger une liste de 500 éléments !

Il me semblait assez logique de croire que de convertir
une bdd en xml directement dans le programme prenait du temps.
Pourquoi ne pas la créer directement sous éditeur ?

Maintenant, s'il y a une autre solution (encore) plus rapide,
n'hésitez pas à m'en faire part !!!
Modifié par jytest (29 Jul 2011 - 10:21)