Autor Zpráva
Vilak
Profil
Dobrý den,

momentálně mám problém s vkládáním produktu a API dokumentace webarealu mi moc nepomohla. Moc nechápu 2 věci:
1) Jak vložit description tak, abych do něj mohl vkládat HTML? Podle všeho je nutné HTML zapsat v JSONu, ale jak je to myšleno? I když jsem se snažil HTML konvertovat do JSONu, tak mi to nešlo (viz kód). Jedná se mi třeba o to, abych proměnnou "popis" vložil do description (proměnnou z řádku 26 vložil do 72).

Chyba: string(215) "{"http_status":500,"message":"It seems that you did not use to correct body in your request. It is necessary to use json object. For more information look at our documentation: https:\/\/webareal.docs.apiary.io\/#"}"

HLAVNÍ OTÁZKA:
2) Jak fungují parametry/vlastnosti produktu? Viz řádek 77-80. Jak můžu vložit ke konkrétnímu produktu konkrétní vlastnosti? U vás v API dokumentaci (webareal.cz) jsem toho moc nenašel, ani popisy tam nemáte, co vlastně co znamená (tedy by nebylo špatné se inspirovat třeba od dokumentace Shoptetu, který to má zpracované velmi dobře). Jak tedy můžu vložit do produktu nějakou vlastnost/parametr?

Chyba: string(140) "{"http_status":500,"message":"Some fields are not supported: Z\u00e1ruka, Pr\u016fm\u011br \u0159ezn\u00e9ho n\u00e1stroje, Typ, n\u011bco"}"

Pokud dám description bez HTML a odstraním vlastnosti parametru, produkt bez problémů přidám.

Dále mám otázky k vlastnostem:
3) Co když budu chtít přidat parametr, který ještě neexistuje? Musím ho prvně vytvořit přes API/ručně?
4) Co když budu chtít přidat hodnotu parametr, parametrj iž existuje, ale hodnota nikoli? Bude to problém?
5) Kde zjistím ID parametru?

Předem děkuji za vyčerpávající odpovědi.

<?php

// prihlaseni
$apiServer = 'xxx';
$apiKey = 'xxx';
$username = 'xxx@xxx.cz';
$password = 'xxx';

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://$apiServer/login",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "{\n  \"username\": \"$username\",\n  \"password\": \"$password\"\n}",
    CURLOPT_HTTPHEADER => array(
        "X-Wa-api-token: $apiKey",
    ),
));

// popis produktu
$popis = "<h3>TECHNICKÉ INFORMACE:</h3>
<ul>
<li>Plné dva břity PCD</li>
<li>Tělo z vysoce pevné oceli</li>
<li>Výška DIA zubu 4,5 mm</li>
<li>úhel axiální stopky</li>
<li>Ostřeno novou laserovou technologií</li>
<li>Možnost naostření (max. 5-6 krát)</li>
</ul>
<p><img src=\"/fotky101456/dti 2+2.jpg\" alt=\"\" width=\"368\" height=\"79\" /></p>
<h3>POUŽITÍ:</h3>
<p>Určeno pro všechny CNC stroje a ruční frézky pro spojování a frézování<br />dřevotřískových desek, LTD, MDF a kompozitů na bázi dřeva, HPL.</p>
<h3>VÝHODY:</h3>
<p>Dokonalé zakončení zpracovávané hrany, tichý provoz.<br />Nezanechává škrábance na obrobku.</p>
<h3>ŘEZNÉ PODMÍNKY:</h3>
<p><img src=\"/fotky101456/dti 2+2 graf.jpg\" alt=\"\" width=\"399\" height=\"262\" /></p>
<p><a href=\"https://www.stopkovefrezy.cz/fotky101456/fotos/_vyrp13_1677DT2--2.jpg\" target=\"_blank\" rel=\"noopener\"><img src=\"https://www.stopkovefrezy.cz/fotky101456/DT2%20(2).jpg\" width=\"200\" height=\"232\" caption=\"false\" /></a></p>
<p><span> </span></p>";
//echo $popis; // debug

