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