Valider 3760db49 rédigé par esj's avatar esj
Parcourir les fichiers

Correction, optimisation et harmonisation du mini-navigateur de rubrique ajax:

- le calcul de l'attribut onclick n'était pas réinitialisé en début de la boucle PHP, du coup le code JS du clic sur la N-ieme rubrique du menu faisait N appels à Ajax. C'était carrément faux lorsqu'en plus la rubrique n'avait pas d'enfant (le menu renvoyé donnait les fils de la rubrique précédente), autrement, le dernier étant le bon, c'était invisible, mais ça explique la lenteur et le besoin d'appeler la methode .abort dans charger_id_url, ce qui devrait pouvoir sauter maintenant.

- optimisation de la requete SQL et beaucoup de calculs redondants dans la boucle et l'appel récursif.

- surtout: charger_id_url a pour 3e arg non plus une chaine sur laquelle appliquée Eval, mais une fonction qui est invoquée: ça évite le phénomène de capture de variable et accélère. AjaxSqueeze admet aussi un tel argument ce qui devrait permettre d'unifier les 2 à terme.
parent 9ef3e215
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -25,7 +25,7 @@ function exec_plonger_dist()

	include_spip('inc/texte');
	include_spip('inc/mini_nav');
	return mini_afficher_rubrique ($id, htmlentities($rac), "", $col, $exclus);
	return mini_afficher_rubrique ($id, htmlentities($rac), array(), $col, $exclus);
}

?>
+33 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -121,6 +121,29 @@ function aff_selection (type, rac, id) {
	charger_id_url("./?exec=informer&var_ajax=1&type="+type+"&id="+id+"&rac="+rac, rac+"_selection");
}

// selecteur de rubrique et affichage de son titre dans le bandeau

function aff_selection_titre(id_rubrique, titre)
{
	findObj('id_parent').value=id_rubrique;
	findObj('titreparent').value=titre;
	findObj('selection_rubrique').style.display='none';
}

function aff_selection_provisoire(id_rubrique, racine, url, col, sens)
{
  nom = racine + '_col_' + (col+1);
  if (url)
    { r = racine + 'principal';
      c = ((col-1)*150);
      charger_id_url(url, nom, function() {slide_horizontal(r,c,sens);})}
  else 
    { findObj_forcer(nom).innerHTML=''; }
  // afficher le descriptif de la rubrique dans la div du dessous?
  // si trop lent, commenter la ligne ci-dessous
  aff_selection('rubrique',racine,id_rubrique);
}

//
// Cette fonction charge du contenu - dynamiquement - dans un 
// Ajax
@@ -165,7 +188,7 @@ function ajahReady(xhr, f) {
// Toutefois il y toujours un coup de retard dans la pose d'un cookie:
// eviter de se loger avec redirection vers un telle page

function AjaxSqueeze(trig, id)
function AjaxSqueeze(trig, id, f)
{
	var i, s, g;
	var u = '';
@@ -174,6 +197,9 @@ function AjaxSqueeze(trig, id)
	var noeud = document.getElementById(id);
	if (!noeud) return true;

	// retour std si pas precise: affecte ce noeud avec ce retour
	if (!f) f = function(r) { noeud.innerHTML = r;}

	// vivement jquery !
	if (typeof ajax_image_searching != 'undefined') {
		g = document.createElement('div');
@@ -182,7 +208,7 @@ function AjaxSqueeze(trig, id)
	}

	if (typeof(trig) == 'string') {
		return ajah('GET', trig, null, function(r) { noeud.innerHTML = r;});
		return ajah('GET', trig, null, f);
	}

	for (i=0;i < trig.elements.length;i++) {
@@ -197,7 +223,7 @@ function AjaxSqueeze(trig, id)
	return !ajah('POST', // ou 'GET'
		     s ,     // s + '?'+ u,
		     u,      // null,
		     function(r) { noeud.innerHTML = r;} );
		     f);
}


@@ -212,7 +238,8 @@ function charger_id_url(myUrl, myField, jjscript)
		Field.innerHTML = url_chargee['mem_'+myUrl];
		Field.style.visibility = "visible";
		Field.style.display = "block";
		if(jjscript) eval(jjscript);
		//		if(jjscript) eval(jjscript);
		if(jjscript) jjscript();
	} else {
		image_search[myField] = findObj_forcer('img_'+myField);
		if (image_search[myField]) image_search[myField].style.visibility = "visible";
@@ -233,7 +260,8 @@ function charger_id_url(myUrl, myField, jjscript)
					if (image_search[myField]) {
						image_search[myField].style.visibility = "hidden";
					}
					if(jjscript) eval(jjscript);
					//	if(jjscript) eval(jjscript);
					if(jjscript) jjscript();
				} else {
					charger_id_url(myUrl, myField, jjscript);
				}
