[PLUGINS] ~maj spip-bonux 2.3.0-->2.3.2
[velocampus/web/www.git] / www / plugins / auto / spip-bonux / spip_bonux_fonctions.php
1 <?php
2 /**
3 * Plugin Spip-Bonux
4 * Le plugin qui lave plus SPIP que SPIP
5 * (c) 2008 Mathieu Marcillaud, Cedric Morin, Romy Tetue
6 * Licence GPL
7 *
8 */
9
10 if (!defined("_ECRIRE_INC_VERSION")) return;
11
12 include_spip('inc/core21_filtres');
13
14 /**
15 * une fonction pour générer des menus avec liens
16 * ou un span lorsque l'item est sélectionné
17 *
18 * @param string $url
19 * @param string $libelle
20 * @param bool $on
21 * @param string $class
22 * @param string $title
23 * @return string
24 */
25 function aoustrong($url,$libelle,$on=false,$class="",$title="",$rel=""){
26 return lien_ou_expose($url,$libelle,$on,$class,$title,$rel);
27 }
28
29
30 /**
31 * une fonction pour générer une balise img à partir d'un nom de fichier
32 *
33 * @param string $img
34 * @param string $alt
35 * @param string $class
36 * @return string
37 */
38 function tag_img($img,$alt="",$class=""){
39 $balise_img = chercher_filtre('balise_img');
40 return $balise_img($img,$alt,$class);
41 }
42
43 /**
44 * Afficher un message "un truc"/"N trucs"
45 *
46 * @param int $nb
47 * @return string
48 */
49 function affiche_un_ou_plusieurs($nb,$chaine_un,$chaine_plusieurs,$var='nb'){
50 return singulier_ou_pluriel($nb,$chaine_un,$chaine_plusieurs,$var);
51 }
52
53 /**
54 * Ajouter un timestamp à une url de fichier
55 *
56 * @param unknown_type $fichier
57 * @return unknown
58 */
59 function timestamp($fichier){
60 if (!$fichier) return $fichier;
61 $m = filemtime($fichier);
62 return "$fichier?$m";
63 }
64
65 /**
66 * Transformer un tableau d'entrées array("rubrique|9","article|8",...)
67 * en un tableau contenant uniquement les identifiants d'un type donné.
68 * Accepte aussi que les valeurs d'entrées soient une chaîne brute
69 * "rubrique|9,article|8,..."
70 *
71 * @param array/string $selected liste des entrées : tableau ou chaîne séparée par des virgules
72 * @param string $type type de valeur à récuperer ('rubrique', 'article')
73 *
74 * @return array liste des identifiants trouvés.
75 **/
76 function picker_selected($selected, $type){
77 $select = array();
78 $type = preg_replace(',\W,','',$type);
79
80 if ($selected and !is_array($selected))
81 $selected = explode(',', $selected);
82
83 if (is_array($selected))
84 foreach($selected as $value)
85 if (preg_match(",".$type."[|]([0-9]+),",$value,$match)
86 AND strlen($v=intval($match[1])))
87 $select[] = $v;
88 return $select;
89 }
90
91 function picker_identifie_id_rapide($ref,$rubriques=0,$articles=0){
92 include_spip("inc/json");
93 include_spip("inc/lien");
94 if (!($match = typer_raccourci($ref)))
95 return json_export(false);
96 @list($type,,$id,,,,) = $match;
97 if (!in_array($type,array($rubriques?'rubrique':'x',$articles?'article':'x')))
98 return json_export(false);
99 $table_sql = table_objet_sql($type);
100 $id_table_objet = id_table_objet($type);
101 if (!$titre = sql_getfetsel('titre',$table_sql,"$id_table_objet=".intval($id)))
102 return json_export(false);
103 $titre = attribut_html(extraire_multi($titre));
104 return json_export(array('type'=>$type,'id'=>"$type|$id",'titre'=>$titre));
105 }
106
107 /**
108 * Donner n'importe quelle information sur un objet de manière générique.
109 *
110 * La fonction va gérer en interne deux cas particuliers les plus utilisés :
111 * l'URL et le titre (qui n'est pas forcemment la champ SQL "titre").
112 *
113 * On peut ensuite personnaliser les autres infos en créant une fonction
114 * generer_<nom_info>_entite($id_objet, $type_objet, $ligne).
115 * $ligne correspond à la ligne SQL de tous les champs de l'objet, les fonctions
116 * de personnalisation n'ont donc pas à refaire de requête.
117 *
118 * @param int $id_objet
119 * @param string $type_objet
120 * @param string $info
121 * @return string
122 */
123 function generer_info_entite($id_objet, $type_objet, $info, $etoile=''){
124 // On vérifie qu'on a tout ce qu'il faut
125 $id_objet = intval($id_objet);
126 if (!($id_objet and $type_objet and $info))
127 return '';
128
129 // Si on demande l'url, on retourne direct la fonction
130 if ($info == 'url')
131 return generer_url_entite($id_objet, $type_objet);
132
133 // Si on demande le titre, on le gère en interne
134 if ($demande_titre = ($info == 'titre')){
135 global $table_titre;
136 $champ_titre = $table_titre[table_objet($type_objet)];
137 if (!$champ_titre) $champ_titre = 'titre';
138 $champ_titre = ", $champ_titre";
139 }
140
141 // Sinon on va tout chercher dans la table et on garde en mémoire
142 static $objets;
143
144 // On ne fait la requête que si on n'a pas déjà l'objet ou si on demande le titre mais qu'on ne l'a pas encore
145 if (!$objets[$type_objet][$id_objet] or ($demande_titre and !$objets[$type_objet][$id_objet]['titre'])){
146 include_spip('base/abstract_sql');
147 include_spip('base/connect_sql');
148 $objets[$type_objet][$id_objet] = sql_fetsel(
149 '*'.$champ_titre,
150 table_objet_sql($type_objet),
151 id_table_objet($type_objet).' = '.intval($id_objet)
152 );
153 }
154 $ligne = $objets[$type_objet][$id_objet];
155
156 if ($demande_titre)
157 $info_generee = $objets[$type_objet][$id_objet]['titre'];
158 // Si la fonction generer_TRUC_entite existe, on l'utilise
159 else if ($generer = charger_fonction("generer_${info}_entite", '', true))
160 $info_generee = $generer($id_objet, $type_objet, $ligne);
161 // Sinon on prend le champ SQL
162 else
163 $info_generee = $ligne[$info];
164
165 // On va ensuite chercher les traitements automatiques à faire
166 global $table_des_traitements;
167 $maj = strtoupper($info);
168 $traitement = $table_des_traitements[$maj];
169 $table_objet = table_objet($type_objet);
170
171 if (!$etoile and is_array($traitement)){
172 $traitement = $traitement[isset($traitement[$table_objet]) ? $table_objet : 0];
173 $traitement = str_replace('%s', '"'.str_replace('"', '\\"', $info_generee).'"', $traitement);
174 eval("\$info_generee = $traitement;");
175 }
176
177 return $info_generee;
178 }
179
180 /**
181 * Protéger les champs passés dans l'url et utilisés dans {tri ...}
182 * préserver l'espace pour interpréter ensuite num xxx et multi xxx
183 * @param string $t
184 * @return string
185 */
186 function tri_protege_champ($t){
187 return preg_replace(',[^\s\w.+],','',$t);
188 }
189
190 /**
191 * Interpréter les multi xxx et num xxx utilisés comme tri
192 * pour la clause order
193 * 'multi xxx' devient simplement 'multi' qui est calculé dans le select
194 * 'hasard' est calculé dans le select
195 * @param string $t
196 * @return string
197 */
198 function tri_champ_order($t,$table=NULL,$field=NULL){
199 if (strncmp($t,'num ',4)==0){
200 $t = substr($t,4);
201 $t = preg_replace(',\s,','',$t);
202 // Lever une ambiguïté possible si le champ fait partie de la table (pour compatibilité de la balise tri avec compteur, somme, etc.)
203 if (!is_null($table) && !is_null($field) && in_array($t,unserialize($field)))
204 $t = "0+$table.$t";
205 else
206 $t = "0+$t";
207 return $t;
208 }
209 elseif(strncmp($t,'multi ',6)==0){
210 return "multi";
211 }
212 else {
213 $t = preg_replace(',\s,','',$t);
214 // Lever une ambiguïté possible si le champ fait partie de la table (pour compatibilité de la balise tri avec compteur, somme, etc.)
215 if (!is_null($table) && !is_null($field) && in_array($t,unserialize($field)))
216 return $table.'.'.$t;
217 else
218 return $t;
219 }
220 }
221
222 /**
223 * Interpréter les multi xxx et num xxx utilisés comme tri
224 * pour la clause select
225 * 'multi xxx' devient select "...." as multi
226 * les autres cas ne produisent qu'une chaîne vide '' en select
227 * 'hasard' devient 'rand() AS hasard' dans le select
228 *
229 * @param string $t
230 * @return string
231 */
232 function tri_champ_select($t){
233 if(strncmp($t,'multi ',6)==0){
234 $t = substr($t,6);
235 $t = preg_replace(',\s,','',$t);
236 $t = sql_multi($t,$GLOBALS['spip_lang']);
237 return $t;
238 }
239 if(trim($t)=='hasard'){
240 return 'rand() AS hasard';
241 }
242 return "''";
243 }
244
245 /**
246 * Rediriger une page suivant une autorisation,
247 * et ce, n'importe où dans un squelette, même dans les inclusions.
248 *
249 * @param bool $ok Indique si l'on doit rediriger ou pas
250 * @param string $url Adresse vers laquelle rediriger
251 * @param int $statut Statut HTML avec lequel on redirigera
252 * @return string
253 */
254 function filtre_sinon_interdire_acces_dist($ok=false, $url='', $statut=0){
255 if ($ok) return '';
256
257 // vider tous les tampons
258 while (ob_get_level())
259 ob_end_clean();
260
261 include_spip('inc/headers');
262 $statut = intval($statut);
263
264 // Si aucun argument on essaye de deviner quoi faire
265 if (!$url and !$statut){
266 // Si on est dans l'espace privé, on génère du 403 Forbidden
267 if (test_espace_prive()){
268 http_status(403);
269 $echec = charger_fonction('403','exec');
270 $echec();
271 }
272 // Sinon on redirige vers une 404
273 else{
274 $statut = 404;
275 }
276 }
277
278 // Sinon on suit les directives indiquées dans les deux arguments
279
280 // S'il y a un statut
281 if ($statut){
282 // Dans tous les cas on modifie l'entité avec ce qui est demandé
283 http_status($statut);
284 // Si le statut est une erreur 4xx on va chercher le squelette
285 if ($statut >= 400)
286 echo recuperer_fond("$statut");
287 }
288
289 // S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302)
290 if ($url) redirige_par_entete($url, '', $statut);
291
292 exit;
293 }
294
295 /**
296 * Calculer et retourner la profondeur de la rubrique
297 * (dans spip3, c'est un champ de la table rubrique)
298 * les rubriques à la racine sont à une profondeur de 1
299 *
300 * @param string
301 * @return int
302 */
303 function filtre_profondeur_dist($id_rubrique) {
304 $id_rubrique = intval($id_rubrique);
305
306 // sauver les calculs déjà faits
307 static $profs = array();
308 if (isset($profs[$id_rubrique])) {
309 return $profs[$id_rubrique];
310 }
311
312 // récupérer le parent.
313 $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique='.$id_rubrique);
314
315 // pas de parent : id_rubrique n'existe pas
316 if (is_null($id_parent)) {
317 return '';
318 }
319
320 // parent zéro : on est tout en haut (racine)
321 if ($id_parent == '0') {
322 return $profs[$id_rubrique] = 1;
323 }
324
325 // sinon, on trouve la profondeur du parent
326 $parent = filtre_profondeur_dist($id_parent);
327 $profs[$id_rubrique] = ($parent + 1);
328 return $profs[$id_rubrique];
329 }
330
331 ?>