source: spip-zone/_plugins_/saisies/trunk/saisies_fonctions.php @ 118235

Last change on this file since 118235 was 117903, checked in by maieul@…, 5 months ago

Les liens ouvrants, c'est mal en général.
Sauf dans un cas particulier : dans les explications dans un formulaire.
En effet, si le lien n'est pas ouvrant, la personne en train de remplir un formulaire
a) lis une explication
b) clique sur le lien pour savoir comment remplir son formulaire
c) est redirigée directement vers une page
d) perd du coup ce qu'elle avait commencé remplir.
Par conséquent, en terme d'accessibilité, il vaut mieux POUR LES EXPLICATIONS DE FORMULAIRE
avoir des liens systématiquement ouvrant,
et ce que le lien pointe en interne ou en externe (ce qui distingue du filtre |liens_ouvrants).
D'où un filtre saisies_liens_ouvrants, appliqué sur la saisie
explication + les explications des saisies individuelles.

On applique aussi ca aussi sur la chaine de langue qui renvoi vers la
doc des afficher_si de saisies.

File size: 8.8 KB
Line 
1<?php
2
3/**
4 * Déclaration de fonctions pour les squelettes
5 *
6 * @package SPIP\Saisies\Fonctions
7**/
8
9if (!defined('_ECRIRE_INC_VERSION')) {
10        return;
11}
12
13include_spip('inc/saisies');
14include_spip('balise/saisie');
15include_spip('inc/saisies_afficher_si_js');
16// picker_selected (spip 3)
17include_spip('formulaires/selecteur/generique_fonctions');
18
19/**
20 * Retourne une balise `div` si on est en SPIP >= 3.1, sinon le texte en parametre.
21 *
22 * @example `[(#VAL{ul}|saisie_balise_structure_formulaire)]`
23 * @see balise_DIV_dist() pour une écriture plus courte.
24 * @note Préférer `[(#DIV|sinon{ul})]` dans les squelettes, plus lisible.
25 *
26 * @param $tag
27 *   ul ou li
28 * @return string
29 *   $tag initial ou div
30 */
31function saisie_balise_structure_formulaire($tag) {
32
33        static $is_div = null;
34        if (is_null($is_div)) {
35                $version = explode('.', $GLOBALS['spip_version_branche']);
36                if ($version[0] > 3 or ($version[0] == 3 and $version[1] > 0)) {
37                        $is_div = true;
38                }
39        }
40        if ($is_div) {
41                return 'div';
42        }
43        return $tag;
44}
45
46if (
47        !function_exists('balise_DIV_dist')
48        and $version = explode('.', $GLOBALS['spip_version_branche'])
49        and ($version[0]>3 or ($version[0]==3 and $version[1] > 0))
50) {
51
52        /**
53         * Compile la balise `DIV` qui retourne simplement le texte `div`
54         *
55         * Sert à la compatibilité entre SPIP 3.0 et SPIP 3.1+
56         *
57         * Variante d'écriture, plus courte, que le filtre `saisie_balise_structure_formulaire`
58         *
59         * À partir de SPIP 3.1
60         * - ul.editer-groupe deviennent des div.editer-groupe
61         * - li.editer devient div.editer
62         *
63         * @see saisie_balise_structure_formulaire()
64         * @example
65         *     `[(#DIV|sinon{ul})]`
66         *
67         * @param Pile $p
68         * @return Pile
69         */
70        function balise_DIV_dist($p) {
71                $p->code = "'div'";
72                $p->interdire_scripts = false;
73                return $p;
74        }
75}
76
77/**
78 * Traiter la valeur de la vue en fonction du env
79 * si un traitement a ete fait en amont (champs extra) ne rien faire
80 * si pas de traitement defini (formidable) passer typo ou propre selon le type du champ
81 *
82 * @param string $valeur
83 * @param string|array $env
84 * @return string
85 */
86function saisie_traitement_vue($valeur, $env) {
87        if (is_string($env)) {
88                $env = unserialize($env);
89        }
90        if (!function_exists('propre')) {
91                include_spip('inc/texte');
92        }
93        if (!is_array($valeur)) {
94                $valeur = trim($valeur);
95        }
96        // si traitement est renseigne, alors le champ est deja mis en forme
97        // (saisies)
98        // sinon on fait une mise en forme smart
99        if ($valeur and !is_array($valeur) and !isset($env['traitements'])) {
100                if (in_array($env['type_saisie'], array('textarea'))) {
101                        $valeur = propre($valeur);
102                } else {
103                        $valeur = '<p>' . typo($valeur) . '</p>';
104                }
105        }
106
107        return $valeur;
108}
109
110/**
111 * Passer un nom en une valeur compatible avec une classe css
112 *
113 * - toto => toto,
114 * - toto/truc => toto_truc,
115 * - toto[truc] => toto_truc
116 *
117 * @param string $nom
118 * @return string
119**/
120function saisie_nom2classe($nom) {
121        return str_replace(array('/', '[', ']', '&#91;', '&#93;'), array('_', '_', '', '_', ''), $nom);
122}
123
124/**
125 * Ajouter une ou des classes sur la saisie en fonction du type
126 * @param $type_saisie
127 * @return string
128 */
129function saisie_type2classe($type_saisie) {
130        static $compteur = 0;
131        $class = "saisie_{$type_saisie}";
132        if (strpos($type_saisie, 'selecteur') === 0) {
133                $class .= " selecteur_item";
134        }
135        if (!in_array($type_saisie, array('hidden','fieldset'))) {
136                $class .= ($compteur & 1) ? " editer_even" : " editer_odd";
137                $compteur = 1 - $compteur;
138        }
139        $class = trim($class);
140        return $class;
141}
142
143/**
144 * Passer un nom en une valeur compatible avec un `name` de formulaire
145 *
146 * - toto => toto,
147 * - toto/truc => toto[truc],
148 * - toto/truc/ => toto[truc][],
149 * - toto[truc] => toto[truc]
150 *
151 * @see saisie_name2nom() pour l'inverse.
152 * @param string $nom
153 * @return string
154**/
155function saisie_nom2name($nom) {
156        if (false === strpos($nom, '/')) {
157                return $nom;
158        }
159        $nom = explode('/', $nom);
160        $premier = array_shift($nom);
161        $nom = implode('][', $nom);
162        return $premier . '[' . $nom . ']';
163}
164
165/**
166 * Passer un `name` en un format de nom compris de saisies
167 *
168 * - toto => toto,
169 * - toto[truc] => toto/truc,
170 * - toto[truc][] => toto/truc/
171 * - toto/truc => toto/truc
172 *
173 * @see saisie_nom2name() pour l'inverse.
174 * @param string $name
175 * @return string
176 **/
177function saisie_name2nom($name) {
178        if (false === strpos($name, '[')) {
179                return $name;
180        }
181        $name = explode('[', str_replace(']', '', $name));
182        return implode('/', $name);
183}
184
185/**
186 * Compile la balise `#GLOBALS{xxx}` qui retourne la valeur d'une vilaine variable globale de même nom si elle existe
187 *
188 * @example
189 *     ```
190 *     #GLOBALS{debut_intertitre}
191 *     ```
192 *
193 * @param Champ $p
194 *     Pile au niveau de la balise
195 * @return Champ
196 *     Pile complétée du code php de la balise.
197**/
198function balise_GLOBALS_dist($p) {
199        if (function_exists('balise_ENV')) {
200                return balise_ENV($p, '$GLOBALS');
201        } else {
202                return balise_ENV_dist($p, '$GLOBALS');
203        }
204}
205
206/**
207 * Liste les éléments du sélecteur générique triés
208 *
209 * Les éléments sont triés par objets puis par identifiants
210 *
211 * @example
212 *     L'entrée :
213 *     'rubrique|3,rubrique|5,article|2'
214 *     Retourne :
215 *     array(
216 *        0 => array('objet'=>'article', 'id_objet' => 2),
217 *        1 => array('objet'=>'rubrique', 'id_objet' => 3),
218 *        2 => array('objet'=>'rubrique', 'id_objet' => 5),
219 *     )
220 *
221 * @param string $selected
222 *     Liste des objets sélectionnés
223 * @return array
224 *     Liste des objets triés
225**/
226function picker_selected_par_objet($selected) {
227        $res = array();
228        $liste = picker_selected($selected);
229        // $liste : la sortie dans le désordre
230        if (!$liste) {
231                return $res;
232        }
233
234        foreach ($liste as $l) {
235                if (!isset($res[ $l['objet'] ])) {
236                        $res[ $l['objet'] ] = array();
237                }
238                $res[$l['objet']][] = $l['id_objet'];
239        }
240        // $res est trié par objet, puis par identifiant
241        ksort($res);
242        foreach ($res as $objet => $ids) {
243                sort($res[$objet]);
244        }
245
246        // on remet tout en file
247        $liste = array();
248        foreach ($res as $objet => $ids) {
249                foreach ($ids as $id) {
250                        $liste[] = array('objet' => $objet, 'id_objet' => $id);
251                }
252        }
253
254        return $liste;
255}
256
257
258/**
259 * Lister les objets qui ont une url_edit renseignée et qui sont éditables.
260 *
261 * @return array Liste des objets :
262 *               index : nom de la table (spip_articles, spip_breves, etc.)
263 *               'type' : le type de l'objet ;
264 *               'url_edit' : l'url d'édition de l'objet ;
265 *               'texte_objets' : le nom humain de l'objet éditorial.
266 */
267function lister_tables_objets_edit() {
268        include_spip('base/abstract_sql');
269
270        $objets = lister_tables_objets_sql();
271        $objets_edit = array();
272
273        foreach ($objets as $objet => $definition) {
274                if (isset($definition['editable']) and isset($definition['url_edit']) and $definition['url_edit'] != '') {
275                        $objets_edit[$objet] = array('type' => $definition['type'], 'url_edit' => $definition['url_edit'], 'texte_objets' => $definition['texte_objets']);
276                }
277        }
278        $objets_edit = array_filter($objets_edit);
279
280        return $objets_edit;
281}
282
283/**
284 * Afficher la chaine de langue traduite.
285 *
286 * @param string $chaine
287 * @return string
288 */
289function saisies_label($chaine) {
290        $chaine = trim($chaine);
291        if (preg_match("/^(&lt;:|<:)/", $chaine)) {
292                $chaine = preg_replace("/^(&lt;:|<:)/", "", $chaine);
293                $chaine = preg_replace("/(:&gt;|:>)$/", "", $chaine);
294                return _T($chaine);
295        }
296
297        return $chaine;
298}
299
300/**
301 * Masque les derniers caractères d'une clé secrete
302 *
303 * @param string $cle
304 * @return string
305**/
306function saisies_masquer_cle_secrete($cle) {
307        if (!defined('_SAISIES_ΤΑUX_MASQUE_CLE_SECRETE')) {
308                define('_SAISIES_ΤΑUX_MASQUE_CLE_SECRETE',0.85);
309        }
310        $taille = strlen($cle);
311        $a_masquer = round($taille * _SAISIES_ΤΑUX_MASQUE_CLE_SECRETE, 0, PHP_ROUND_HALF_UP);
312        $court = substr($cle, 0, $taille-$a_masquer);
313        $cle = $court.str_repeat("*",$a_masquer);
314        return $cle;
315}
316
317/**
318 * Les liens ouvrants, c'est mal en général.
319 * Sauf dans un cas particulier : dans les explications dans un formulaire.
320 * En effet, si le lien n'est pas ouvrant, la personne en train de remplir un formulaire
321 * a) lis une explication
322 * b) clique sur le lien pour savoir comment remplir son formulaire
323 * c) est redirigée directement vers une page
324 * d) perd du coup ce qu'elle avait commencé remplir.
325 * Par conséquent, en terme d'accessibilité, il vaut mieux POUR LES EXPLICATIONS DE FORMULAIRE
326 * avoir des liens systématiquement ouvrant,
327 * et ce que le lien pointe en interne ou en externe (ce qui distingue du filtre |liens_ouvrants).
328 * D'où un filtre saisies_liens_ouvrants
329 * @param string $texte
330 * @return string $texte
331**/
332function saisies_liens_ouvrants($texte) {
333        if (preg_match_all(",(<a\s+[^>]*https?://[^>]*\b[^>]+>),imsS",
334                $texte, $liens, PREG_PATTERN_ORDER)) {
335                foreach ($liens[0] as $a) {
336                        $rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel');
337                        $ablank = inserer_attribut($a, 'rel', $rel);
338                        $ablank = inserer_attribut($ablank, 'target', '_blank');
339                        $texte = str_replace($a, $ablank, $texte);
340                }
341        }
342        return $texte;
343}
Note: See TracBrowser for help on using the repository browser.