Changeset 96617 in spip-zone


Ignore:
Timestamp:
Apr 13, 2016, 4:09:57 PM (3 years ago)
Author:
rastapopoulos@…
Message:

Grosse nouveauté mais qui ne casse rien : on déporte la génération du tableau-json dans une fonction interne sans rapport avec "http". Cette fonction peut donc aussi être appelée n'importe où, notamment dans un squelette (pour intégrer une collection dans un item par exemple : collections imbriquées).

On ajoute un nouveau pipeline sans le "http" dedans, qui devrait suffire pour travailler sur le tableau directement. L'ancien pipeline qui bossait sur le array est gardé pour compat pour l'instant, mais ça ferait encore plus de nettoyage de l'enlever (demander si quelqu'un l'a déjà utilisé ?).

En effet, la fonction "http_collectionjson_get_collection_dist" est beaucoup plus légère et lisible et ne contient plus que le travail sur requête/réponse. La fabrication du JSON étant déportée ailleurs.

On pourrait ensuite ajouter un comportement similaire pour la production du JSON d'une ressource.

Location:
_plugins_/collection_json/trunk
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/collection_json/trunk/http/collectionjson.php

    r96391 r96617  
    66}
    77
    8 include_spip('inc/collectionjson');
     8include_spip('collectionjson_fonctions');
    99
    1010/**
     
    128128                $reponse = $fonction_collection($requete, $reponse);
    129129        }
    130         // Sinon on essaye de trouver différentes méthodes pour produire le JSON et en déduire les headers
    131         // - pour l'instant seulement par un squelette
    132         else {
    133                 // Allons chercher un squelette de base qui génère le JSON de la collection demandée
    134                 // Le squelette prend en contexte les paramètres du GET uniquement
    135                 if ($json = recuperer_fond("http/$format/$collection", $contexte)) {
    136                         // On décode ce qu'on a trouvé
    137                         $json = json_decode($json, true);
    138                 }
    139                 // Si on ne trouve rien on essaie de s'appuyer sur l'API objet
    140                 else  {
    141                         include_spip('base/abstract_sql');
    142                         include_spip('base/objets');
    143                        
    144                         // Si la collection demandée ne correspond pas à une table
    145                         // d'objet on arrête tout
    146                         if (!in_array(
    147                                 table_objet_sql($collection),
    148                                 array_keys(lister_tables_objets_sql())
    149                         )) {
    150                                 // On utilise la fonction d'erreur générique pour
    151                                 // renvoyer dans le bon format
    152                                 $fonction_erreur = charger_fonction('erreur', "http/$format/");
    153                                 return $fonction_erreur(404, $requete, $reponse);
    154                         }
    155                        
    156                         // On génère la pagination si besoin
    157                         $links = array();
    158                         $pagination = 10;
    159                         $offset = isset($contexte['offset']) ? $contexte['offset'] : 0;
    160                         $nb_objets = sql_countsel(table_objet_sql($collection));
    161                        
    162                         // On ajoute des liens de pagination
    163                         if ($offset > 0) {
    164                                 $offset_precedant = max(0, $offset-$pagination);
    165                                 $links[] = array(
    166                                         'rel' => 'prev',
    167                                         'prompt' => _T('public:page_precedente'),
    168                                         'href' => url_absolue(
    169                                                 parametre_url(self('&'), 'offset', $offset_precedant)),
    170                                 );
    171                         }
    172                         if (($offset + $pagination) < $nb_objets) {
    173                                 $offset_suivant = $offset + $pagination;
    174                                 $links[] = array(
    175                                         'rel' => 'prev',
    176                                         'prompt' => _T('public:page_suivante'),
    177                                         'href' => url_absolue(
    178                                                 parametre_url(self('&'), 'offset', $offset_suivant)),
    179                                 );
    180                         }
    181                        
    182                         // On requête l'ensemble de cette page d'un coup
    183                         $table_collection = table_objet_sql($collection);
    184                         $cle_objet = id_table_objet($table_collection);
    185                         $description = lister_tables_objets_sql($table_collection);
    186                         $select = isset($description['champs_editables']) ? array_merge($description['champs_editables'], array($cle_objet)) : '*';
    187                         $lignes = sql_allfetsel($select, $table_collection,'','','',"$offset,$pagination");
    188                        
    189                         $items = array();
    190                         foreach ($lignes as $champs) {
    191                                 $items[] = collectionjson_get_objet(objet_type($table_collection), $champs[$cle_objet], $requete, $champs);
    192                         }
    193                        
    194                         $json = array(
    195                                 'collection' => array(
    196                                         'version' => '1.0',
    197                                         'href' => url_absolue(parse_url(self('&'), PHP_URL_PATH)),
    198                                         'links' => $links,
    199                                         'items' => $items,
    200                                 ),
    201                         );
    202                 }
    203 
    204                 // Et on le passe dans un pipeline
     130        // Sinon on essaye de trouver différentes méthodes pour produire le JSON
     131        else {
     132                $json = collectionjson_get_collection($collection, $contexte);
     133
     134                // COMPAT : à remplacer par le nouveau pipeline "collectionjson_get_collection"
     135                // peut-être à supprimer directement si personne ne l'a jamais utilisé…
    205136                $json = pipeline(
    206137                        'http_collectionjson_get_collection_contenu',
     
    213144                        )
    214145                );
    215                 // Enfin on l'encode en JSON
     146        }
     147       
     148        // Si on finit avec un truc vide, on génère une 404
     149        if (empty($json)) {
     150                $fonction_erreur = charger_fonction('erreur', 'http/collectionjson/');
     151                $response = $fonction_erreur(404, $requete, $reponse);
     152        }
     153        // Sinon on encode et on renvoie correctement la réponse
     154        else {
    216155                $json = json_encode($json);
    217156               
  • _plugins_/collection_json/trunk/paquet.xml

    r96391 r96617  
    22        prefix="collectionjson"
    33        categorie="outil"
    4         version="1.3.0"
     4        version="1.4.0"
    55        etat="test"
    66        compatibilite="[3.0.0;3.1.*]"
     
    1717       
    1818        <pipeline nom="autoriser" inclure="collectionjson_autorisations.php" />
     19        <pipeline nom="collectionjson_get_collection" action="" />
    1920        <pipeline nom="http_collectionjson_get_index_contenu" action="" />
    2021        <pipeline nom="http_collectionjson_get_collection_contenu" action="" />
Note: See TracChangeset for help on using the changeset viewer.