4 * Déclaration de fonctions pour les squelettes
6 * @package SPIP\Saisies\Fonctions
9 if (!defined('_ECRIRE_INC_VERSION')) {
13 include_spip('inc/saisies');
14 include_spip('balise/saisie');
15 // picker_selected (spip 3)
16 include_spip('formulaires/selecteur/generique_fonctions');
19 * Retourne une balise `div` si on est en SPIP >= 3.1, sinon le texte en parametre.
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.
30 function saisie_balise_structure_formulaire($tag) {
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)) {
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))
52 * Compile la balise `DIV` qui retourne simplement le texte `div`
54 * Sert à la compatibilité entre SPIP 3.0 et SPIP 3.1+
56 * Variante d'écriture, plus courte, que le filtre `saisie_balise_structure_formulaire`
58 * À partir de SPIP 3.1
59 * - ul.editer-groupe deviennent des div.editer-groupe
60 * - li.editer devient div.editer
62 * @see saisie_balise_structure_formulaire()
64 * `[(#DIV|sinon{ul})]`
69 function balise_DIV_dist($p) {
71 $p->interdire_scripts
= false;
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
81 * @param string $valeur
82 * @param string|array $env
85 function saisie_traitement_vue($valeur, $env) {
86 if (is_string($env)) {
87 $env = unserialize($env);
89 if (!function_exists('propre')) {
90 include_spip('inc/texte');
93 $valeur = trim($valeur);
95 // si traitement est renseigne, alors le champ est deja mis en forme
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);
102 $valeur = '<p>' . typo($valeur) . '</p>';
110 * Passer un nom en une valeur compatible avec une classe css
113 * - toto/truc => toto_truc,
114 * - toto[truc] => toto_truc
119 function saisie_nom2classe($nom) {
120 return str_replace(array('/', '[', ']', '[', ']'), array('_', '_', '', '_', ''), $nom);
124 * Passer un nom en une valeur compatible avec un `name` de formulaire
127 * - toto/truc => toto[truc],
128 * - toto/truc/ => toto[truc][],
129 * - toto[truc] => toto[truc]
131 * @see saisie_name2nom() pour l'inverse.
135 function saisie_nom2name($nom) {
136 if (false === strpos($nom, '/')) {
139 $nom = explode('/', $nom);
140 $premier = array_shift($nom);
141 $nom = implode('][', $nom);
142 return $premier . '[' . $nom . ']';
146 * Passer un `name` en un format de nom compris de saisies
149 * - toto[truc] => toto/truc,
150 * - toto[truc][] => toto/truc/
151 * - toto/truc => toto/truc
153 * @see saisie_nom2name() pour l'inverse.
154 * @param string $name
157 function saisie_name2nom($name) {
158 if (false === strpos($name, '[')) {
161 $name = explode('[', str_replace(']', '', $name));
162 return implode('/', $name);
166 * Compile la balise `#GLOBALS{xxx}` qui retourne la valeur d'une vilaine variable globale de même nom si elle existe
170 * #GLOBALS{debut_intertitre}
174 * Pile au niveau de la balise
176 * Pile complétée du code php de la balise.
178 function balise_GLOBALS_dist($p) {
179 if (function_exists('balise_ENV')) {
180 return balise_ENV($p, '$GLOBALS');
182 return balise_ENV_dist($p, '$GLOBALS');
187 * Liste les éléments du sélecteur générique triés
189 * Les éléments sont triés par objets puis par identifiants
193 * 'rubrique|3,rubrique|5,article|2'
196 * 0 => array('objet'=>'article', 'id_objet' => 2),
197 * 1 => array('objet'=>'rubrique', 'id_objet' => 3),
198 * 2 => array('objet'=>'rubrique', 'id_objet' => 5),
201 * @param string $selected
202 * Liste des objets sélectionnés
204 * Liste des objets triés
206 function picker_selected_par_objet($selected) {
208 $liste = picker_selected($selected);
209 // $liste : la sortie dans le désordre
214 foreach ($liste as $l) {
215 if (!isset($res[ $l['objet'] ])) {
216 $res[ $l['objet'] ] = array();
218 $res[$l['objet']][] = $l['id_objet'];
220 // $res est trié par objet, puis par identifiant
222 foreach ($res as $objet => $ids) {
226 // on remet tout en file
228 foreach ($res as $objet => $ids) {
229 foreach ($ids as $id) {
230 $liste[] = array('objet' => $objet, 'id_objet' => $id);
239 * Lister les objets qui ont une url_edit renseignée et qui sont éditables.
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.
247 function lister_tables_objets_edit() {
248 include_spip('base/abstract_sql');
250 $objets = lister_tables_objets_sql();
251 $objets_edit = array();
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']);
258 $objets_edit = array_filter($objets_edit);
264 * Afficher la chaine de langue traduite.
266 * @param string $chaine
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);