source: spip-zone/_plugins_/elements/elements_fonctions.php @ 65744

Last change on this file since 65744 was 65744, checked in by marcimat@…, 9 years ago

Ajout d'un plugin nommé « Éléments »

L'idée un peu derrière est un peu un mélange entre le Noizetier et Composition.

On peut ici définir des éléments (sorte de noiZettes qui ont très peu de configurations - 0 ou 1 champ) qui pourront être liées sur les objets éditoriaux, au choix, mais au cas par cas : ce n'est pas «tous les articles» (comme le noizetier) mais sur cet article précis (comme composition).

Les éléments choisis sont sauvés dans une table spip_elements (objet, id_objet,bloc, elements) où le bloc (pour l'instant uniquement 'extra') pourrait être un nom de bloc Zpip, et 'elements' contient la sérialisation des informations des éléments actifs et de l'environnement à leur transmettre.

L'idée est que pour un site précis, un admin puisse choisir des blocs à ajouter sur certains articles. Par exemple ajouter un sondage particulier dans une colonne de l'article (c'est au webmestre actuellement d'ajouter l'inclusion 'inclure/elements' dans le squelette mais on pourrait imaginer que si Zpip est présent que ça le fasse tout seul)

Il n'y a volontairement qu'un élément dans le plugin (l'élément texte) pour être le plus simple possible. Cependant, c'est dans la configuration du plugin que l'on indique, parmis la liste des éléments disponibles (stockés dans le répertoire elements/) lesquels on autorise sur le site. De ce fait, même si un plugin fournit 54 éléments, le webmestre peut décider lesquels il autorise sur son site.

Par souci de compatibilité, le yaml décrivant un élément est exactement le même que celui décrivant une noiZette. Cela dit, une fois de plus, l'objectif n'est pas de fournir une liste de noizettes hautements configurables mais justement plutôt des blocs touts faits à ne pas configurer (hormis par exemple un identifiant d'objet à choisir).

File size: 5.1 KB
Line 
1<?php
2
3/**
4 * Déclarations des fonctions pour les squelettes
5 * @package SPIP\Elements\Fonctions
6 */
7
8// Securite
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11
12/**
13 * Retourne un tableau de description de tous les éléments
14 * autorisés par la configuration, classés par nom
15 *
16 * @return array
17 *     Liste des éléments
18**/
19function lister_elements_autorises_par_nom() {
20        $elems = lister_elements_par_nom();
21        $autorises = lire_config('elements/elements', array());
22        $elems = array_intersect_key($elems, array_flip($autorises));
23        return $elems;
24}
25
26
27/**
28 * Retourne un tableau de description de tous les éléments connus
29 * classés par nom
30 *
31 * @param string $nom
32 *     Éventuel nom d'élément dont on voudrait la description uniquement
33 * @return array|null
34 *     - Liste des éléments
35 *     - Ou seulement l'élément indiqué par $nom
36 *     - null si l'élément n'est pas trouvé.
37**/
38function lister_elements_par_nom($nom = '') {
39        $elem = elements_lister_descriptions();
40        if ($nom) {
41                if (isset($elem[$nom])) {
42                        return $elem[$nom];
43                } else {
44                        return null;
45                }
46        }
47        ksort($elem);
48        return $elem;
49}
50
51
52/**
53 * Obtenir les infos de tous les éléments disponibles dans les dossiers elements/
54 * C'est un GROS calcul lorsqu'il est a faire.
55 *
56 * @note Inspiré de noizetier_obtenir_infos_noisettes_direct()
57 *
58 * @return array
59 */
60function elements_lister_descriptions(){
61        static $liste_elements = array();
62
63        // deja calculé ?
64        if ($liste_elements) {
65                return $liste_elements;
66        }
67
68        $match = "[^-]*[.]html$";
69        $liste = find_all_in_path('elements/', $match);
70
71        if (count($liste)){
72                foreach($liste as $squelette=>$chemin) {
73                        $element = preg_replace(',[.]html$,i', '', $squelette);
74                        $dossier = str_replace($squelette, '', $chemin);
75                        // On ne garde que les squelettes ayant un fichier YAML de config
76                        if (file_exists("$dossier$element.yaml")
77                                AND ($infos_element = elements_decrire_yaml($dossier.$element))
78                        ){
79                                $infos_element['element'] = $element; // ajout du type d'élement dans la description
80                                $liste_elements[$element] = $infos_element;
81                        }
82                }
83        }
84
85        // supprimer de la liste les noisettes necissant un plugin qui n'est pas actif
86        foreach ($liste_elements as $element => $infos_element)
87                if (isset($infos_element['necessite']))
88                        foreach ($infos_element['necessite'] as $plugin)
89                                if (!defined('_DIR_PLUGIN_'.strtoupper($plugin)))
90                                        unset($liste_elements[$element]);
91
92        return $liste_elements;
93}
94
95
96
97/**
98 * Charger les informations contenues dans le YAML d'un élément
99 *
100 * @note Inspiré de noizetier_charger_infos_noisette_yaml()
101 *
102 * @param string $element Chemin du fichier d'élément
103 * @param string $info    Information a obtenir (sinon prend tout)
104 * @return array|string   Liste des informations
105 */
106function elements_decrire_yaml($element, $info=""){
107                // on peut appeler avec le nom du squelette
108                $fichier = preg_replace(',[.]html$,i','',$element).".yaml";
109                include_spip('inc/yaml');
110                include_spip('inc/texte');
111                $infos_element = array();
112                if ($infos_element = yaml_charger_inclusions(yaml_decode_file($fichier))) {
113                        if (isset($infos_element['nom']))
114                                $infos_element['nom'] = _T_ou_typo($infos_element['nom']);
115                        if (isset($infos_element['description']))
116                                $infos_element['description'] = _T_ou_typo($infos_element['description']);
117                        if (isset($infos_element['icon']))
118                                $infos_element['icon'] = $infos_element['icon'];
119
120                        if (!isset($infos_element['parametres']))
121                                $infos_element['parametres'] = array();
122
123                        // contexte
124                        if (!isset($infos_element['contexte'])) {
125                                $infos_element['contexte'] = array();
126                        }
127                        if (is_string($infos_element['contexte'])) {
128                                $infos_element['contexte'] = array($infos_element['contexte']);
129                        }
130
131                        // ajax
132                        if (!isset($infos_element['ajax'])) {
133                                $infos_element['ajax'] = 'oui';
134                        }
135                        // inclusion
136                        if (!isset($infos_element['inclusion'])) {
137                                $infos_element['inclusion'] = 'statique';
138                        }
139                }
140
141                if (!$info)
142                        return $infos_element;
143                else 
144                        return isset($infos_element[$info]) ? $infos_element[$info] : "";
145}
146
147
148/**
149 * À partir des infos d'éléments stockés en bdd dans spip_elements/elements
150 * retrouve la description yaml des éléments correspondants
151 *
152 * @param array $elements
153 *     Liste d'elements sélectionnés tels qu'enregistrés dans la bdd
154 *     mais désélialisés
155 * @retrun array
156 *     Liste dans le même ordre des éléments avec leurs description yaml
157 *
158**/
159function elements_obtenir_desriptions($elements) {
160        $descriptions = array();
161        $liste = lister_elements_par_nom();
162        // pour chaque element choisi, retrouve la description yaml du type d'element
163        foreach ($elements as $k=>$e) {
164                $type = $e['element'];
165                if (isset($liste[$type])) {
166                        $descriptions[$k] = $liste[$type];
167                }
168        }
169        return $descriptions;
170}
171
172
173/**
174 * Retourne le code HTML d'un élément
175 *
176 * @param string $element
177 *     Nom de l'élément
178 * @param array $contexte
179 *     Contexte transmis à l'inclusion
180 * @return string
181 *     Code HTML de l'élément
182**/
183function elements_inclure_element($element, $contexte=array()) {
184        if (!$element) {
185                return '';
186        }
187        $code = recuperer_fond("elements/$element", $contexte);
188        return $code;
189}
Note: See TracBrowser for help on using the repository browser.