Proposer une amélioration de commentaire

Le commentaire à poster est au format «docblock» (de phpDoc) qui peut être enrichi de tags spécifiques pour SPIP.
Fichier
ecrire/public/references.php
Fonction
index_tables_en_pile

    Nom ou pseudo de l'auteur de la proposition

Code original

/**
 * Cherche un champ dans une boucle
 *
 * Le champ peut être :
 *
 * - un alias d'un autre : il faut alors le calculer, éventuellement en
 *   construisant une jointure.
 * - présent dans la table : on l'utilise
 * - absent, mais le type de boucle l'autorise (joker des itérateurs DATA) :
 *   on l'utilise et lève le drapeau joker
 * - absent, on cherche une jointure et on l'utilise si on en trouve.
 *
 * @todo
 *     Ici la recherche de jointure sur l'absence d'un champ ne cherche
 *     une jointure que si des jointures explicites sont demandées,
 *     et non comme à d'autres endroits sur toutes les jointures possibles.
 *     Il faut homogénéiser cela.
 *
 *
 * @param string $idb Identifiant de la boucle
 * @param string $nom_champ Nom du champ SQL cherché
 * @param Boucle $boucles AST du squelette
 * @param bool $joker
 *     Le champ peut-il être inconnu à la compilation ?
 *     Ce drapeau sera levé si c'est le cas.
 * @return array
 *     Liste (Nom du champ véritable, nom du champ demandé).
 *     Le nom du champ véritable est une expression pour le SELECT de
 *     la boucle tel que "rubriques.titre" ou "mots.titre AS titre_mot".
 *     Les éléments de la liste sont vides si on ne trouve rien.
 **/
function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) {
 
	$r = $boucles[$idb]->type_requete;
	// boucle recursive, c'est foutu...
	if ($r == TYPE_RECURSIF) {
		return array();
	}
	if (!$r) {
		$joker = false; // indiquer a l'appelant
		# continuer pour chercher l'erreur suivante
		return array("'#" . $r . ':' . $nom_champ . "'", '');
	}
 
	$desc = $boucles[$idb]->show;
	// le nom du champ est il une exception de la table ? un alias ?
	$excep = isset($GLOBALS['exceptions_des_tables'][$r]) ? $GLOBALS['exceptions_des_tables'][$r] : '';
	if ($excep) {
		$excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : '';
	}
	if ($excep) {
		$joker = false; // indiquer a l'appelant
		return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
	} // pas d'alias. Le champ existe t'il ?
	else {
		// le champ est réellement présent, on le prend.
		if (isset($desc['field'][$nom_champ])) {
			$t = $boucles[$idb]->id_table;
			$joker = false; // indiquer a l'appelant
			return array("$t.$nom_champ", $nom_champ);
		}
		// Tous les champs sont-ils acceptés ?
		// Si oui, on retourne le champ, et on lève le flag joker
		// C'est le cas des itérateurs DATA qui acceptent tout
		// et testent la présence du champ à l'exécution et non à la compilation
		// car ils ne connaissent pas ici leurs contenus.
		elseif (/*$joker AND */
		isset($desc['field']['*'])
		) {
			$joker = true; // indiquer a l'appelant
			return array($nom_champ, $nom_champ);
		}
		// pas d'alias, pas de champ, pas de joker...
		// tenter via une jointure...
		else {
			$joker = false; // indiquer a l'appelant
			// regarder si le champ est deja dans une jointure existante
			// sinon, si il y a des joitures explicites, la construire
			if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
				if ($boucles[$idb]->jointures_explicites) {
					// [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
					// fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
					// mais est-ce ce qu'on veut ?
					$jointures = preg_split("/\s+/", $boucles[$idb]->jointures_explicites);
					if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
						$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
					}
				}
			}
			if ($t) {
				// si on a trouvé une jointure possible, on fait comme
				// si c'était une exception pour le champ demandé
				return index_exception($boucles[$idb],
					$desc,
					$nom_champ,
					array($t[1]['id_table'], reset($t[2])));
			}
 
			return array('', '');
		}
	}
}

Le commentaire au format « docblock » peut être complété des éléments suivants sécifiques
à SPIP.

Sur un entête de fichier :

  • @package SPIP\Core\x (pour un fichier du core, x dépendant du fichier)
  • @package SPIP\Nom\x (pour un fichier de plugin, Nom étant le nom du plugin)

Sur un entête de fonction :

  • @pipeline x : indique que la fonction est une utilisation d’un pipeline
  • @pipeline_appel x : indique que la fonction appelle le pipeline indiqué
  • @balise : indique que la fonction est une compilation de balise
  • @filtre : indique un |filtre
  • @critere : indique que la fonction est une compilaiton de critère
  • @boucle : indique que la fonction est une compilaiton de boucle
Vous inscrire sur ce site

L’espace privé de ce site est ouvert aux visiteurs, après inscription. Une fois enregistré, vous pourrez consulter les articles en cours de rédaction, proposer des articles et participer à tous les forums.

Identifiants personnels

Indiquez ici votre nom et votre adresse email. Votre identifiant personnel vous parviendra rapidement, par courrier électronique.