Carnet Wiki

NouveauCritere

Version 2 — Juillet 2006 — claudeD

[Erreur...3]Cette page est dédiée à sa documentation en attendant de lui trouver sa place définitive. Voir aussi cette contrib de Mars 2006

Mortimer : il faudrait peut être la découper en plusieurs sous-pages.

| NouveauCompilo | NouvelleBoucle | NouvelleBalise | InterfaceEtUsages | CreerUnCritere


Des nouveaux critères

Principe

Le NouveauCompilo permet maintenant d’ajouter ses propres paramètres aux boucles. Cela va dans le sens de l’ajout de nouvelles boucles, sur de nouvelles tables, dans SPIP. Mais bien sûr, on peut aussi les utiliser pour écrire ses propres extensions des tables actuelles.

[Erreur...12]Implémenter un nouveau critère demandera donc une connaissance des requêtes SQL.

Par exemple, quand on ajoute le critère {exclus} à une boucle d’articles, SPIP va ajouter une contrainte disant que l’on ne veut pas récupérer l’article en cours de la table, mais juste les autres :

		WHERE ... AND spip_articles.id_articles != XX

implémentation

Les critères du noyau de SPIP sont tous déclarés dans inc-criteres.php3, y jeter un coup d’oeil est une bonne idée.

[Erreur...17]Par exemple, la fonction pour le critère {exclus} est déclarée comme cela :

function critere_exclus_dist($idb, &$boucles, $param, $not) {
	$boucle = &$boucles[$idb];


if ($param != 'exclus' OR $not)
		erreur_squelette(_T('info_erreur_squelette'), $param);


[Erreur...20]}

Cette fonction a un _dist à la fin, parce que c’est une fonction du noyau, on peut ainsi écraser cette fonction en déclarant sa propre fonction critere_exclus.

[Erreur...23]Elle commence par deux morceaux de code assez commun :

	$boucle = &$boucles[$idb];


qui permet de récupérer la boucle actuelle.

	if ($param != 'exclus' OR $not)
		erreur_squelette(_T('info_erreur_squelette'), $param);


qui vérifie que le critère passé n’est pas accompagné d’autres paramètres et qu’il n’est pas nié (ce qui n’aurait pas de sens pour ce critère)

La dernière partie du code ajoute la nouvelle contrainte à la requête :

	$boucle->where[] = $boucle->id_table . '.' . $boucle->primary."!='"."
	. calculer_argument_precedent($idb,$boucle->primary, $boucles) .
	 "."'";

[Erreur...26][Erreur...27][Erreur...28][Erreur...29]

Exemple

-  Nouveau Critére : trouver les articles (ou autre) similaires
-  critère LIKE MySQL : {like titre %machin-chose%}
----
<code <cadre >
function critere_like($idb, &$boucles, $crit)

$boucle = $boucles[$idb] ; //la boucle actuelle
$not = $crit->not ; //est-ce que le critère est inversé : !like
$id = $boucle->primary ; //l’id de la table actuelle

if (count($params) < 2) //vérifie le nombre de paramètres
erreur_squelette(_T(’zbug_info_erreur_squelette’),
"like ? BOUCLE$idb") ;

[Erreur...34] $variable = array_shift($crit->param) ;
$variable = calculer_liste($variable, array(), $boucles, $boucle->id_parent) ; //on calcule la valeur du 2e paramètre 2e paramètre . Ainsi, on peut utiliser une balise SPIP dedans.

[Erreur...36]--------------

| NouveauCompilo | NouvelleBoucle | NouvelleBalise | InterfaceEtUsages |