+63 −79
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -13,97 +13,83 @@
if (!defined("_ECRIRE_INC_VERSION")) return;

// http://doc.spip.org/@mini_afficher_rubrique
function mini_afficher_rubrique ($id_rubrique, $rac="", $liste="", $col = 1, $rub_exclus=0) {
function mini_afficher_rubrique ($id_rubrique, $rac="", $list=array(), $col = 1, $rub_exclus=0) {
	global  $spip_lang_left;
	
	if (strlen($liste) > 0) {
		$rubs = explode(",", $liste);
		$id_rubrique = $rubs[$col-1];
	}
	
	if ($list) $id_rubrique = $list[$col-1];
	
	$ret = "<div id = '".$rac."_col_".$col."' class='arial1'>"; 
	$ret .= http_img_pack("searching.gif", "*", "style='visibility: hidden; position: absolute; $spip_lang_left: ".(($col*150)-30)."px; top: 2px; z-index: 2;' id = 'img_".$rac."_col_".($col+1)."'");
	$nom_col = $rac . "_col_".($col+1);

	$ret .= "<div style='width: 150px; height: 100%; overflow: auto; position: absolute; top: 0px; $spip_lang_left: ".(($col-1)*150)."px;'>";
	$ret = "<div id='"
	. $rac
	. "_col_"
	. $col
	."' class='arial1'>" 
	. http_img_pack("searching.gif", "*", "style='visibility: hidden; position: absolute; $spip_lang_left: "
		.(($col*150)-30)
		."px; top: 2px; z-index: 2;' id='img_$nom_col'")
	. "<div style='width: 150px; height: 100%; overflow: auto; position: absolute; top: 0px; $spip_lang_left: "
	.(($col-1)*150)
	."px;'>";

	# recherche les filles et petites-filles de la rubrique donnee
	$res = spip_query("SELECT rub1.* FROM spip_rubriques AS rub1, spip_rubriques AS rub2 WHERE ((rub1.id_parent = $id_rubrique) OR (rub2.id_parent = $id_rubrique AND rub1.id_parent=rub2.id_rubrique)) AND rub1.id_rubrique!=$rub_exclus GROUP BY rub1.id_rubrique ORDER BY rub1.titre");
	$ordre = array();

	$res = spip_query("SELECT rub1.id_rubrique, rub1.titre, rub1.id_parent, rub1.lang, rub1.langue_choisie FROM spip_rubriques AS rub1, spip_rubriques AS rub2 WHERE ((rub1.id_parent = $id_rubrique) OR (rub2.id_parent = $id_rubrique AND rub1.id_parent=rub2.id_rubrique)) AND rub1.id_rubrique!=$rub_exclus GROUP BY rub1.id_rubrique ORDER BY rub1.titre");

	while ($row = spip_fetch_array($res)) {
		$le_parent = $row["id_parent"];
		$la_rub = $row["id_rubrique"];
		$titre = typo($row["titre"]);
		$lang = $row["lang"];
		$langue_choisie = $row["langue_choisie"];
		
		if ($langue_choisie == "oui") $titre = $titre. " [$lang]";
		
		$rub[$la_rub]["id_rubrique"] = $la_rub;
		$rub[$la_rub]["id_parent"] = $le_parent;
		$rub[$la_rub]["titre"] = $titre;
		$rub[$le_parent]["enfants"] = true;
		$ordre[$la_rub] = trim($titre);
		$id = $row["id_rubrique"];
		$rub[$id] = $row;
		$rub[$row["id_parent"]]["enfants"] = true;
		if ($row["id_parent"] == $id_rubrique)
			$ordre[$id] = trim(typo($row['titre']))
			. (($row["langue_choisie"] != "oui") ? '' : (" [" . $row["lang"] . "]"));

	}

	if ($ordre) {
		asort($ordre);
		while (list($i, $k) = each($ordre)) {
			$le_parent = $rub[$i]["id_parent"];
			$la_rub = $rub[$i]["id_rubrique"];
			$titre = $rub[$i]["titre"];
		$place = (($col-1)*150);

		while (list($id, $titre) = each($ordre)) {

			$titre = "<div class='petite-rubrique'"
			. ($id_rubrique ? '' : (" style='background-image: url(" . _DIR_IMG_PACK . "secteur-12.gif)'"))
			. ">"
			. supprimer_numero($titre)
			. "</div>";

			if ($le_parent == $id_rubrique) {
				if ($la_rub == $rubs[$col]) $class="highlight";
				else $class = "pashighlight";
			if ($rub[$id]["enfants"]) {
				$titre = "\n<div class='rub-ouverte'>$titre</div>";

				if ($rub[$i]["id_parent"] == 0) $style = " style='background-image: url(" . _DIR_IMG_PACK . "secteur-12.gif)'";
		# ensuite, ouverture ou fermeture du menu des sous-rubriques
				$url = generer_url_ecrire('plonger',"&var_ajax=1&rac=$rac&exclus=$rub_exclus&id=$id&col=".($col+1), true);

			} else {  $url = ''; }

			$class = ($id == $list[$col]) ? "highlight" : "pashighlight";

			$onClick = "\naff_selection_provisoire($id,\n\t'$rac',\n\t'$url',\n\t$col,\n\t'$spip_lang_left');";
				
				$titre = "<div class='petite-rubrique'$style>"
					.supprimer_numero($titre)."</div>";
# ce lien provoque la selection (directe) de la rubrique cliquee
				$ondbClick = "findObj('id_parent').value=$la_rub;";
# et l'affichage de son titre dans le bandeau
				$ondbClick .= "findObj('titreparent').value='"
					. strtr(
						str_replace("'", "&#8217;",
			$ondbClick = "aff_selection_titre($id,'"
			. strtr(str_replace("'", "&#8217;",
						str_replace('"', "&#34;",
							textebrut($titre))),
						"\n\r", "  ")."';";
				$ondbClick .= "findObj('selection_rubrique').style.display='none';";

				if ($rub[$i]["enfants"]) {
					$titre = "<div class='rub-ouverte'>$titre</div>";

					# ensuite, l'ouverture du menu des sous-rubriques
					$url = generer_url_ecrire('plonger',"&var_ajax=1&rac=$rac&exclus=$rub_exclus&id=$la_rub&col=".($col+1), true);
					$onClick .= "charger_id_url('$url',"
					. "'".$rac."_col_".($col+1)
					."', 'slide_horizontal(\'".$rac."_principal\', \'"
					.(($col-1)*150)."\', \'$spip_lang_left\')');";
				} else {
					# ou la fermeture du menu des sous-rubriques
					$onClick .= "findObj_forcer('".$rac."_col_"
					. ($col+1)."').innerHTML='';";
				}

				## afficher le descriptif de la rubrique dans la div du dessous?
				# si trop lent, commenter la ligne ci-dessous
				$onClick .= " aff_selection('rubrique','$rac','$la_rub');";
				##
					"\n\r", "  ")
			. "');";

				$ret .= "<div class='$class' onClick=\"changerhighlight(this); $onClick\" ondblclick=\"$ondbClick$onClick\">";
				$ret .= $titre;
				$ret .= "</div>";
			}
			$ret .= "\n<div class='$class'\nonClick=\"changerhighlight(this);$onClick\"\nondblclick=\"$ondbClick$onClick\">$titre\n</div>";
		}
	}
	
	$ret .= "</div>";
	$ret .= "\n</div>";

	if ($rubs[$col]) $ret .= mini_afficher_rubrique ($id_rubrique, $rac, $liste, $col+1, $rub_exclus);
	else $ret .= "<div id = '".$rac."_col_".($col+1)."'></div>";
	if ($list[$col]) $ret .= mini_afficher_rubrique ($id_rubrique, $rac, $list, $col+1, $rub_exclus);
	else $ret .= "\n<div id='$nom_col'></div>";
	
	$ret .= "</div>";
	$ret .= "\n</div>";

	return $ret;
}
@@ -120,16 +106,14 @@ function mini_hierarchie_rub ($id_rubrique) {
function mini_afficher_hierarchie ($id_rubrique, $rac="", $rub_exclus=0) {
	
	$id_parent = $id_rubrique;
	$liste = $id_rubrique;
	while ($id_parent = mini_hierarchie_rub ($id_parent)) {
		$liste = $id_parent.",".$liste;
	}
	
	$liste = "0,".$liste.$id_rubrique;
		
	$ret = mini_afficher_rubrique ($id_rubrique, $rac, $liste, $col = 1, $rub_exclus);
	
	return $ret;
	$liste = "0,".$liste;
		
	return mini_afficher_rubrique($id_rubrique, $rac, explode(',',$liste), 1, $rub_exclus);
}

// http://doc.spip.org/@mini_nav_principal