Strict Standards: Declaration of action_plugin_searchtext::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /lib/plugins/searchtext/action.php on line 14

Warning: Cannot modify header information - headers already sent by (output started at /lib/plugins/searchtext/action.php:14) in /inc/auth.php on line 313

Warning: Cannot modify header information - headers already sent by (output started at /lib/plugins/searchtext/action.php:14) in /inc/actions.php on line 163
webapi:example.products.stocks [Shop Docs]

Dokumentacja techniczna

Aktualizacjia stanów magazynowych


Przykład wywołania w PHP

<?php
 
/*
 * Zaktualizowanie stanów magazynowych wszystkich produktów.
 * Przykład pokazuje też jak obsługiwać kod -2 (przekroczenie czasu operacji).
 */
 
/**
 * Logowanie do API
 * 
 * @param resource $c cURL resource handle
 * @param string $login Login użytkownika
 * @param string $password Hasło użytkownika
 * @return string Indentyfikatorr sesji użytkownika
 */
function login($c, $login, $password) {
    $params = Array(
        "method" => "login",
        "params" => Array($login, $password)
    );
    curl_setopt($c, CURLOPT_POSTFIELDS, "json=" . json_encode($params));
    $result = (Array) json_decode(curl_exec($c));
    if (isset($result['error'])) {
        return null;
    } else {
        return $result[0];
    }
}
 
/**
 * Pobranie id wszystkich produktów
 * 
 * @param resource $c cURL resource handle
 * @param String $session Identyfikator sesji
 * @return Array Tablica id produktów 
 */
function getProductsIds($c, $session) {
    $params = Array(
        "method" => "call",
        "params" => Array($session, "product.list",
            Array(false, false, false, false, false, null)
        )
    );
    $postParams = "json=" . json_encode($params);
    curl_setopt($c, CURLOPT_POSTFIELDS, $postParams);
    $result = (Array)json_decode(curl_exec($c));
 
    // sprawdzenie, czy wystąpił błąd
    if (isset($result['error'])) {
        echo "Wystąpił błąd: " . $result['error'] . ", kod: " . $result['code'];
        return Array();
    } else {
        $ids = Array();
        foreach ($result as $id) {
            $ids[] = $id;
        }
        return $ids; // lista id produktów
    }
}
 
/**
 * Aktualizacja produktów
 * 
 * @param resource $c cURL resource handle
 * @param String $session Identyfikator sesji
 * @param Array $ids Tablica id produktów do aktualizacji
 * @return Array Tablica ze statusami operacji w postaci: id => status
 */
function updateProducts($c, $session, $ids) {
    $products = Array();  
    foreach ($ids as $id) {
        // id produktu => dane
        $products[$id] = Array(
            "stock" => Array(
                "stock_relative" => 5, // dodanie 5 sztuk do obecnego stanu magazynowego
            ),
            // można też dodać inne pola do aktualizacji
        );
    }
 
    $params = Array(
        "method" => "call",
        "params" => Array($session, "product.list.save", Array($products, true)) 
    );
 
    // zakodowanie parametrów dla metody POST
    $postParams = "json=" . json_encode($params);
    curl_setopt($c, CURLOPT_POSTFIELDS, $postParams);
 
    // dekodowanie rezultatu w formacie JSON do tablicy result
    $data = curl_exec($c);
    $result = (Array)json_decode($data);
 
    // sprawdzenie, czy wystąpił błąd
    if (isset($result['error'])) {
        echo "Wystąpił błąd: " . $result['error'] . ", kod: " . $result['code'];
        return null;
    } else {
        return $result;
    }
}
 
$c = curl_init();
curl_setopt($c, CURLOPT_URL, 'http://shop.example.com/webapi/json/');
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
 
// zalogowanie użytkownika i pobranie identyfikatora sesji
$session = login($c, "api", "test");
 
if ($session != null) {
    $ids = getProductsIds($c, $session);
 
    // zapisywanie po 10 produktów
    while (!empty($ids)) {
        $idsTmp = array_slice($ids, 0, 10); // weź pierwsze 10 produktów
        $ids = array_slice($ids, 10); // pozostałe produkty
 
        $statuses = updateProducts($c, $session, $idsTmp);
 
        if ($statuses != null) {
            foreach ($statuses as $id => $status) {
                if ($status == -2) {
                    echo $id . " - operacja się nie udała - zabrakło czasu na zrealizowanie operacji<br>";
                    // w tym przypadku wrzucamy id produktu z powrotem do tablicy $ids
                    $ids[] = $id;
                } else if ($status == -1) {
                    echo $id . " - podane dane są nieprawidłowe i nie spełniają wymagań walidacji<br>";
                    // pomijamy ten produkt
                } else if ($status == 0) {
                    echo $id . " - operacja się nie udała<br>";
                    // pomijamy ten produkt
                } else if ($status == 1) {
                    echo $id . " - produkt został zapisany<br>";
                } else if ($status == 2) {
                    echo $id . " - operacja się nie udała - obiekt jest zablokowany przez innego administratora<br>";
                    // pomijamy ten produkt
                }
            }
        } else {
            echo "Wystąpił nieznany błąd. Operacja została przerwana.";
            break;
        }
    }
} else {
    echo "Wystąpił błąd logowania";
}
 
curl_close($c);
?>

Przykład wywołania w C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
 
//
// Zaktualizowanie stanów magazynowych wszystkich produktów.
// Przykład pokazuje też jak obsługiwać kod -2 (przekroczenie czasu operacji).
//
namespace update_all_products_stocks
{
    class Program
    {
        //
        // Deserializacja stringa w formacie JSON.
        //
        public static Object FromJson(string input)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Deserialize<Object>(input);
        }
 
