Пример #1
0
/**
 * 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;
}
Пример #2
0
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);
}