source: spip-zone/_plugins_/svp_api/trunk/inc/svpapi_reponse.php @ 96818

Last change on this file since 96818 was 96818, checked in by eric@…, 5 years ago

Ajout d'une collection depots qui renvoie tous les objets dépôts hébergés par le serveur SVP.
Pour tous les objets renvoyés on désérialise les champs sérialisés et on présente les champs multi comme des tableaux.
Pour la peine on passe en 0.2.0

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5
6if (!defined('_SVPAPI_CHAMPS_MULTI_PLUGIN')) {
7        define('_SVPAPI_CHAMPS_MULTI_PLUGIN', 'nom,slogan');
8}
9if (!defined('_SVPAPI_CHAMPS_SERIALISES_PLUGIN')) {
10        define('_SVPAPI_CHAMPS_SERIALISES_PLUGIN', '');
11}
12
13if (!defined('_SVPAPI_CHAMPS_MULTI_PAQUET')) {
14        define('_SVPAPI_CHAMPS_MULTI_PAQUET', 'description');
15}
16if (!defined('_SVPAPI_CHAMPS_SERIALISES_PAQUET')) {
17        define('_SVPAPI_CHAMPS_SERIALISES_PAQUET', 'auteur,credit,licence,copyright,dependances,procure,traductions');
18}
19
20/**
21 * @param $requete
22 *
23 * @return array
24 */
25function reponse_initialiser_contenu($requete) {
26
27        // Récupération du schéma de données de SVP
28        include_spip('inc/config');
29        $schema = lire_config('svp_base_version');
30
31        // Stockage des éléments de la requête
32        // -- La méthode
33        $demande = array('methode' => $requete->getMethod());
34        // -- Les éléments format, collection et ressource
35        $demande = array_merge($demande, $requete->attributes->all());
36        // -- Les critères additionnels comme la catégorie ou la compatibilité SPIP fournis comme paramètres de l'url
37        $parametres = $requete->query->all();
38        $demande['criteres'] = array_intersect_key($parametres, array_flip(array('categorie', 'compatible_spip')));
39        // -- Le format du contenu de la réponse fourni comme paramètre de l'url
40        $demande['format'] = isset($parametres['format']) ? $parametres['format'] : 'json';
41
42        // Initialisation du bloc d'erreur à ok par défaut
43        $erreur['status'] = 200;
44        $erreur['type'] = '';
45
46        // On intitialise le contenu avec les informations collectées.
47        // A noter que le format de sortie est initialisé par défaut à json indépendamment de la demande, ce qui permettra
48        // en cas d'erreur sur le format demandé dans la requête de renvoyer une erreur dans un format lisible.
49        $contenu = array(
50                'requete'       => $demande,
51                'erreur'        => $erreur,
52                'schema'        => $schema,
53                'items'         => array());
54
55        return $contenu;
56}
57
58
59function reponse_collectionner_plugins($where) {
60
61        // Initialisation de la collection
62        $plugins = array();
63
64        // Récupérer la liste des plugins (filtrée ou pas).
65        // Les plugins appartiennent forcément à un dépot logique installés sur le serveur. Les plugins
66        // installés directement sur le serveur, donc hors dépôt sont exclus.
67        $from = array('spip_plugins', 'spip_depots_plugins AS dp');
68        $select = array('*');
69        $where = array_merge(array('dp.id_depot>0', 'dp.id_plugin=spip_plugins.id_plugin'), $where);
70        $group_by = array('spip_plugins.id_plugin');
71        $collection = sql_allfetsel($select, $from, $where, $group_by);
72
73        // On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par les préfixes.
74        // On transforme les champs multi en tableau associatif indexé par la langue et on désérialise les
75        // champs sérialisés.
76        if ($collection) {
77                foreach ($collection as $_plugin) {
78                        unset($_plugin['id_plugin']);
79                        unset($_plugin['id_depot']);
80                        $plugins[$_plugin['prefixe']] = normaliser_champs('plugin', $_plugin);
81                }
82        }
83
84        return $plugins;
85}
86
87
88function reponse_collectionner_depots($where) {
89
90        // Initialisation de la collection
91        $depots = array();
92
93        // Récupérer la liste des dépôts
94        $from = array('spip_depots');
95        $select = array('*');
96        $collection = sql_allfetsel($select, $from, $where);
97
98        // Refactorer le tableau de sortie du allfetsel en supprimant
99        // les champs id_depot et maj.
100        if ($collection) {
101                foreach ($collection as $_depot) {
102                        unset($_depot['id_depot']);
103                        unset($_depot['maj']);
104                        $depots[] = $_depot;
105                }
106        }
107
108        return $depots;
109}
110
111
112function normaliser_champs($type_objet, $objet) {
113
114        $objet_normalise = $objet;
115
116        // Traitement des champs multi et sérialisés
117        $champs_multi = explode(',', constant('_SVPAPI_CHAMPS_MULTI_' . strtoupper($type_objet)));
118        $champs_serialises = explode(',', constant('_SVPAPI_CHAMPS_SERIALISES_' . strtoupper($type_objet)));
119
120        if ($objet) {
121                foreach($objet as $_champ => $_valeur) {
122                        if (in_array($_champ, $champs_multi)) {
123                                include_spip('plugins/preparer_sql_plugin');
124                                $objet_normalise[$_champ] = normaliser_multi($_valeur);
125                        }
126
127                        if (in_array($_champ, $champs_serialises)) {
128                                $objet_normalise[$_champ] = unserialize($_valeur);
129                        }
130                }
131        }
132
133        return $objet_normalise;
134}
135
136/**
137 * @param $erreur
138 *
139 * @return mixed
140 */
141function reponse_expliquer_erreur($erreur) {
142
143        $prefixe = 'svpapi:erreur_' . $erreur['status'] . '_' . $erreur['type'];
144        $parametres = array(
145                'element'       => $erreur['element'],
146                'valeur'        => $erreur['valeur']
147                );
148
149        $explication['title'] = _T("${prefixe}_titre", $parametres);
150        $explication['detail'] = _T("${prefixe}_message", $parametres);
151
152        return $explication;
153}
154
155
156/**
157 * @param $reponse
158 * @param $contenu
159 *
160 * @return mixed
161 */
162function reponse_construire($reponse, $contenu, $format_reponse) {
163
164        $reponse->setCharset('utf-8');
165        $reponse->setStatusCode($contenu['erreur']['status']);
166
167        if ($format_reponse == 'json') {
168                $reponse->headers->set('Content-Type', 'application/json');
169                $reponse->setContent(json_encode($contenu));
170        }
171
172        return $reponse;
173}
Note: See TracBrowser for help on using the repository browser.