GPSR / magnalister / Massenupload

Thema wurde von DKG - Die Kleine Geschenkidee (Peter), 14. November 2024 erstellt.

  1. DKG - Die Kleine Geschenkidee (Peter)
    Registriert seit:
    2. Oktober 2017
    Beiträge:
    345
    Danke erhalten:
    200
    Danke vergeben:
    125
    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:
    <?php
    include('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_datatrue);

        
    $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_variationtrue)) . '</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_jsontrue)) . '</textarea>';
      
        
    // Ausgabe des encoded JSON im zweiten Textarea
        
    $encoded_json json_encode($category_variationJSON_PRETTY_PRINT);
        echo 
    '<h3>JSON:</h3>';
        echo 
    '<textarea rows="15" cols="200">' htmlspecialchars(print_r($encoded_jsontrue)) . '</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.
     
  2. DKG - Die Kleine Geschenkidee (Peter)
    Registriert seit:
    2. Oktober 2017
    Beiträge:
    345
    Danke erhalten:
    200
    Danke vergeben:
    125
    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.
     
  3. DKG - Die Kleine Geschenkidee (Peter)
    Registriert seit:
    2. Oktober 2017
    Beiträge:
    345
    Danke erhalten:
    200
    Danke vergeben:
    125
    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'];
     
  4. DKG - Die Kleine Geschenkidee (Peter)
    Registriert seit:
    2. Oktober 2017
    Beiträge:
    345
    Danke erhalten:
    200
    Danke vergeben:
    125
    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';
    
     
  5. DKG - Die Kleine Geschenkidee (Peter)
    Registriert seit:
    2. Oktober 2017
    Beiträge:
    345
    Danke erhalten:
    200
    Danke vergeben:
    125
    Soooo,

    gestern OTTO, heute Kaufland.
    PHP:
    <?php
    include('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_datatrue);

        
    $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_variationtrue)) . '</textarea>';
        
    $original_encoded_json json_encode($category_variationJSON_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_variationJSON_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_jsontrue)) . '</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