// vlozeni jednoho produktu
$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    $jsonResponse = json_decode($response);
    $token = $jsonResponse->token;

    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://$apiServer/product",
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_POST => TRUE,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "{
          \"name\": \"Figar product 3\",
          \"secondName\": \"Dejvův produktík\",
          \"description\": \"$popis\",
          \"picture\": \"_vyr_11391170501570_tipo_VF_img.jpg\",
          \"news\": false,
          \"secondPrice\": 102541,
          \"price\": 254588,
          \"Záruka\": \"2 roky\",
          \"Průměr řezného nástroje\": \"60\",
          \"Typ\": \"A\",
          \"něco\": \"něco\",
          \"visibleOnHomepage\": false,
          \"productNumber\": \"figar346\",
          \"previewPicture\": \"_vyr_11391170501570_tipo_VF_img.jpg\",
          \"bestselling\": false,
          \"discounted\": false,
          \"measuringUnit\": \"\",
          \"discussionEnabled\": false,
          \"freeShippingEnabled\": false,
          \"bazaarEnabled\": false,
          \"amountInStock\": 10,
          \"availabilityId\": 1,
          \"weight\": 1,
          \"unsaleable\": false,
          \"hidden\": false,
          \"feedProductName\": \"Figar product 2\",
          \"feedDescription\": \"produktík ve feedu <3\",
          \"feedPicture\": \"_vyr_11391170501570_tipo_VF_img.jpg\",
          \"pictureMagnifier\": \"_vyr_11391170501570_tipo_VF_img.jpg\",
          \"vatLevel\": 1,
          \"categories\": [
            \"10-0-0-0\",
            {
              \"code\": \"10-474-0-0\",
              \"primary\": true
            }
          ]
        }",
        CURLOPT_HTTPHEADER => array(
            "Authorization: Bearer $jsonResponse->token",
            "X-Wa-api-token: $apiKey"
        ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    var_dump($response);
}
?>
Keeehi
Profil
Nemůžeš jen tak plácnout kus HTML kódu do jsonu a očekávat, že to bude fungovat.
To co máš od řádku 69 si nejdříve vytvoř jako obyčejné asociativní pole. A pak na to pole použij funkci json_encode. To ti to pole převede na validní json string, který už budeš moct použít.
Vilak
Profil
Jasně. vkládání HTML jde dobře, zatím takto se produkt přidá:

<?php

// prihlaseni
$apiServer = 'x';
$apiKey = 'x';
$username = 'x';
$password = 'x';

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://$apiServer/login",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "{\n  \"username\": \"$username\",\n  \"password\": \"$password\"\n}",
    CURLOPT_HTTPHEADER => array(
        "X-Wa-api-token: $apiKey",
    ),
));

$popis = "<h3>TECHNICKÉ INFORMACE:</h3>
<ul>
<li>Plné dva břity PCD</li>
<li>Tělo z vysoce pevné oceli</li>
<li>Výška DIA zubu 4,5 mm</li>
<li>úhel axiální stopky</li>
<li>Ostřeno novou laserovou technologií</li>
<li>Možnost naostření (max. 5-6 krát)</li>
</ul>
<p><img src=\"/fotky101456/dti 2+2.jpg\" alt=\"\" width=\"368\" height=\"79\" /></p>
<h3>POUŽITÍ:</h3>
<p>Určeno pro všechny CNC stroje a ruční frézky pro spojování a frézování<br />dřevotřískových desek, LTD, MDF a kompozitů na bázi dřeva, HPL.</p>
<h3>VÝHODY:</h3>
<p>Dokonalé zakončení zpracovávané hrany, tichý provoz.<br />Nezanechává škrábance na obrobku.</p>
<h3>ŘEZNÉ PODMÍNKY:</h3>
<p><img src=\"/fotky101456/dti 2+2 graf.jpg\" alt=\"\" width=\"399\" height=\"262\" /></p>
<p><a href=\"https://www.stopkovefrezy.cz/fotky101456/fotos/_vyrp13_1677DT2--2.jpg\" target=\"_blank\" rel=\"noopener\"><img src=\"https://www.stopkovefrezy.cz/fotky101456/DT2%20(2).jpg\" width=\"200\" height=\"232\" caption=\"false\" /></a></p>
<p><span> </span></p>";

