[PLUGINS] ~maj globale
[lhc/web/www.git] / www / plugins / saisies / saisies_fonctions.php
1 <?php
2
3 /**
4 * Déclaration de fonctions pour les squelettes
5 *
6 * @package SPIP\Saisies\Fonctions
7 **/
8
9 if (!defined('_ECRIRE_INC_VERSION')) {
10 return;
11 }
12
13 include_spip('inc/saisies');
14 include_spip('balise/saisie');
15 // picker_selected (spip 3)
16 include_spip('formulaires/selecteur/generique_fonctions');
17
18 /**
19 * A partir de SPIP 3.1
20 * - ul.editer-groupe deviennent des div.editer-groupe
21 * - li.editer devient div.editer
22 * @param $tag
23 * ul ou li
24 * @return string
25 * $tag initial ou div
26 */
27 function saisie_balise_structure_formulaire($tag) {
28
29 static $is_div = null;
30 if (is_null($is_div)) {
31 $version = explode('.', $GLOBALS['spip_version_branche']);
32 if ($version[0] > 3 or ($version[0] == 3 and $version[1] > 0)) {
33 $is_div = true;
34 }
35 }
36 if ($is_div) {
37 return 'div';
38 }
39 return $tag;
40 }
41 // variante plus simple a ecrire dans les squelettes
42 // [(#DIV|sinon{ul})]
43 if (!function_exists('balise_DIV_dist')
44 and $version = explode('.', $GLOBALS['spip_version_branche'])
45 and ($version[0]>3 or ($version[0]==3 and $version[1] > 0))) {
46 function balise_DIV_dist($p) {
47 $p->code = "'div'";
48 $p->interdire_scripts = false;
49 return $p;
50 }
51 }
52
53 /**
54 * Traiter la valeur de la vue en fonction du env
55 * si un traitement a ete fait en amont (champs extra) ne rien faire
56 * si pas de traitement defini (formidable) passer typo ou propre selon le type du champ
57 *
58 * @param string $valeur
59 * @param string|array $env
60 * @return string
61 */
62 function saisie_traitement_vue($valeur, $env) {
63 if (is_string($env)) {
64 $env = unserialize($env);
65 }
66 if (!function_exists('propre')) {
67 include_spip('inc/texte');
68 }
69
70 $valeur = trim($valeur);
71
72 // si traitement est renseigne, alors le champ est deja mis en forme
73 // (saisies)
74 // sinon on fait une mise en forme smart
75 if ($valeur and !isset($env['traitements'])) {
76 if (in_array($env['type_saisie'], array('textarea'))) {
77 $valeur = propre($valeur);
78 } else {
79 $valeur = '<p>' . typo($valeur) . '</p>';
80 }
81 }
82
83 return $valeur;
84 }
85
86 /**
87 * Passer un nom en une valeur compatible avec une classe css
88 *
89 * - toto => toto,
90 * - toto/truc => toto_truc,
91 * - toto[truc] => toto_truc
92 *
93 * @param string $nom
94 * return string
95 **/
96 function saisie_nom2classe($nom) {
97 return str_replace(array('/', '[', ']', '&#91;', '&#93;'), array('_', '_', '', '_', ''), $nom);
98 }
99
100 /**
101 * Passer un nom en une valeur compatible avec un `name` de formulaire
102 *
103 * - toto => toto,
104 * - toto/truc => toto[truc],
105 * - toto[truc] => toto[truc]
106 *
107 * @param string $nom
108 * return string
109 **/
110 function saisie_nom2name($nom) {
111 if (false === strpos($nom, '/')) {
112 return $nom;
113 }
114 $nom = explode('/', $nom);
115 $premier = array_shift($nom);
116 $nom = implode('][', $nom);
117 return $premier . '[' . $nom . ']';
118 }
119
120 /**
121 * Compile la balise `#GLOBALS{xxx}` qui retourne la valeur d'une vilaine variable globale de même nom si elle existe
122 *
123 * @example
124 * ```
125 * #GLOBALS{debut_intertitre}
126 * ```
127 *
128 * @param Champ $p
129 * Pile au niveau de la balise
130 * @return Champ
131 * Pile complétée du code php de la balise.
132 **/
133 function balise_GLOBALS_dist($p) {
134 if (function_exists('balise_ENV')) {
135 return balise_ENV($p, '$GLOBALS');
136 } else {
137 return balise_ENV_dist($p, '$GLOBALS');
138 }
139 }
140
141 /**
142 * Liste les éléments du sélecteur générique triés
143 *
144 * Les éléments sont triés par objets puis par identifiants
145 *
146 * @example
147 * L'entrée :
148 * 'rubrique|3,rubrique|5,article|2'
149 * Retourne :
150 * array(
151 * 0 => array('objet'=>'article', 'id_objet' => 2),
152 * 1 => array('objet'=>'rubrique', 'id_objet' => 3),
153 * 2 => array('objet'=>'rubrique', 'id_objet' => 5),
154 * )
155 *
156 * @param string $selected
157 * Liste des objets sélectionnés
158 * @return array
159 * Liste des objets triés
160 **/
161 function picker_selected_par_objet($selected) {
162 $res = array();
163 $liste = picker_selected($selected);
164 // $liste : la sortie dans le désordre
165 if (!$liste) {
166 return $res;
167 }
168
169 foreach ($liste as $l) {
170 if (!isset($res[ $l['objet'] ])) {
171 $res[ $l['objet'] ] = array();
172 }
173 $res[$l['objet']][] = $l['id_objet'];
174 }
175 // $res est trié par objet, puis par identifiant
176 ksort($res);
177 foreach ($res as $objet => $ids) {
178 sort($res[$objet]);
179 }
180
181 // on remet tout en file
182 $liste = array();
183 foreach ($res as $objet => $ids) {
184 foreach ($ids as $id) {
185 $liste[] = array('objet' => $objet, 'id_objet' => $id);
186 }
187 }
188
189 return $liste;
190 }
191
192
193 /**
194 * Lister les objets qui ont une url_edit renseignée et qui sont éditables.
195 *
196 * @return array Liste des objets :
197 * index : nom de la table (spip_articles, spip_breves, etc.)
198 * 'type' : le type de l'objet ;
199 * 'url_edit' : l'url d'édition de l'objet ;
200 * 'texte_objets' : le nom humain de l'objet éditorial.
201 */
202 function lister_tables_objets_edit() {
203 include_spip('base/abstract_sql');
204
205 $objets = lister_tables_objets_sql();
206 $objets_edit = array();
207
208 foreach ($objets as $objet => $definition) {
209 if (isset($definition['editable']) and isset($definition['url_edit']) and $definition['url_edit'] != '') {
210 $objets_edit[$objet] = array('type' => $definition['type'], 'url_edit' => $definition['url_edit'], 'texte_objets' => $definition['texte_objets']);
211 }
212 }
213 $objets_edit = array_filter($objets_edit);
214
215 return $objets_edit;
216 }