Changeset 103429 in spip-zone


Ignore:
Timestamp:
Mar 21, 2017, 4:14:47 PM (3 years ago)
Author:
marcimat@…
Message:

Introduction d'une fonction prestashop_ws_show_resource() qui permet de retourner la liste des champs
d'une ressource (tel que 'products'). Des champs «simples» uniquement là.
On utilise cette information dans l'iterateur pour que si un critère {unchamp = 3} est utilisé,
et que ce champ existe pour la ressource indiquée, alors l'appel du webservice filtrera automatiquement
le critère (filter[unchamp]=3), ce qui peut réduire le volume de données envoyées par le WS.
Le filtrage du coup se fait lors de la requête, et non après dans la boucle DATA pour ces champs là donc.

Location:
_plugins_/prestashop_api/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/prestashop_api/trunk/inc/prestashop_webservice.php

    r103053 r103429  
    7777                return parent::executeRequest($url, $curl_params);
    7878        }
     79
     80        /**
     81         * Retourne la description d'une resource (ses champs)
     82         * @param string $resource
     83         * @return simpleXML
     84         */
     85        public function show($resource) {
     86                $url = $this->url . '/api/' . $resource;
     87                $url = parametre_url($url, 'schema', 'synopsis', '&');
     88                return $this->get(['url' => $url]);
     89        }
    7990}
    8091
  • _plugins_/prestashop_api/trunk/inc/prestashop_webservice_utils.php

    r103074 r103429  
    186186        return lire_config('prestashop_api/url');
    187187}
     188
     189
     190/**
     191 * Retourne la liste des champs simples d'une ressource
     192 *
     193 * Uniquement les champs qui ont un texte directement
     194 * (pas les associations ou les champs ayant des traductions)
     195 *
     196 * @fixme : que faire pour les autres champs du coup ?
     197 *
     198 * @param string $resource
     199 *     Nom de la ressource désirée (ex: 'products')
     200 * @return array couples (nom du champ => type de champ)
     201 */
     202function prestashop_ws_show_resource($resource) {
     203        if (!$resource) {
     204                return [];
     205        }
     206
     207        static $shows = [];
     208        if (isset($shows[$resource])) {
     209                return $shows[$resource];
     210        }
     211
     212        if (!prestashop_ws_cache_update() and cache_exists(__FUNCTION__ . '-' . $resource)) {
     213                $shows[$resource] = cache_get(__FUNCTION__ . '-' . $resource);
     214                return $shows[$resource];
     215        }
     216
     217        try {
     218                // on suppose les champs identiques quelque soit la boutique
     219                $wsps = \SPIP\Prestashop\Webservice::getInstanceByLang();
     220        } catch (PrestaShopWebserviceException $ex) {
     221                spip_log('Erreur Webservice Prestashop : ' . $ex->getMessage());
     222                return [];
     223        }
     224
     225        $show = [];
     226        // Demander les données au Prestashop.
     227        if ($xml = $wsps->show($resource)) {
     228                foreach ($xml->children() as $champs) {
     229                        foreach ($champs as $nom => $desc) {
     230                                // champs simples
     231                                if (!count($desc)) {
     232                                        $show[$nom] = (string)$desc['format'];
     233                                }
     234                        }
     235                }
     236        }
     237
     238        $shows[$resource] = $show;
     239        cache_set(__FUNCTION__ . '-' . $resource, $show, 24 * 3600);
     240
     241        return $show;
     242}
  • _plugins_/prestashop_api/trunk/paquet.xml

    r103197 r103429  
    22        prefix="prestashop_api"
    33        categorie="outil"
    4         version="2.0.7"
     4        version="2.1.0"
    55        etat="test"
    66        compatibilite="[3.1.0;3.1.*]"
  • _plugins_/prestashop_api/trunk/public/prestashop.php

    r103074 r103429  
    239239        }
    240240
     241
    241242        // depuis un critere id=x ou {id?}
    242243        if ($id = prestashop_ws_critere_valeur($criteres, 'id')) {
     
    247248        }
    248249
     250        // liste des champs possibles pour cette ressource
     251        // cela permet de renseigner les filtres automatiquement
     252        // et réduire ainsi la taille de la requête retournée,
     253        // évitant que ce soit l'itérateur data qui filtre après coup.
     254        $champs = prestashop_ws_show_resource($resource);
     255        foreach ($champs as $champ => $desc) {
     256                if ($val = prestashop_ws_critere_valeur($criteres, $champ)) {
     257                        // pas la peine de filtrer dessus...
     258                        $iterateur->exception_des_criteres($champ);
     259                        $query['filter[' . $champ . ']'] = '[' . implode('|', $val) . ']';
     260                }
     261        }
     262
    249263        // display (full par défaut)
    250264        if (!$display = prestashop_ws_critere_valeur($criteres, 'display')) {
     
    253267        $iterateur->exception_des_criteres('display');
    254268        $query['display'] = $display;
     269
    255270
    256271        /*
     
    352367}
    353368
    354 
    355369/**
    356370 * Recuperer un critere dans le tableau where selon une contrainte.
Note: See TracChangeset for help on using the changeset viewer.