$produkt = array(
    "name" => "Figar product 4",
    "secondName" => "Dejvův produktík",
    "description" => "$popis",
    "picture" => "_vyr_11391170501570_tipo_VF_img.jpg",
    "news" => false,
    "secondPrice" => 102541,
    "price" => 254588,
    /*"Záruka" => "2 roky",
    "Průměr řezného nástroje" => "60",
    "Typ" => "A",
    "něco" => "něco",*/
    "visibleOnHomepage" => false,
    "productNumber" => "figar346",
    "previewPicture" => "_vyr_11391170501570_tipo_VF_img.jpg",
    "bestselling" => false,
    "discounted" => false,
    "measuringUnit" => "",
    "discussionEnabled" => false,
    "freeShippingEnabled" => false,
    "bazaarEnabled" => false,
    "amountInStock" => 10,
    "availabilityId" => 1,
    "weight" => 1,
    "unsaleable" => false,
    "hidden" => false,
    "feedProductName" => "Figar product 2",
    "feedDescription" => "produktík ve feedu <3",
    "feedPicture" => "_vyr_11391170501570_tipo_VF_img.jpg",
    "pictureMagnifier" => "_vyr_11391170501570_tipo_VF_img.jpg",
    "vatLevel" => 1,
    "categories" => [
        "10-0-0-0",
        [
            "code" => "10-474-0-0",
            "primary" => true
        ]
    ]
);

$produkt = json_encode($produkt);

// vlozeni jednoho produktu
$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    $jsonResponse = json_decode($response);
    $token = $jsonResponse->token;

    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://$apiServer/product",
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_POST => TRUE,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "$produkt",
        CURLOPT_HTTPHEADER => array(
            "Authorization: Bearer $jsonResponse->token",
            "X-Wa-api-token: $apiKey"
        ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    var_dump($response);
}
?>

Takže díky moc Keehi! ;)

Každopádně nemáte někdo zkušenosti s webarealem a s vkládáním parametrů produktů přes jejich API? stále na to nedokážu dojít. Jejich podpora už 5. den nereaguje.
Vilak
Profil
Zdravím, mám tento script, který mi funguje. Každopádně funguje vždy jen na 1. produktu, u druhého a každého dalšího produktu to vypíše:

"
}

Warning: curl_exec() expects parameter 1 to be resource, null given in D:\xampp\htdocs\stopkovefrezy\api-add-products.php on line 67

Warning: curl_error() expects parameter 1 to be resource, null given in D:\xampp\htdocs\stopkovefrezy\api-add-products.php on line 68

Warning: curl_close() expects parameter 1 to be resource, null given in D:\xampp\htdocs\stopkovefrezy\api-add-products.php on line 70

Notice: Trying to get property 'token' of non-object in D:\xampp\htdocs\stopkovefrezy\api-add-products.php on line 76

Notice: Trying to get property 'token' of non-object in D:\xampp\htdocs\stopkovefrezy\api-add-products.php on line 91
string(46) "{"message":"Authorization header is required"}"


Chyba bude v proměnné $curl, protože pokud $curl přejmenuji třeba na $curl1, funguje to. Kde je problém? Co je tu špatně? Chybné řádky jsou označeny "// CHYBA". Moc nevím, co mám dělat dál, i když jsem se to snažil hledat.

api-add-products.php
<?php
// hlavicka
include "include/help-functions.php";
include_once "include/login.php";

// vkladane produkty z
include "get-csv-to-array/dgm.php"; // DGM frezovaci hlavy 
// include "get-csv-to-array/dte.php" // DTE frezovaci hlavy

