source: spip-zone/_plugins_/couteau_suisse/outils/titre_parent_fonctions.php

Last change on this file was 34816, checked in by patfr@…, 11 years ago

balise #TITRE_QQCHOSE : éviter les calculs si le champ est déjà présent en base !

File size: 5.3 KB
Line 
1<?php
2// filtre 'titre_rubrique' a utiliser sur #ID_RUBRIQUE d'un objet ou #ID_PARENT d'une rubrique
3// Ex :  : <BOUCLE_a(ARTICLES)>[(#ID_RUBRIQUE|titre_rubrique)]</BOUCLE_a>
4// Ex :  : <BOUCLE_b(BREVES)>[(#ID_RUBRIQUE|titre_rubrique)]</BOUCLE_b>
5// Ex :  : <BOUCLE_r(RUBRIQUES)>[(#ID_PARENT|titre_rubrique)]</BOUCLE_r>
6//
7// filtre 'titre_groupe' a utiliser sur #ID_GROUPE d'un mot-clef
8// Ex :  : <BOUCLE_m(MOTS)>[(#ID_GROUPE|titre_groupe)]</BOUCLE_m>
9if(defined('_SPIP19300')) {
10        function filtre_titre_rubrique($id_rubrique, $table='rubriques', $id='id_rubrique') {
11                return cs_titre_id($id_rubrique, $table, $id);
12        }
13        function filtre_titre_groupe($id_mot, $table='groupes_mots', $id='id_groupe') {
14                return cs_titre_id($id_mot, $table, $id);
15        }
16} else {
17        function titre_rubrique($id_rubrique, $table='rubriques', $id='id_rubrique') {
18                return cs_titre_id($id_rubrique, $table, $id);
19        }
20        function titre_groupe($id_mot, $table='groupes_mots', $id='id_groupe') {
21                return cs_titre_id($id_mot, $table, $id);
22        }
23}
24
25// filtre 'titre_id', s'applique aux #ID_OBJET
26// Renvoie le titre trouve dans la $table_parent, la ou $champ_id = $id
27function cs_titre_id($id, $table_parent='rubriques', $champ_id='id_rubrique') {
28// spip_log("#TITRE_PARENT SELECTED FROM spip_$table_parent WHERE $champ_id=$id".(!$id?' : requete non executee':''));
29        // retour nul si pas de parent a priori
30        if(!$id) return '';
31        return cs_titre_sql($table_parent, "$champ_id=$id");
32}
33
34// choix du champ qui correspond a un titre
35function cs_titre_champ($table) {
36        return $table=='auteurs'?'nom':'titre';
37}
38
39// cherche le titre/nom d'un objet en base
40function cs_titre_sql($table, $where) {
41        $titre = cs_titre_champ($table);
42        // Utiliser la bonne requete en fonction de la version de SPIP
43        if(function_exists('sql_getfetsel') && function_exists('table_objet_sql')) {
44                // SPIP 2.0
45                if($r = sql_getfetsel($titre, table_objet_sql($table), $where))
46                        return $r;
47        } else {
48                if($r = spip_query("SELECT $titre FROM spip_$table WHERE $where"))
49                        // s'il existe un champ, on le retourne
50                        if($row = spip_fetch_array($r)) return $row[$titre];
51        }
52        // sinon, rien !
53        return '';
54}
55
56// Rubrique parente de tout objet possedant un 'id_rubrique' ou groupe de mot-clef
57function balise_TITRE_PARENT_dist($p) {
58        // examen du contexte
59        switch ($p->type_requete) {
60                case 'rubriques':
61                        $table_parent = 'rubriques';
62                        $champ_parent = 'id_rubrique';
63                        $id = 'id_parent';
64                        break;
65                case 'mots':
66                        $table_parent = 'groupes_mots';
67                        $id = $champ_parent = 'id_groupe';
68                        break;
69                default:
70                        $table_parent = 'rubriques';
71                        $id = $champ_parent = 'id_rubrique';
72                        break;
73        }
74        // id de l'objet a trouver pour retourner son titre
75        $id = champ_sql($id, $p);
76        // le code php a executer
77        $p->code = "cs_titre_id(intval($id), '$table_parent', '$champ_parent')";
78        $p->interdire_scripts = false;
79        return $p;
80}
81
82// juste le groupe d'un mot-clef
83function balise_TITRE_GROUPE_dist($p) {
84        $p->code = "''";
85        $p->interdire_scripts = false;
86        return $p->type_requete=='mots'?balise_TITRE_PARENT_dist($p):$p;
87}
88
89if(defined('_SPIP19300') && defined('_PARENTS_ETENDUS')) {
90
91        // recherche de la table associee a l'objet
92        function cs_table_objet($objet) {
93                switch($objet) {
94                        case 'trad': return 'articles';
95                        case 'thread': /*case 'forum':*/ return 'forum';
96                        case 'secteur': return 'rubriques';
97#                       case 'import': return ''; // a quoi ca sert ?
98                }
99                return table_objet($objet);
100        }
101       
102        // balise #TITRE_QQCHOSE
103        // voire #TITRE_QQCHOSE{id_qqchose}
104        function balise_TITRE__dist($p) {
105                $champ = $p->nom_champ;
106                if ($f = charger_fonction($champ, 'balise', true))
107                        return $f($p);
108                $code = champ_sql($champ, $p);
109                if (strpos($code, '@$Pile[0]') !== false) {
110                        // le champ est absent de la base, on peut calculer la balise
111                        preg_match(",^TITRE_([A-Z_]+)?$,i", $champ, $regs);
112                        $objet = strtolower($regs[1]);
113                        $table = cs_table_objet($objet);
114                        $champ_parent = id_table_objet($table);
115                        // id de l'objet a trouver pour retourner son titre
116                        $id = ($v = interprete_argument_balise(1,$p))!==NULL ? $v : champ_sql('id_'.$objet, $p);
117                        // le code php a executer, avant de le passer aux traitements
118                        $p->code = cs_titre_traitements("cs_titre_id(intval($id), '$table', '$champ_parent')", $table);
119                } else 
120                        // puisque le champ est present dans la base, on le renvoie
121                        $p->code = champ_sql($champ, $p);
122                $p->interdire_scripts = false;
123                return $p;
124        }
125
126        // voir la fonction champs_traitements($p) dans : public/refereces.php
127        function cs_titre_traitements($code, $table) {
128                global $table_des_traitements;
129                $ps = $table_des_traitements[strtoupper(cs_titre_champ($table))];
130                if (is_array($ps))
131                        $ps = $ps[isset($ps[$table])?$table:0];
132                if (!$ps) return $code;
133                // champs sensibles
134                if(in_array($table, array('messages', 'forums', 'signatures', 'syndic_articles')))
135                        $ps = "safehtml($ps)";
136                // remplacement final
137                return str_replace('%s', $code, $ps);
138        }
139
140} // if(defined('_SPIP19300'))
141
142include_spip('public/interfaces');
143global $table_des_traitements;
144
145// TITRE_PARENT et TITRE_GROUPE sont des TITREs !
146if (!isset($table_des_traitements['TITRE_PARENT']))
147        $table_des_traitements['TITRE_PARENT'] = $table_des_traitements['TITRE'];
148if (!isset($table_des_traitements['TITRE_GROUPE']))
149        $table_des_traitements['TITRE_GROUPE'] = $table_des_traitements['TITRE'];
150
151?>
Note: See TracBrowser for help on using the repository browser.