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 | * Retourne une balise `div` si on est en SPIP >= 3.1, sinon le texte en parametre. |
---|
20 | * |
---|
21 | * @example `[(#VAL{ul}|saisie_balise_structure_formulaire)]` |
---|
22 | * @see balise_DIV_dist() pour une écriture plus courte. |
---|
23 | * @note Préférer `[(#DIV|sinon{ul})]` dans les squelettes, plus lisible. |
---|
24 | * |
---|
25 | * @param $tag |
---|
26 | * ul ou li |
---|
27 | * @return string |
---|
28 | * $tag initial ou div |
---|
29 | */ |
---|
30 | function saisie_balise_structure_formulaire($tag) { |
---|
31 | |
---|
32 | static $is_div = null; |
---|
33 | if (is_null($is_div)) { |
---|
34 | $version = explode('.', $GLOBALS['spip_version_branche']); |
---|
35 | if ($version[0] > 3 or ($version[0] == 3 and $version[1] > 0)) { |
---|
36 | $is_div = true; |
---|
37 | } |
---|
38 | } |
---|
39 | if ($is_div) { |
---|
40 | return 'div'; |
---|
41 | } |
---|
42 | return $tag; |
---|
43 | } |
---|
44 | |
---|
45 | if ( |
---|
46 | !function_exists('balise_DIV_dist') |
---|
47 | and $version = explode('.', $GLOBALS['spip_version_branche']) |
---|
48 | and ($version[0]>3 or ($version[0]==3 and $version[1] > 0)) |
---|
49 | ) { |
---|
50 | |
---|
51 | /** |
---|
52 | * Compile la balise `DIV` qui retourne simplement le texte `div` |
---|
53 | * |
---|
54 | * Sert à la compatibilité entre SPIP 3.0 et SPIP 3.1+ |
---|
55 | * |
---|
56 | * Variante d'écriture, plus courte, que le filtre `saisie_balise_structure_formulaire` |
---|
57 | * |
---|
58 | * À partir de SPIP 3.1 |
---|
59 | * - ul.editer-groupe deviennent des div.editer-groupe |
---|
60 | * - li.editer devient div.editer |
---|
61 | * |
---|
62 | * @see saisie_balise_structure_formulaire() |
---|
63 | * @example |
---|
64 | * `[(#DIV|sinon{ul})]` |
---|
65 | * |
---|
66 | * @param Pile $p |
---|
67 | * @return Pile |
---|
68 | */ |
---|
69 | function balise_DIV_dist($p) { |
---|
70 | $p->code = "'div'"; |
---|
71 | $p->interdire_scripts = false; |
---|
72 | return $p; |
---|
73 | } |
---|
74 | } |
---|
75 | |
---|
76 | /** |
---|
77 | * Traiter la valeur de la vue en fonction du env |
---|
78 | * si un traitement a ete fait en amont (champs extra) ne rien faire |
---|
79 | * si pas de traitement defini (formidable) passer typo ou propre selon le type du champ |
---|
80 | * |
---|
81 | * @param string $valeur |
---|
82 | * @param string|array $env |
---|
83 | * @return string |
---|
84 | */ |
---|
85 | function saisie_traitement_vue($valeur, $env) { |
---|
86 | if (is_string($env)) { |
---|
87 | $env = unserialize($env); |
---|
88 | } |
---|
89 | if (!function_exists('propre')) { |
---|
90 | include_spip('inc/texte'); |
---|
91 | } |
---|
92 | |
---|
93 | $valeur = trim($valeur); |
---|
94 | |
---|
95 | // si traitement est renseigne, alors le champ est deja mis en forme |
---|
96 | // (saisies) |
---|
97 | // sinon on fait une mise en forme smart |
---|
98 | if ($valeur and !isset($env['traitements'])) { |
---|
99 | if (in_array($env['type_saisie'], array('textarea'))) { |
---|
100 | $valeur = propre($valeur); |
---|
101 | } else { |
---|
102 | $valeur = '<p>' . typo($valeur) . '</p>'; |
---|
103 | } |
---|
104 | } |
---|
105 | |
---|
106 | return $valeur; |
---|
107 | } |
---|
108 | |
---|
109 | /** |
---|
110 | * Passer un nom en une valeur compatible avec une classe css |
---|
111 | * |
---|
112 | * - toto => toto, |
---|
113 | * - toto/truc => toto_truc, |
---|
114 | * - toto[truc] => toto_truc |
---|
115 | * |
---|
116 | * @param string $nom |
---|
117 | * @return string |
---|
118 | **/ |
---|
119 | function saisie_nom2classe($nom) { |
---|
120 | return str_replace(array('/', '[', ']', '[', ']'), array('_', '_', '', '_', ''), $nom); |
---|
121 | } |
---|
122 | |
---|
123 | /** |
---|
124 | * Passer un nom en une valeur compatible avec un `name` de formulaire |
---|
125 | * |
---|
126 | * - toto => toto, |
---|
127 | * - toto/truc => toto[truc], |
---|
128 | * - toto/truc/ => toto[truc][], |
---|
129 | * - toto[truc] => toto[truc] |
---|
130 | * |
---|
131 | * @see saisie_name2nom() pour l'inverse. |
---|
132 | * @param string $nom |
---|
133 | * @return string |
---|
134 | **/ |
---|
135 | function saisie_nom2name($nom) { |
---|
136 | if (false === strpos($nom, '/')) { |
---|
137 | return $nom; |
---|
138 | } |
---|
139 | $nom = explode('/', $nom); |
---|
140 | $premier = array_shift($nom); |
---|
141 | $nom = implode('][', $nom); |
---|
142 | return $premier . '[' . $nom . ']'; |
---|
143 | } |
---|
144 | |
---|
145 | /** |
---|
146 | * Passer un `name` en un format de nom compris de saisies |
---|
147 | * |
---|
148 | * - toto => toto, |
---|
149 | * - toto[truc] => toto/truc, |
---|
150 | * - toto[truc][] => toto/truc/ |
---|
151 | * - toto/truc => toto/truc |
---|
152 | * |
---|
153 | * @see saisie_nom2name() pour l'inverse. |
---|
154 | * @param string $name |
---|
155 | * @return string |
---|
156 | **/ |
---|
157 | function saisie_name2nom($name) { |
---|
158 | if (false === strpos($name, '[')) { |
---|
159 | return $name; |
---|
160 | } |
---|
161 | $name = explode('[', str_replace(']', '', $name)); |
---|
162 | return implode('/', $name); |
---|
163 | } |
---|
164 | |
---|
165 | /** |
---|
166 | * Compile la balise `#GLOBALS{xxx}` qui retourne la valeur d'une vilaine variable globale de même nom si elle existe |
---|
167 | * |
---|
168 | * @example |
---|
169 | * ``` |
---|
170 | * #GLOBALS{debut_intertitre} |
---|
171 | * ``` |
---|
172 | * |
---|
173 | * @param Champ $p |
---|
174 | * Pile au niveau de la balise |
---|
175 | * @return Champ |
---|
176 | * Pile complétée du code php de la balise. |
---|
177 | **/ |
---|
178 | function balise_GLOBALS_dist($p) { |
---|
179 | if (function_exists('balise_ENV')) { |
---|
180 | return balise_ENV($p, '$GLOBALS'); |
---|
181 | } else { |
---|
182 | return balise_ENV_dist($p, '$GLOBALS'); |
---|
183 | } |
---|
184 | } |
---|
185 | |
---|
186 | /** |
---|
187 | * Liste les éléments du sélecteur générique triés |
---|
188 | * |
---|
189 | * Les éléments sont triés par objets puis par identifiants |
---|
190 | * |
---|
191 | * @example |
---|
192 | * L'entrée : |
---|
193 | * 'rubrique|3,rubrique|5,article|2' |
---|
194 | * Retourne : |
---|
195 | * array( |
---|
196 | * 0 => array('objet'=>'article', 'id_objet' => 2), |
---|
197 | * 1 => array('objet'=>'rubrique', 'id_objet' => 3), |
---|
198 | * 2 => array('objet'=>'rubrique', 'id_objet' => 5), |
---|
199 | * ) |
---|
200 | * |
---|
201 | * @param string $selected |
---|
202 | * Liste des objets sélectionnés |
---|
203 | * @return array |
---|
204 | * Liste des objets triés |
---|
205 | **/ |
---|
206 | function picker_selected_par_objet($selected) { |
---|
207 | $res = array(); |
---|
208 | $liste = picker_selected($selected); |
---|
209 | // $liste : la sortie dans le désordre |
---|
210 | if (!$liste) { |
---|
211 | return $res; |
---|
212 | } |
---|
213 | |
---|
214 | foreach ($liste as $l) { |
---|
215 | if (!isset($res[ $l['objet'] ])) { |
---|
216 | $res[ $l['objet'] ] = array(); |
---|
217 | } |
---|
218 | $res[$l['objet']][] = $l['id_objet']; |
---|
219 | } |
---|
220 | // $res est trié par objet, puis par identifiant |
---|
221 | ksort($res); |
---|
222 | foreach ($res as $objet => $ids) { |
---|
223 | sort($res[$objet]); |
---|
224 | } |
---|
225 | |
---|
226 | // on remet tout en file |
---|
227 | $liste = array(); |
---|
228 | foreach ($res as $objet => $ids) { |
---|
229 | foreach ($ids as $id) { |
---|
230 | $liste[] = array('objet' => $objet, 'id_objet' => $id); |
---|
231 | } |
---|
232 | } |
---|
233 | |
---|
234 | return $liste; |
---|
235 | } |
---|
236 | |
---|
237 | |
---|
238 | /** |
---|
239 | * Lister les objets qui ont une url_edit renseignée et qui sont éditables. |
---|
240 | * |
---|
241 | * @return array Liste des objets : |
---|
242 | * index : nom de la table (spip_articles, spip_breves, etc.) |
---|
243 | * 'type' : le type de l'objet ; |
---|
244 | * 'url_edit' : l'url d'édition de l'objet ; |
---|
245 | * 'texte_objets' : le nom humain de l'objet éditorial. |
---|
246 | */ |
---|
247 | function lister_tables_objets_edit() { |
---|
248 | include_spip('base/abstract_sql'); |
---|
249 | |
---|
250 | $objets = lister_tables_objets_sql(); |
---|
251 | $objets_edit = array(); |
---|
252 | |
---|
253 | foreach ($objets as $objet => $definition) { |
---|
254 | if (isset($definition['editable']) and isset($definition['url_edit']) and $definition['url_edit'] != '') { |
---|
255 | $objets_edit[$objet] = array('type' => $definition['type'], 'url_edit' => $definition['url_edit'], 'texte_objets' => $definition['texte_objets']); |
---|
256 | } |
---|
257 | } |
---|
258 | $objets_edit = array_filter($objets_edit); |
---|
259 | |
---|
260 | return $objets_edit; |
---|
261 | } |
---|
262 | |
---|
263 | /** |
---|
264 | * Afficher la chaine de langue traduite. |
---|
265 | * |
---|
266 | * @param string $chaine |
---|
267 | * @return string |
---|
268 | */ |
---|
269 | function saisies_label($chaine) { |
---|
270 | $chaine = trim($chaine); |
---|
271 | if (preg_match("/:>$/", $chaine)) { |
---|
272 | $chaine = preg_replace("/^<:/", "", $chaine); |
---|
273 | $chaine = preg_replace("/^<;:/", "", $chaine); |
---|
274 | $chaine = preg_replace("/:>$/", "", $chaine); |
---|
275 | return _T($chaine); |
---|
276 | } |
---|
277 | |
---|
278 | return $chaine; |
---|
279 | } |
---|
280 | |
---|
281 | /** |
---|
282 | * Masque les derniers caractères d'une clé secrete |
---|
283 | * |
---|
284 | * @param string $cle |
---|
285 | * @return string |
---|
286 | **/ |
---|
287 | function saisies_masquer_cle_secrete($cle) { |
---|
288 | if (!defined('_SAISIES_ΤΑUX_MASQUE_CLE_SECRETE')) { |
---|
289 | define('_SAISIES_ΤΑUX_MASQUE_CLE_SECRETE',0.85); |
---|
290 | } |
---|
291 | $taille = strlen($cle); |
---|
292 | $a_masquer = round($taille * _SAISIES_ΤΑUX_MASQUE_CLE_SECRETE, 0, PHP_ROUND_HALF_UP); |
---|
293 | $court = substr($cle, 0, $taille-$a_masquer); |
---|
294 | $cle = $court.str_repeat("*",$a_masquer); |
---|
295 | return $cle; |
---|
296 | } |
---|