//vkladani produktu
$i = 0;
foreach (array_slice($products, 1) as $a) {
    if ($i >= 3) {
        break;
    }
    $i++;
    pr($a);
    $name = $a['name'];
    if ($tocivost == "S") {
        $img = "symetricke-zuby-freza.png";
    }
    else {
        $img = "asymetricke-zuby-freza.png";
    }
    $produkt = array(
        "name" => $name,
        "secondName" => $name,
        "description" => $a['description'],
        "picture" => $img,
        "news" => false,
        "secondPrice" => str_replace(",", ".", $a['cena_na_web']), // cenikova cena
        "price" => str_replace(",", ".", $a['cena_bez_dph']), // cena bez dph
        /*"Použití na materiál" => "Masiv",
        "Průměr řezného nástroje" => $a['prumer_nastroje'], // JAK VLOŽIT TENTO PARAMETR TŘEBA?
        "Typ" => "$a['typ'],
        "něco" => "něco",*/
        "visibleOnHomepage" => false,
        "productNumber" => $a['kod'],
        "previewPicture" => $img,
        "bestselling" => false,
        "discounted" => false,
        "measuringUnit" => "",
        "discussionEnabled" => false,
        "freeShippingEnabled" => false,
        "bazaarEnabled" => false,
        "amountInStock" => 10,
        "availabilityId" => 1,
        "weight" => 0,
        "unsaleable" => false,
        "hidden" => false,
        "feedProductName" => $name,
        "feedPicture" => $img,
        "pictureMagnifier" => $img,
        "vatLevel" => 1,
        "categories" => [ // DOKONČIT!
            "10-0-0-0", // pred vkladanim je nutne mit kategorie vytvorene!
            [
                "code" => "10-474-0-0",
                "primary" => true
            ]
        ]
    );

    $produkt = json_encode($produkt);

    // vlozeni jednoho produktu
    $response = curl_exec($curl); // CHYBA
    $err = curl_error($curl); // CHYBA

    curl_close($curl); // CHYBA

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        $jsonResponse = json_decode($response);
        $token = $jsonResponse->token; // CHYBA

        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => "https://$apiServer/product",
            CURLOPT_RETURNTRANSFER => TRUE,
            CURLOPT_POST => TRUE,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => "$produkt",
            CURLOPT_HTTPHEADER => array(
                "Authorization: Bearer $jsonResponse->token", // CHYBA
                "X-Wa-api-token: $apiKey"
            ),
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        var_dump($response);
    }
    $response = null;
    $err = null; 
    $curl = null; 
    $produkt = null; 
}
?>

login.php
<?php
// prihlaseni
$apiServer = '';
$apiKey = '';
$username = '';
$password = '';

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://$apiServer/login",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "{\n  \"username\": \"$username\",\n  \"password\": \"$password\"\n}",
    CURLOPT_HTTPHEADER => array(
        "X-Wa-api-token: $apiKey",
    ),
));

?>
blaaablaaa
Profil
Vilak:
Na konci iterace nastavíte $curl na null. Takže v dalším opakování už se provádí curl_exec(null), což vyústí v chybu viz warningy a pak už se to sype celé ...
Vilak
Profil
Tak $curl mám nastavené na null v řádku 105, což je na konci foreach. Nebo kde by to mělo být?
blaaablaaa
Profil
Vilak:
Pak doporučuji odkrokovat si to a uvidíte.
Vilak
Profil
To už právě nevím, jak.
blaaablaaa
Profil
Tak to napíšu ještě jinak. V první iteraci je v $curl připojení, ve druhém opakování už tam máte nastavené null a snažíte se tedy posílat požadavek na null ...
tttttttt
Profil *
Vilak:
Když ten kód proškrtám, vypadá takto:

<?php
$curl = curl_init(); // include_once "include/login.php";
 
foreach (array_slice($products, 1) as $a) {
    $response = curl_exec($curl); // CHYBA
    $err = curl_error($curl); // CHYBA
    curl_close($curl); // CHYBA
 
    $curl = curl_init();
    $response = curl_exec($curl);
    curl_close($curl);

    $curl = null; 
}
?>
Vilak
Profil
Jasně, každopádně jak dál postupovat? I když jsem z toho udělal (v proškrkaném režimu) toto:
<?php
foreach (array_slice($products, 1) as $a) {
    $curl = curl_init(); // include_once "include/login.php";
    $response = curl_exec($curl); // CHYBA
    $err = curl_error($curl); // CHYBA
    curl_close($curl); // CHYBA
 
    $curl = curl_init();
    $response = curl_exec($curl);
    curl_close($curl);
 
    $curl = null; 
}
?>
tak je problém stále stejný, a to už curl definuji a mažu přímo ve foreach stále opakovaně, no ne?
Serg
Profil
Příjde mi, že tam jsou zamíchané dva curl poždavaky. Jeden na získání tokenu a druhý pro vložení produktu, a oba se přepisují do stejné proměnné, nehledě na to že na konci každého průchodu foreach cyklu se ta proměna nastaví na null jak už bylo řečeno, takže na začátku cyklu by bylo potřeba opět zavolat curl_init pro nový požadavek.

Nestačí ten token získat jen jednou a při každém vkládání produktu použít ten samý token? To by pak stačilo řádky 67 - 76 přesunout do login.php (a vynechat else aby to dávalo smysl).
Vilak
Profil
Serg:

Super, to mi funguje. řádky 67-76 jsem dal do login.php a funguje to. a else jsem vynechal.

Ještě mám v plánu z login.php udělat jen pomocnou funkci, kterou si zavolám. Řešení tu pak vložím, až to budu mít kompletní. Díky moc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0