        //
        // Deserializacja obiektu do stringa w formacie JSON.
        //
        public static string ToJson(object input)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(input);
        }
 
        //
        // Wysłanie requestu do api sklepu i zwrócenie wyniku.
        //
        public static Object sendApiRequest(String method, Object[] methodParams)
        {
            WebRequest request = WebRequest.Create("http://shop.example.com/webapi/json/");
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            Stream dataStream = request.GetRequestStream();
 
            Dictionary<String, Object> postParams = new Dictionary<String, Object>();
            postParams.Add("method", method);
            postParams.Add("params", methodParams);
 
            string jsonEncodedParams = ToJson(postParams);
            System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
            byte[] byteArray = encoding.GetBytes("json=" + jsonEncodedParams);
 
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
 
            WebResponse webResponse = request.GetResponse();
            Stream responseStream = webResponse.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            string text = reader.ReadToEnd();
 
            Object response = FromJson(text);
            return response;
        }
 
        //
        // Logowanie do api sklepu. Zwraca identyfikator sesji.
        //
        public static String login(String login, String password)
        {
            Object[] methodParams = { login, password };
            Object response = sendApiRequest("login", methodParams);
            String session = null;
 
            if (response is Dictionary<String, Object>)
            {
                Dictionary<String, Object> d = (Dictionary<String, Object>)response;
                if (d.ContainsKey("error"))
                {
                    Console.WriteLine("Wystąpił błąd: {0}, kod: {1}", d["error"], d["code"]);
                }
            }
            else if (response is String)
            {
                session = (String)response;
            }
            return session;
        }
 
        //
        // Pobranie id wszystkich produktów ze sklepu.
        //
        public static List<int> getProductsIds(String session)
        {
            List<int> ids = new List<int>();
            Object[] methodParams = { session, "product.list",
                                        new Object[] { false, false, false, false, false, null} };
            Object response = sendApiRequest("call", methodParams);
 
            if (response is Dictionary<String, Object>)
            {
                Dictionary<String, Object> d = (Dictionary<String, Object>)response;
                if (d.ContainsKey("error"))
                {
                    Console.WriteLine("Wystąpił błąd: {0}, kod: {1}", d["error"], d["code"]);
                }
            }
            else if (response is Object[])
            {
                foreach (Object obj in (Object[])response)
                {
                    ids.Add((int)obj);
                }
            }
            return ids;
        }
 
        //
        // Aktualizacja produktów o podanych identyfikatorach.
        //
        public static Dictionary<int, int> updateProducts(String session, List<int> ids)
        {
            Dictionary<int, int> statuses = null;
 
            Dictionary<String, Object> products = new Dictionary<String, Object>();
            foreach (int id in ids)
            {
                Dictionary<String, Object> product = new Dictionary<String, Object>();
                Dictionary<String, Object> stock = new Dictionary<String, Object>();
                stock.Add("stock_relative", 5);
                product.Add("stock", stock);
                products.Add(id.ToString(), product);
            }
 
            Object[] methodParams = { session, "product.list.save",
                                        new Object[] { products, true} };
            Object response = sendApiRequest("call", methodParams);
 
            if (response is Dictionary<String, Object>)
            {
                Dictionary<String, Object> d = (Dictionary<String, Object>)response;
                if (d.ContainsKey("error"))
                {
                    Console.WriteLine("Wystąpił błąd: {0}, kod: {1}", d["error"], d["code"]);
                }
                else
                {
                    statuses = new Dictionary<int, int>();
                    foreach (KeyValuePair<String, Object> pair in d)
                    {
                        statuses.Add(int.Parse(pair.Key), (int)pair.Value);
                    }
                }
            }
 
            return statuses;
        }
 
        static void Main(string[] args)
        {
            String session = login("api", "test");
 
            if (session != null)
            {
                List<int> ids = getProductsIds(session);
 
                while (ids.Count > 0)
                {
                    int step = Math.Min(ids.Count, 10);
 
                    List<int> idsTmp = ids.GetRange(0, step);   // weź 10 pierwszych produktów
                    ids = ids.GetRange(step, ids.Count - step); // pozostałe produkty
 
                    // aktualziacja produktów
                    Dictionary<int, int> statuses = updateProducts(session, idsTmp);
 
                    // sprawdzenie statusów operacji dla każdego produktu
                    if (statuses != null)
                    {
                        foreach (KeyValuePair<int, int> pair in statuses)
                        {
                            int id = pair.Key;
                            int status = pair.Value;
 
                            switch (status)
                            {
                                case -2:
                                    Console.WriteLine(id + " - operacja się nie udała - zabrakło czasu na zrealizowanie operacji");
                                    // w tym przypadku wrzucamy id produktu z powrotem do tablicy ids
                                    ids.Add(id);
                                    break;
                                case -1:
                                    Console.WriteLine(id + " - podane dane są nieprawidłowe i nie spełniają wymagań walidacji");
                                    // pomijamy ten produkt
                                    break;
                                case 0:
                                    Console.WriteLine(id + " - operacja się nie udała");
                                    // pomijamy ten produkt
                                    break;
                                case 1:
                                    Console.WriteLine(id + " - produkt został zapisany");
                                    break;
                                case 2:
                                    Console.WriteLine(id + " - operacja się nie udała - obiekt jest zablokowany przez innego administratora");
                                    // pomijamy ten produkt
                                    break;
                            }
                        }
                    }
                    else
                    {
                        Console.Write("Wystąpił nieznany błąd. Operacja została przerwana.");
                        break;
                    }
                }
            }
            else
            {
                Console.WriteLine("Wystąpił błąd logowania");
            }
 
            Console.ReadKey();
        }
    }
}