/** * Compile la balise `#RANG` chargée d'afficher le numéro de l'objet * * Affiche le « numero de l'objet ». Soit `1` quand on a un titre `1. Premier article`. * * Ceci est transitoire afin de préparer une migration vers un vrai système de * tri des articles dans une rubrique (et plus si affinités). * La balise permet d'extraire le numero masqué par le filtre `supprimer_numero`. * * La balise recupère le champ declaré dans la définition `table_titre` * de l'objet, ou à defaut du champ `titre` * * Si un champ `rang` existe, il est pris en priorité. * * @balise * @link http://www.spip.net/5495 * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ function balise_RANG_dist($p) { $b = index_boucle($p); if ($b === '') { $msg = array('zbug_champ_hors_boucle', array('champ' => '#RANG')); erreur_squelette($msg, $p); } else { // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql) // dans la boucle immediatement englobante uniquement // sinon on compose le champ calcule $_rang = champ_sql('rang', $p, '', false); // si pas trouve de champ sql rang : if (!$_rang or $_rang == "''") { $boucle =& $p->boucles[$b]; $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($boucle->id_table); $_titre = ''; # où extraire le numero ? if (isset($desc['titre'])) { $t = $desc['titre']; if (preg_match(';(?:lang\\s*,)\\s*(.*?titre)\\s*(,|$);', $t, $m) or preg_match(';^(.*?titre)\\s*(,|$);', $t, $m)) { $m = preg_replace(',as\\s+titre$,i', '', $m[1]); $m = trim($m); if ($m != "''") { if (!preg_match(",\\W,", $m)) { $m = $boucle->id_table . ".{$m}"; } $m .= " AS titre_rang"; $boucle->select[] = $m; $_titre = '$Pile[$SP][\'titre_rang\']'; } } } // si on n'a rien trouvé, on utilise le champ titre classique if (!$_titre) { $_titre = champ_sql('titre', $p); } $_rang = "recuperer_numero({$_titre})"; } $p->code = $_rang; $p->interdire_scripts = false; } return $p; }
function champs_traitements($p) { global $table_des_traitements; if (isset($table_des_traitements[$p->nom_champ])) { $ps = $table_des_traitements[$p->nom_champ]; } else { // quand on utilise un traitement catch-all * // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer // leur propre securite if (!$p->balise_calculee) { $ps = $table_des_traitements['*']; } else { $ps = false; } } if (is_array($ps)) { // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte $idb = index_boucle($p); // mais on peut aussi etre hors boucle. Se mefier. $type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false; $table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false; // le traitement peut n'etre defini que pour une table en particulier "spip_articles" if ($table_sql and isset($ps[$table_sql])) { $ps = $ps[$table_sql]; } elseif ($type_requete and isset($ps[$type_requete])) { $ps = $ps[$type_requete]; } elseif (isset($ps[0])) { $ps = $ps[0]; } else { $ps = false; } } if (!$ps) { return $p->code; } // Si une boucle DOCUMENTS{doublons} est presente dans le squelette, // ou si in INCLURE contient {doublons} // on insere une fonction de remplissage du tableau des doublons // dans les filtres propre() ou typo() // (qui traitent les raccourcis <docXX> referencant les docs) if (isset($p->descr['documents']) and $p->descr['documents'] and (strpos($ps, 'propre') !== false or strpos($ps, 'typo') !== false)) { $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; } // La protection des champs par |safehtml est assuree par les extensions // dans la declaration des traitements des champs sensibles // Remplacer enfin le placeholder %s par le vrai code de la balise return str_replace('%s', $p->code, $ps); }