Hey, ihr benutzt magnalister als Schnittstelle? Ihr wollt nicht jeden Artikel einzeln anfassen? Ich hab eine Lösung erarbeitet, bei der ich mir wünschen würde, dass es Agenturen und Programmierer wie @Dominik Späte für Euch umsetzen können. Hier die Basis auf der man individuell aufbauen kann: PHP: <?phpinclude('include/db.inc.php');$pid = $_GET['id'];$query = "SELECT products_id, CategoryIndependentShopVariation FROM magnalister_otto_prepare WHERE products_id = '$pid'";$result = mysqli_query($link, $query);while ($row = mysqli_fetch_assoc($result)) { $products_id = $row['products_id']; $raw_data = $row['CategoryIndependentShopVariation']; $category_variation = json_decode($raw_data, true); $required_fields = [ 'ProductSafetyName' => [ 'Code' => 'database_value', 'Kind' => 'FreeText', 'Required' => '', 'AttributeName' => 'GPSR: Firma / Hersteller', 'Values' => [ 'Table' => 'produktdatenquali_otto', 'Column' => 'gpsr_hersteller', 'Alias' => 'products_id' ], 'Error' => '' ], 'ProductSafetyAddress' => [ 'Code' => 'database_value', 'Kind' => 'FreeText', 'Required' => '', 'AttributeName' => 'GPSR: Adresse', 'Values' => [ 'Table' => 'produktdatenquali_otto', 'Column' => 'gpsr_adresse', 'Alias' => 'products_id' ], 'Error' => '' ], 'ProductSafetyRegionCode' => [ 'Code' => 'attribute_value', 'Kind' => 'Matching', 'Required' => '', 'AttributeName' => 'GPSR: Land', 'Values' => 'DE', 'Error' => '' ], 'ProductSafetyEmail' => [ 'Code' => 'database_value', 'Kind' => 'FreeText', 'Required' => '', 'AttributeName' => 'GPSR: Email', 'Values' => [ 'Table' => 'produktdatenquali_otto', 'Column' => 'gpsr_email', 'Alias' => 'products_id' ], 'Error' => '' ] ]; // Ausgabe des bestehenden JSON echo '<h3>' . htmlspecialchars($products_id) . '</h3>'; echo '<textarea rows="15" cols="200">' . htmlspecialchars(print_r($category_variation, true)) . '</textarea>'; // Fehlende Felder/Keys hinzufügen foreach ($required_fields as $key => $field) { if (!isset($category_variation[$key])) { $category_variation[$key] = $field; } } // Ausgabe des decoded JSON im zweiten Textarea $decoded_json = json_decode(json_encode($category_variation), true); echo '<h3>Decoded JSON:</h3>'; echo '<textarea rows="15" cols="200">' . htmlspecialchars(print_r($decoded_json, true)) . '</textarea>'; // Ausgabe des encoded JSON im zweiten Textarea $encoded_json = json_encode($category_variation, JSON_PRETTY_PRINT); echo '<h3>JSON:</h3>'; echo '<textarea rows="15" cols="200">' . htmlspecialchars(print_r($encoded_json, true)) . '</textarea>';}?> Was passiert hier genau? In diesem Script wir das kodierte JSON aus der Tabelle magnalister_otto_prepare, Spalte CategoryIndependentShopVariation ausgelesen. Dann wird geschaut ob die entsprechenden GPSR Keys vorhanden sind - und - falls nicht - werden die enstprechenden Angaben eingefügt aus der Variable $required_fields. Ich hab absichtlich keine Updatefunktion eingebaut, weil es nur als Vorlage / Idee dienen soll, auf der man aufbauen kann. Bei mir werden die erforderlichen Daten aus einer Tabelle namens produktdatenquali_otto genommen, wo für jede products_id bereits die entsprechenden Daten angelegt sind. Ich hab testweise die manipulierten JSON Daten bei einem Artikel gespeichert und zu OTTO hochgeladen, hat einwandfrei funktioniert. Wenn man das Script oben etwas umbaut, kann man schnell alle Produkte im Shop auslesen und updaten. Danach in magnalister alle vorbereiteten Artikel hochladen, fertig ist der Käse. In Kaufland (hitmeister) müsste es dann ähnlich funktionieren, hab ich mir aber noch nicht genau angesehen, ich vermute da landet es dann in der Spalte CategoryAttributes. Bitte benutzt das Script nur zur Weiterentwicklung für Euer Projekt und mit entprechendem Fachwissen. Ich schließe jegliche Haftung aus, Benutzung auf eigene Gefahr. Gruß Peter ########################### Nachtrag (erspart Euch evtl. Frust): ProductSafetyRegionCode kann nicht aus Datenbank gefüttert werden. Ich würde mein Script dann länderweise sortieren und abarbeiten lassen.
Noch ein Tipp: Wenn man viele Artikel hat und alle auf einmal zu OTTO hochladen möchte, würde ich vorher die max_execution_time am Server hochsetzen, um Laufzeitfehler zu vermeiden.
So sieht der Query aus, wenn man die Produkte heraussuchen möchte, welche noch mit GPSR vorbereitet werden müssen. PHP: $query = "SELECT products_id, CategoryIndependentShopVariation FROM magnalister_otto_prepare WHERE CategoryIndependentShopVariation NOT LIKE '%GPSR%' LIMIT 1"; Und so kann man sehen wieviele Produkte noch zu erledigen sind: PHP: $count_query = "SELECT COUNT(*) AS total FROM magnalister_otto_prepare WHERE CategoryIndependentShopVariation NOT LIKE '%GPSR%'";$count_result = mysqli_query($link, $count_query);$count_row = mysqli_fetch_assoc($count_result);$zuerledigen = $count_row['total'];
Hier noch ein kleines Helferlein, ein kleiner SQL Befehl der es ermöglicht nachträglich das Land für einen Hersteller zu ändern. In meinem Fall hatte ich einem österreichischem Hersteller aus Versehen DE zugewiesen und musste es nachträglich ändern. Funktioniert nur, wenn Hersteller oder Markenname in der Artikelbeschreibung vorhanden sind. Code: UPDATE magnalister_otto_prepare SET CategoryIndependentShopVariation = JSON_SET( CategoryIndependentShopVariation, '$.ProductSafetyRegionCode.Values', 'AT' ) WHERE Description LIKE '%Österreichische Marke%' AND JSON_EXTRACT(CategoryIndependentShopVariation, '$.ProductSafetyRegionCode.Values') = 'DE';
Soooo, gestern OTTO, heute Kaufland. PHP: <?phpinclude('include/db.inc.php');$count_query = "SELECT COUNT(*) AS total FROM magnalister_hitmeister_prepare WHERE CategoryAttributes NOT LIKE '%GPSR%'";$count_result = mysqli_query($link, $count_query);$count_row = mysqli_fetch_assoc($count_result);$zuerledigen = $count_row['total'];$partcount_query = "SELECT COUNT(*) AS total FROM magnalister_hitmeister_prepare WHERE CategoryAttributes NOT LIKE '%GPSR%' AND (Title LIKE '%Thomas%' OR Title LIKE '%Hutschenreuther%' OR Title LIKE '%Rosenthal%' OR Title LIKE '%Arzberg%') AND CategoryAttributes != 'null'";$partcount_result = mysqli_query($link, $partcount_query);$partcount_row = mysqli_fetch_assoc($partcount_result);$teilzuerledigen = $partcount_row['total'];$query = "SELECT products_id, CategoryAttributes FROM magnalister_hitmeister_prepare WHERE CategoryAttributes NOT LIKE '%GPSR%' AND (Title LIKE '%Thomas%' OR Title LIKE '%Hutschenreuther%' OR Title LIKE '%Rosenthal%' OR Title LIKE '%Arzberg%') AND CategoryAttributes != 'null' LIMIT 1";$result = mysqli_query($link, $query);while ($row = mysqli_fetch_assoc($result)) { $products_id = $row['products_id']; $raw_data = $row['CategoryAttributes']; $category_variation = json_decode($raw_data, true); $required_fields = [ 'product_safety_contact__name' => [ 'Code' => 'freetext', 'Kind' => 'FreeText', 'Required' => '', 'AttributeName' => 'GPSR: Firma / Hersteller', 'Values' => 'Rosenthal GmbH', 'Error' => '' ], 'product_safety_contact__address' => [ 'Code' => 'freetext', 'Kind' => 'FreeText', 'Required' => '', 'AttributeName' => 'GPSR: Adresse', 'Values' => 'Philip-Rosenthal-Platz 1, Selb, 95100, DE', 'Error' => '' ], 'product_safety_contact__email_address' => [ 'Code' => 'freetext', 'Kind' => 'FreeText', 'Required' => '', 'AttributeName' => 'GPSR: Email', 'Values' => 'info@rosenthal.de', 'Error' => '' ] ]; // Ausgabe des bestehenden JSON echo '<h3>' . htmlspecialchars($products_id) . ' Original decoded</h3>'; echo '<textarea id="textarea1" rows="15" cols="200">' . htmlspecialchars(print_r($category_variation, true)) . '</textarea>'; $original_encoded_json = json_encode($category_variation, JSON_PRETTY_PRINT); // echo '<h3>' . htmlspecialchars($products_id) . ' Original encoded</h3>'; // echo '<textarea id="textarea0" rows="15" cols="200">' . htmlspecialchars(print_r($original_encoded_json, true)) . '</textarea>'; // Fehlende Felder/Keys hinzufügen $missing_fields = []; foreach ($required_fields as $key => $field) { if (!isset($category_variation[$key])) { $missing_fields[$key] = $field; } } $category_variation = array_merge($missing_fields, $category_variation); // Ausgabe des decoded JSON im zweiten Textarea $decoded_json = json_decode(json_encode($category_variation), true); // echo '<h3>Decoded JSON:</h3>'; // echo '<textarea id="textarea2" rows="15" cols="200">' . htmlspecialchars(print_r($decoded_json, true)) . '</textarea>'; // Ausgabe des encoded JSON im zweiten Textarea $pretty_encoded_json = json_encode($category_variation, JSON_PRETTY_PRINT); // echo '<h3>Encode JSON (pretty):</h3>'; // echo '<textarea id="textarea3" rows="15" cols="200">' . htmlspecialchars(print_r($pretty_encoded_json, true)) . '</textarea>'; // Ausgabe des encoded JSON im zweiten Textarea $encoded_json = json_encode($category_variation); echo '<h3>Encode JSON:</h3>'; echo '<textarea id="textarea4" rows="15" cols="200">' . htmlspecialchars(print_r($encoded_json, true)) . '</textarea>'; // UPDATE query, um das manipulierte JSON in der Datenbank zu speichern // Dein Query hier rein }?><script> window.onload = function() { document.getElementById('textarea0').scrollTop = document.getElementById('textarea1').scrollHeight; document.getElementById('textarea1').scrollTop = document.getElementById('textarea1').scrollHeight; document.getElementById('textarea2').scrollTop = document.getElementById('textarea2').scrollHeight; document.getElementById('textarea3').scrollTop = document.getElementById('textarea3').scrollHeight; document.getElementById('textarea4').scrollTop = document.getElementById('textarea3').scrollHeight; }</script> Im Fall von Kaufland hab ich mit Freitext gearbeitet und die neuen GPSR Einträge an den Anfang gesetzt. Auch hier wieder: Ich schließe jegliche Haftung aus, Benutzung auf eigene Gefahr. Gruß Peter