[SPIP] ~maj v3.0.14-->v3.0.17
[ptitvelo/web/www.git] / www / ecrire / inc / filtres_ecrire.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Fonctions utilisées au calcul des squelette du privé.
15 *
16 * @package SPIP\Filtres
17 */
18 if (!defined('_ECRIRE_INC_VERSION')) return;
19
20 include_spip('inc/filtres_boites');
21 include_spip('inc/boutons');
22 include_spip('inc/pipelines_ecrire');
23
24
25 /**
26 * Retourne les paramètres de personnalisation css de l'espace privé
27 *
28 * Ces paramètres sont (ltr et couleurs) ce qui permet une écriture comme :
29 * generer_url_public('style_prive', parametres_css_prive())
30 * qu'il est alors possible de récuperer dans le squelette style_prive.html avec
31 *
32 * #SET{claire,##ENV{couleur_claire,edf3fe}}
33 * #SET{foncee,##ENV{couleur_foncee,3874b0}}
34 * #SET{left,#ENV{ltr}|choixsiegal{left,left,right}}
35 * #SET{right,#ENV{ltr}|choixsiegal{left,right,left}}
36 *
37 * @return string
38 */
39 function parametres_css_prive(){
40 global $visiteur_session;
41
42 $args = array();
43 $args['v'] = $GLOBALS['spip_version_code'];
44 $args['p'] = substr(md5($GLOBALS['meta']['plugin']),0,4);
45 $args['themes'] = implode(',',lister_themes_prives());
46 $args['ltr'] = $GLOBALS['spip_lang_left'];
47 // un md5 des menus : si un menu change il faut maj la css
48 $args['md5b'] = (function_exists('md5_boutons_plugins')?md5_boutons_plugins():'');
49
50 $c = (is_array($visiteur_session)
51 AND is_array($visiteur_session['prefs']))
52 ? $visiteur_session['prefs']['couleur']
53 : 1;
54
55 $couleurs = charger_fonction('couleurs', 'inc');
56 parse_str($couleurs($c),$c);
57 $args = array_merge($args, $c);
58
59 if (_request('var_mode')=='recalcul' OR (defined('_VAR_MODE') AND _VAR_MODE=='recalcul'))
60 $args['var_mode'] = 'recalcul';
61
62 return http_build_query($args);
63 }
64
65
66 /**
67 * Afficher le sélecteur de rubrique
68 *
69 * Il permet de placer un objet dans la hiérarchie des rubriques de SPIP
70 *
71 * @param string $titre
72 * @param int $id_objet
73 * @param int $id_parent
74 * @param string $objet
75 * @param int $id_secteur
76 * @param bool $restreint
77 * @param bool $actionable
78 * true : fournit le selecteur dans un form directement postable
79 * @param bool $retour_sans_cadre
80 * @return string
81 */
82 function chercher_rubrique($titre,$id_objet, $id_parent, $objet, $id_secteur, $restreint,$actionable = false, $retour_sans_cadre=false){
83 global $spip_lang_right;
84 include_spip('inc/autoriser');
85 if (intval($id_objet) && !autoriser('modifier', $objet, $id_objet))
86 return "";
87 if (!sql_countsel('spip_rubriques'))
88 return "";
89 $chercher_rubrique = charger_fonction('chercher_rubrique', 'inc');
90 $form = $chercher_rubrique($id_parent, $objet, $restreint, ($objet=='rubrique')?$id_objet:0);
91
92 if ($id_parent == 0) $logo = "racine-24.png";
93 elseif ($id_secteur == $id_parent) $logo = "secteur-24.png";
94 else $logo = "rubrique-24.png";
95
96 $confirm = "";
97 if ($objet=='rubrique') {
98 // si c'est une rubrique-secteur contenant des breves, demander la
99 // confirmation du deplacement
100 $contient_breves = sql_countsel('spip_breves', "id_rubrique=".intval($id_objet));
101
102 if ($contient_breves > 0) {
103 $scb = ($contient_breves>1? 's':'');
104 $scb = _T('avis_deplacement_rubrique',
105 array('contient_breves' => $contient_breves,
106 'scb' => $scb));
107 $confirm .= "\n<div class='confirmer_deplacement verdana2'>"
108 ."<div class='choix'><input type='checkbox' name='confirme_deplace' value='oui' id='confirme-deplace' /><label for='confirme-deplace'>"
109 . $scb .
110 "</label></div></div>\n";
111 } else
112 $confirm .= "<input type='hidden' name='confirme_deplace' value='oui' />\n";
113 }
114 $form .= $confirm;
115 if ($actionable){
116 if (strpos($form,'<select')!==false) {
117 $form .= "<div style='text-align: $spip_lang_right;'>"
118 . '<input class="fondo" type="submit" value="'._T('bouton_choisir').'"/>'
119 . "</div>";
120 }
121 $form = "<input type='hidden' name='editer_$objet' value='oui' />\n" . $form;
122 $form = generer_action_auteur("editer_$objet", $id_objet, self(), $form, " method='post' class='submit_plongeur'");
123 }
124
125 if ($retour_sans_cadre)
126 return $form;
127
128 include_spip('inc/presentation');
129 return debut_cadre_couleur($logo, true, "", $titre) . $form .fin_cadre_couleur(true);
130
131 }
132
133
134 /**
135 * Tester si le site peut avoir des visiteurs
136 *
137 * @param bool $past
138 * si true, prendre en compte le fait que le site a *deja* des visiteurs
139 * comme le droit d'en avoir de nouveaux
140 * @param bool $accepter
141 * @return bool
142 */
143 function avoir_visiteurs($past=false, $accepter=true) {
144 if ($GLOBALS['meta']["forums_publics"] == 'abo') return true;
145 if ($accepter AND $GLOBALS['meta']["accepter_visiteurs"] <> 'non') return true;
146 if (sql_countsel('spip_articles', "accepter_forum='abo'"))return true;
147 if (!$past) return false;
148 return sql_countsel('spip_auteurs',
149 "statut NOT IN ('0minirezo','1comite', '5poubelle')
150 AND (statut<>'nouveau' OR prefs NOT IN ('0minirezo','1comite', '5poubelle'))");
151 }
152
153 /**
154 * Lister les status d'article visibles dans l'espace prive
155 * en fonction du statut de l'auteur
156 *
157 * Pour l'extensibilie de SPIP, on se repose sur autoriser('voir','article')
158 * en testant un à un les status présents en base
159 *
160 * On mémorise en static pour éviter de refaire plusieurs fois.
161 *
162 * @param string $statut_auteur
163 * @return array
164 */
165 function statuts_articles_visibles($statut_auteur){
166 static $auth = array();
167 if (!isset($auth[$statut_auteur])){
168 $auth[$statut_auteur] = array();
169 $statuts = array_map('reset',sql_allfetsel('distinct statut','spip_articles'));
170 foreach($statuts as $s){
171 if (autoriser('voir','article',0,array('statut'=>$statut_auteur),array('statut'=>$s)))
172 $auth[$statut_auteur][] = $s;
173 }
174 }
175
176 return $auth[$statut_auteur];
177 }
178
179 /**
180 * Traduire le statut technique de l'auteur en langage compréhensible
181 *
182 * Si $statut=='nouveau' et que le statut en attente est fourni,
183 * le prendre en compte en affichant que l'auteur est en attente
184 *
185 * @param string $statut
186 * @param string $attente
187 * @return string
188 */
189 function traduire_statut_auteur($statut,$attente=""){
190 $plus = "";
191 if ($statut=='nouveau') {
192 if ($attente) {
193 $statut = $attente;
194 $plus = " ("._T('info_statut_auteur_a_confirmer').")";
195 }
196 else return _T('info_statut_auteur_a_confirmer');
197 }
198
199 $recom = array("info_administrateurs" => _T('item_administrateur_2'),
200 "info_redacteurs" => _T('intem_redacteur'),
201 "info_visiteurs" => _T('item_visiteur'),
202 '5poubelle' => _T('texte_statut_poubelle'), // bouh
203 );
204 if (isset($recom[$statut]))
205 return $recom[$statut].$plus;
206
207 // retrouver directement par le statut sinon
208 if ($t = array_search($statut, $GLOBALS['liste_des_statuts'])){
209 if (isset($recom[$t]))
210 return $recom[$t].$plus;
211 return _T($t).$plus;
212 }
213
214 // si on a pas reussi a le traduire, retournons la chaine telle quelle
215 // c'est toujours plus informatif que rien du tout
216 return $statut;
217 }
218
219 /**
220 * Afficher la mention des autres auteurs ayant modifié un objet
221 *
222 * @param int $id_objet
223 * @param string $objet
224 * @return string
225 */
226 function afficher_qui_edite($id_objet,$objet){
227 static $qui = array();
228 if (isset($qui[$objet][$id_objet]))
229 return $qui[$objet][$id_objet];
230
231 if ($GLOBALS['meta']['articles_modif'] == 'non')
232 return $qui[$objet][$id_objet] = '';
233
234 include_spip('inc/drapeau_edition');
235 $modif = mention_qui_edite($id_objet, $objet);
236 if (!$modif) return $qui[$objet][$id_objet] = '';
237
238 include_spip('base/objets');
239 $infos = lister_tables_objets_sql(table_objet_sql($objet));
240 if (isset($infos['texte_signale_edition']))
241 return $qui[$objet][$id_objet] = _T($infos['texte_signale_edition'], $modif);
242
243 return $qui[$objet][$id_objet] = _T('info_qui_edite', $modif);
244 }
245
246 /**
247 * Lister les statuts des auteurs
248 *
249 * @param string $quoi
250 * redacteurs : retourne les statuts des auteurs au moins redacteur, tels que defini par AUTEURS_MIN_REDAC
251 * visiteurs : retourne les statuts des autres auteurs, cad les visiteurs et autres statuts perso
252 * tous : retourne tous les statuts connus
253 * @param bool $en_base
254 * si true, ne retourne strictement que les status existants en base
255 * dans tous les cas, les statuts existants en base sont inclus
256 * @return array
257 */
258 function auteurs_lister_statuts($quoi='tous',$en_base=true) {
259 if (!defined('AUTEURS_MIN_REDAC')) define('AUTEURS_MIN_REDAC', "0minirezo,1comite,5poubelle");
260
261 switch($quoi){
262 case "redacteurs":
263 $statut = AUTEURS_MIN_REDAC;
264 $statut = explode(',',$statut);
265 if ($en_base) {
266 $check = array_map('reset',sql_allfetsel('DISTINCT statut','spip_auteurs',sql_in('statut',$statut)));
267 $retire = array_diff($statut,$check);
268 $statut = array_diff($statut,$retire);
269 }
270 return array_unique($statut);
271 break;
272 case "visiteurs":
273 $statut = array();
274 $exclus = AUTEURS_MIN_REDAC;
275 $exclus = explode(',',$exclus);
276 if (!$en_base){
277 // prendre aussi les statuts de la table des status qui ne sont pas dans le define
278 $statut = array_diff(array_values($GLOBALS['liste_des_statuts']),$exclus);
279 }
280 $s_complement = array_map('reset',sql_allfetsel('DISTINCT statut','spip_auteurs',sql_in('statut',$exclus,'NOT')));
281 return array_unique(array_merge($statut,$s_complement));
282 break;
283 default:
284 case "tous":
285 $statut = array_values($GLOBALS['liste_des_statuts']);
286 $s_complement = array_map('reset',sql_allfetsel('DISTINCT statut','spip_auteurs',sql_in('statut',$statut,'NOT')));
287 $statut = array_merge($statut,$s_complement);
288 if ($en_base) {
289 $check = array_map('reset',sql_allfetsel('DISTINCT statut','spip_auteurs',sql_in('statut',$statut)));
290 $retire = array_diff($statut,$check);
291 $statut = array_diff($statut,$retire);
292 }
293 return array_unique($statut);
294 break;
295 }
296
297 // on arrive jamais ici
298 return array_values($GLOBALS['liste_des_statuts']);
299 }
300
301 /**
302 * Déterminer la rubrique pour la création d'un objet heuristique
303 *
304 * Rubrique courante si possible,
305 * - sinon rubrique administrée pour les admin restreint
306 * - sinon première rubrique de premier niveau autorisée que l'on trouve
307 *
308 * @param int $id_rubrique Identifiant de rubrique (si connu)
309 * @param string $objet Objet en cours de création
310 * @return int Identifiant de la rubrique dans laquelle créer l'objet
311 */
312 function trouver_rubrique_creer_objet($id_rubrique,$objet){
313 global $connect_id_rubrique;
314 if (!$id_rubrique AND defined('_CHOIX_RUBRIQUE_PAR_DEFAUT') AND _CHOIX_RUBRIQUE_PAR_DEFAUT){
315 $in = !count($connect_id_rubrique)
316 ? ''
317 : (" AND ".sql_in('id_rubrique', $connect_id_rubrique));
318
319 // on tente d'abord l'ecriture a la racine dans le cas des rubriques uniquement
320 if ($objet == 'rubrique') {
321 $id_rubrique = 0;
322 } else {
323 $id_rubrique = sql_getfetsel('id_rubrique', 'spip_rubriques', "id_parent=0$in", '', "id_rubrique DESC", 1);
324 }
325
326 if (!autoriser("creer{$objet}dans", 'rubrique', $id_rubrique)){
327 // manque de chance, la rubrique n'est pas autorisee, on cherche un des secteurs autorises
328 $res = sql_select("id_rubrique", "spip_rubriques", "id_parent=0");
329 while (!autoriser("creer{$objet}dans", 'rubrique', $id_rubrique) && $row_rub = sql_fetch($res)){
330 $id_rubrique = $row_rub['id_rubrique'];
331 }
332 }
333 }
334 return $id_rubrique;
335 }
336
337 /**
338 * Afficher le lien de redirection d'un article virtuel si il y a lieu
339 * (rien si l'article n'est pas redirige)
340 *
341 * @param string $virtuel
342 * @return string
343 */
344 function lien_article_virtuel($virtuel){
345 include_spip('inc/lien');
346 if (!$virtuel = virtuel_redirige($virtuel))
347 return '';
348 return propre("[->".$virtuel."]");
349 }
350
351
352 /**
353 * Filtre pour generer un bouton RSS prive
354 * protege par un hash de faible securite
355 *
356 * http://doc.spip.org/@bouton_spip_rss
357 *
358 * @param string $op
359 * @param array $args
360 * @param string $lang
361 * @return string
362 */
363 function bouton_spip_rss($op, $args=array(), $lang='', $title='RSS') {
364 include_spip('inc/acces');
365 $clic = http_img_pack('feed.png', 'RSS', '', $title);
366 $args = param_low_sec($op, $args, $lang, 'rss');
367 $url = generer_url_public('rss', $args);
368 return "<a style='float: ".$GLOBALS['spip_lang_right'].";' href='$url'>$clic</a>";
369 }
370
371
372 /**
373 * Verifier la presence d'alertes pour les auteur
374 *
375 * http://doc.spip.org/@alertes_auteur
376 *
377 * @param int $id_auteur
378 * @return string
379 */
380 function alertes_auteur($id_auteur) {
381
382 $alertes = array();
383
384 // si on n'est plus compatible avec php4 : le dire a tous ceux qui passent
385 // dans l'espace prive
386 if (version_compare(phpversion(), _PHP_MIN) == -1)
387 $alertes[] = _L('SPIP n&#233;cessite PHP&nbsp;@min@, votre version est @version@.', array('min'=> _PHP_MIN, 'version' => phpversion()));
388
389 if (isset($GLOBALS['meta']['message_crash_tables'])
390 AND autoriser('detruire', null, null, $id_auteur)) {
391 include_spip('genie/maintenance');
392 if ($msg = message_crash_tables())
393 $alertes[] = $msg;
394 }
395
396 if (isset($GLOBALS['meta']['message_crash_plugins'])
397 AND $GLOBALS['meta']['message_crash_plugins']
398 AND autoriser('configurer', '_plugins', null, $id_auteur)
399 AND is_array($msg = unserialize($GLOBALS['meta']['message_crash_plugins']))) {
400 $msg = implode(', ',array_map('joli_repertoire',array_keys($msg)));
401 $alertes[] = _T('plugins_erreur', array('plugins' => $msg));
402 }
403
404 $a = isset($GLOBALS['meta']['message_alertes_auteurs']) ? $GLOBALS['meta']['message_alertes_auteurs'] : '';
405 if ($a
406 AND is_array($a = unserialize($a))
407 AND count($a)){
408 $update = false;
409 if (isset($a[$GLOBALS['visiteur_session']['statut']])){
410 $alertes = array_merge($alertes,$a[$GLOBALS['visiteur_session']['statut']]);
411 unset($a[$GLOBALS['visiteur_session']['statut']]);
412 $update = true;
413 }
414 if (isset($a[''])){
415 $alertes = array_merge($alertes,$a['']);
416 unset($a['']);
417 $update = true;
418 }
419 if ($update)
420 ecrire_meta("message_alertes_auteurs",serialize($a));
421 }
422
423 if (isset($GLOBALS['meta']['plugin_erreur_activation'])
424 AND autoriser('configurer', '_plugins', null, $id_auteur)) {
425 include_spip('inc/plugin');
426 $alertes[] = plugin_donne_erreurs();
427 }
428
429 $alertes = pipeline(
430 'alertes_auteur',
431 array(
432 'args' => array(
433 'id_auteur' => $id_auteur,
434 'exec' => _request('exec'),
435 ),
436 'data' => $alertes
437 )
438 );
439
440 if ($alertes = array_filter($alertes))
441 return "<div class='wrap-messages-alertes'><div class='messages-alertes'>".
442 join(' | ', $alertes)
443 ."</div></div>";
444 }
445
446 /**
447 * Filtre pour afficher les rubriques enfants d'une rubrique
448 * @param int $id_rubrique
449 * @return string
450 */
451 function filtre_afficher_enfant_rub_dist($id_rubrique){
452 include_spip('inc/presenter_enfants');
453 return afficher_enfant_rub(intval($id_rubrique));
454 }
455
456 /**
457 * Afficher un petit "i" pour lien vers autre page
458 *
459 * @param string $lien
460 * URL du lien desire
461 * @param string $titre
462 * Titre au survol de l'icone pointant le lien
463 * @param string $titre_lien
464 * Si present, ajoutera en plus apres l'icone
465 * un lien simple, vers la meme URL,
466 * avec le titre indique
467 *
468 * @return string
469 */
470 function afficher_plus_info($lien, $titre="+", $titre_lien="") {
471 $titre = attribut_html($titre);
472 $icone = "\n<a href='$lien' title='$titre' class='plus_info'>" .
473 http_img_pack("information-16.png", $titre) ."</a>";
474
475 if (!$titre_lien) {
476 return $icone;
477 } else {
478 return $icone . "\n<a href='$lien'>$titre_lien</a>";
479 }
480 }
481
482 /**
483 * Lister les id objet_source associés à l'objet id_objet
484 * via la table de lien objet_lien
485 *
486 * Utilisé pour les listes de #FORMULAIRE_EDITER_LIENS
487 *
488 * @param string $objet_source
489 * @param string $objet
490 * @param int $id_objet
491 * @param string $objet_lien
492 * @return array
493 */
494 function lister_objets_lies($objet_source,$objet,$id_objet,$objet_lien){
495 include_spip('action/editer_liens');
496 $l = array();
497 // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
498 if ($objet_lien==$objet AND $objet_lien!==$objet_source){
499 $res = objet_trouver_liens(array($objet=>$id_objet),array($objet_source=>'*'));
500 }
501 else{
502 $res = objet_trouver_liens(array($objet_source=>'*'),array($objet=>$id_objet));
503 }
504 while ($row = array_shift($res))
505 $l[] = $row[$objet_source];
506
507 return $l;
508 }
509 ?>