Eigenschaften mit PHP-Programm vor Artikel-Import in Gambio-Datenbank einstellen
In einem Gambio-Shop sollen täglich 7.000 Produkte aus einer CSV-Datei vom Lieferanten mit Bildern, Lagerbestand, Herstellerinformationen und vielen tausend Artikeleigenschaften neu importiert und aktualisiert werden.
Artikeleigenschaften im Gambio-Shop
Der Artikelbestand besteht aus vielen Artikelvarianten, die im Gambioshop mit Artikeleigenschaften abgebildet werden. Bei den Artikeleigenschaften gibt es zum Beispiel die Eigenschaft “Geschmack” mit fast 1.000 unterschiedlichen Eigenschaftswerten, knapp 200 verschiedene Farbwerte und mehr als 150 Größen. Es können täglich neue Varianten und Variantenwerte im Datenbestand sein.
Direkt zu Downloads und Links
- Programmcode als kostenloser Download
- Download Beispiel CSV-Datei für Import Artikel mit Eigenschaften
- Hilfreiche Links zu „Properties und Artikeleigenschaften im Gambio-Shop“
Artikeleigenschaften im Gambio-Admin anlegen
Artikeleigenschaftswerte im Gambio-Shop
Gambio bietet neben dem Artikel-Import auch einen Import für Artikeleigenschaften. Allerdings müssen die Eigenschaften mit den nötigen Eigenschaftswerten vor dem Import der Artikeleigenschaften im Gambio-Shop angelegt werden.
Um nicht alle 1.000 Geschmacksvarianten von Hand anlegen zu müssen, habe ich ein Programm geschrieben, das vor dem Import die Eigenschaftswerte in die Gambio-Datenbank einfügt, wenn sie noch nicht vorhanden sind.
Wenn eine neue Property in den Daten vom Lieferanten ist (z.B. Länge, Duft etc.), wird diese ebenfalls in die Datenbank eingestellt, sodass anschließend die nötigen Variantenwerte (Eigenschaftswerte) in der Datenbank zu der neuen Property angelegt werden können.
Properties, Properties-Description und Values in der Gambio-Datenbank
Die Gambio-Datenbank besteht aus 250 SQL-Tabellen.
Die Artikeleigenschaften (Properties) werden in vier Tabellen abgebildet:
Programmcode für Insert Properties, Properties-Description, Properties-Values und Properties-Values-Description in Gambio-Datenbank
Mit dem kleinen Code-Schnipsel werden Eigenschaften plus Eigenschaftswerte in die vier Properties-SQL-Tabellen der Gambio-Datenbank eingefügt, wenn folgende Werte in der Datenbank noch nicht vorhanden sind:
- Eigenschaft (properties_name) mit language_id = '2' in SQL-Tabelle properties_description oder
- Eigenschaftswert (values_name) mit language_id = '2' in SQL-Tabelle properties_values_description
Dabei wird ein zweidimensionales, assoziatives Array mit Eigenschaften und Eigenschaftswerten als Input erwartet. Der Wert der Array-Einträge ist in meinem Beispiel die Anzahl der Artikel zu dem jeweiligen Eigenschaftswert und in diesem Kontext irrelevant.
Beispiel: $arr_variantenart['Geschmack']['Banane'] = 5;
In dem folgenden PHP-Code werden alle Einträge im Array $arr_variantenart geprüft, ob der erste Key (Eigenschaft z.B. Geschmack) in der Tabelle properties_description in den deutschen Einträgen (language_id = 2) existiert und ob der zweite Key (Eigenschaftswert z.B. Banane) zu dem ersten Key (Eigenschaft = Geschmack) in der Taballe properties_values_description in den deutschen Eigenschaftswerten (language_id = 2) angelegt ist.
Nicht existierende, fehlende Eigenschaften bzw. Eigenschaftswerte werden mit dem PHP-Programm direkt in die Gambio-SQL-Tabellen eingefügt.
Variantenname (Eigenschaft) und Variantenwert (Eigenschaftswert) werden mit “language_id = 1” und “language_id = 2” mit gleichen Inhalten in der Datenbank gespeichert.
Im Gambio-Shop ist 1 die language_id für englische und 2 die language_id für deutsche Inhalte.
$debug = false; $anz_neueProperty = 0; $anz_neuePropertyValue = 0; $sortiernummer = getMaxSortorderProperty(500); // starte mit Property-Sortiernummer 500 oder höher foreach ( $arr_variantenart as $variantename => $variantenwerte ) { if ( existProperty($variantename) === false ) createProperty($variantename); $property_id = getPropertyId($variantename); if ($debug) ausgabeDebugtext("Property-Id", $property_id); echo "<br><b>Variantenart:</b> $variantename (".count($variantenwerte).") <br>"; echo "<table>"; $ielem = 0; $sort_order = getMaxSortorderPropertyValue($property_id); ksort($variantenwerte); foreach ( $variantenwerte as $variantenwert => $anzahl ) { $sort_order = $sort_order + 10; $value_price = 0.0000; $value_model = ''; $display_image = null; if ( existPropertyValue($property_id, $variantenwert) === false ) createPropertyValue($property_id, $variantenwert, $sort_order, $value_model, $value_price, $display_image); $ielem++; if ( $ielem == 1 ) echo "<tr>"; echo "<td>".$anzahl."x ".$variantenwert."</td>"; if ( $ielem == 6 ) { echo "</tr>"; $ielem = 0; } } echo "</table>"; } echo "Insert neue Properties: ".$anz_neueProperty."<br>"; echo "Insert neue Property-Values: ".$anz_neuePropertyValue."<br>"; // ............................................................................. // Properties Funktionen - Anfang function existProperty($property){ global $link, $debug; $select = "select properties_id from properties_description where language_id = '2' and properties_name = '".$property."'"; if ($debug) ausgabeDebugtext("existProperty", $select); if ( $rows = mysqli_query($link, $select) ) if ( $rows->num_rows > 0 ) return true; return false; } function existPropertyValue($property_id, $property_value){ global $link, $debug; if ( $property_id == 0 ) return false; $select = "select t1.properties_values_id from properties_values t1, properties_values_description t2 where language_id = '2' and t1.properties_values_id = t2.properties_values_id and t1.properties_id = ".$property_id." and t2.values_name = '".$property_value."'"; if ($debug) ausgabeDebugtext("existPropertyValue", $select); if ( $rows = mysqli_query($link, $select) ) if ( $rows->num_rows > 0 ) return true; return false; } function getPropertyId($property){ global $link, $debug; $select = "select properties_id from properties_description where language_id = '2' and properties_name = '".$property."'"; if ($debug) ausgabeDebugtext("getPropertyId", $select); if ( $rows = mysqli_query($link, $select) ) if ( $rows->num_rows > 0 ) { $row = mysqli_fetch_array($rows); return $row['properties_id']; } return 0; } function createProperty($property){ global $link, $sortiernummer, $anz_neueProperty, $debug; $insert = "INSERT INTO properties (properties_id, sort_order, display_type) VALUES ('', $sortiernummer, 'Dropdown')"; if ($debug) ausgabeDebugtext("Insert Property", $insert); if ( !mysqli_query($link, $insert) ) ausgabeSQLError($insert); $property_id = mysqli_insert_id($link); $sortiernummer = $sortiernummer + 10; $anz_neueProperty++; createPropertyDescription($property_id, $property); echo "<br>"; } function createPropertyDescription($property_id, $property){ global $link, $debug; $insert = "INSERT INTO properties_description (properties_description_id, properties_id, language_id, properties_name, properties_admin_name) VALUES ('', ".$property_id.", 1, '".$property."', '".$property."')"; if ($debug) ausgabeDebugtext("Insert Property-Value (en)", $insert); if ( !mysqli_query($link, $insert) ) ausgabeSQLError($insert); $insert = "INSERT INTO properties_description (properties_description_id, properties_id, language_id, properties_name, properties_admin_name) VALUES ('', ".$property_id.", 2, '".$property."', '".$property."')"; if ($debug) ausgabeDebugtext("Insert Property-Value (de)", $insert); if ( !mysqli_query($link, $insert) ) ausgabeSQLError($insert); } function createPropertyValue($property_id, $property_value, $sort_order=10, $value_model='', $value_price=0.0000, $display_image){ global $link, $debug, $anz_neuePropertyValue; $insert = "INSERT INTO properties_values (properties_values_id, properties_id, sort_order, value_model, value_price, display_image) VALUES (0, ".$property_id.", '".$sort_order."', '".$value_model."', ".$value_price.", '".(is_null($display_image)?'NULL':'".$display_image."')."')"; if ($debug) ausgabeDebugtext("createPropertyValue properties_values ", $insert); if ( !mysqli_query($link, $insert) ) ausgabeSQLError($insert); $properties_values_id = mysqli_insert_id($link); $insert = "INSERT INTO properties_values_description (properties_values_description_id, properties_values_id, language_id, values_name) VALUES (0, $properties_values_id, 1, '".$property_value."')"; if ($debug) ausgabeDebugtext("createPropertyValue properties_values_description (en)", $insert); if ( !mysqli_query($link, $insert) ) ausgabeSQLError($insert); $insert = "INSERT INTO properties_values_description (properties_values_description_id, properties_values_id, language_id, values_name) VALUES (0, $properties_values_id, 2, '".$property_value."')"; if ($debug) ausgabeDebugtext("createPropertyValue properties_values_description (de)", $insert); if ( !mysqli_query($link, $insert) ) ausgabeSQLError($insert); $anz_neuePropertyValue++; } function getMaxSortorderProperty($max_sortiernummer){ global $link, $debug; $select = "SELECT max(sort_order) as max_sort_order FROM properties"; if ($debug) ausgabeDebugtext("getMaxSortorderProperty", $select); if ( $rows = mysqli_query($link, $select) ) if ( $rows->num_rows > 0 ) { $row = mysqli_fetch_array($rows); if ( $row['max_sort_order'] > $max_sortiernummer ) return ($row['max_sort_order'] + 10) ; } return $max_sortiernummer; } function getMaxSortorderPropertyValue($property_id){ global $link, $debug; $max_sortiernummer = 10; $select = "SELECT max(sort_order) as max_sort_order FROM properties_values WHERE properties_id = ".$property_id; if ($debug) ausgabeDebugtext("getMaxSortorderPropertyValue", $select); if ( $rows = mysqli_query($link, $select) ) if ( $rows->num_rows > 0 ) { $row = mysqli_fetch_array($rows); if ( $row['max_sort_order'] > $max_sortiernummer ) return ($row['max_sort_order'] + 10) ; } return $max_sortiernummer; } function ausgabeDebugtext($reason, $text){ echo "<br><span style='color: orange;'>Debugmode</span> ".$reason.": ".$text; } function ausgabeSQLError($statement){ global $link; echo "<br><strong>ERROR</strong> - SQL Statement: ".$statement; echo "<br><strong>ERROR</strong> - SQL ErrorNo: ".mysqli_errno($link)." SqlState: ".mysqli_sqlstate($link); }
Wichtig:
Durch den Programm-Code werden eventuell Änderungen an der Gambio-Shop-Datenbank vorgenommen:
Inserts in SQL-Tabellen:
properties, properties_description, properties_values und properties_values_description.
Wenn Sie eine Sicherung der Datenbank machen wollen, finden Sie eine Anleitung im Gambio-Handbuch: https://developers.gambio.de/manual.html?section=toolbox_datensicherung
Download Programm für Insert Eigenschaften (properties) und Eigenschaftswerte (properties_values) vor Import Artikel mit Eigenschafts-Kombinationen in Gambio-Datenbank:
Import Artikeldaten mit Eigenschaften in Gambio-Shop
Nach erfolgreichem Insert der Eigenschaften mit Eigenschaftswerten können die Artikel (products) mit den Varianten (Eigenschaften) im Gambio-Shop importiert werden.
Import Artikeldaten mit Artikeleigenschaften und Eigenschaftswerten
Die Zuordnung Artikel zur Artikeleigenschaft und zum Artikeleigenschaftswert mit weiteren Informationen wie Eigenschaftspreis, Verpackungseinheit, Grundpreis und EAN der Eigenschaft, indivuelles Eigenschaftsbild u.v.m. wird von Gambio in einer CSV-Datei erwartet und in folgende Tabellen importiert:
CSV-Datei für Import in Gambio-Shop:
Um eine CSV-Vorlage für den Import der Artikeleigenschaften zu bekommen, sollte im Gambio-Shop ein Beispielartikel mit Eigenschaften als CSV-Datei exportiert werden.
Unter “Spalten” gibt es einen letzten Tab “Eigenschaften”. Nach einem Klick auf diesen Tab hat man die “Eigenschaftsauswahl”, “Kombinationsdaten” plus “Sprache”, um die Exportdatei für den Eigenschaftsexport zu konfigurieren:
Durch den Export erhält man die richtigen Spaltenüberschriften mit den richtigen Properties-Ids:
Download Beispiel CSV-Datei für Import Artikel mit Eigenschaften in Gambio-Datenbank:
Import Artikeleigenschaften im Gambio-Shop:
Wichtig:
Gambio erwartet CSV-Importdateien mit UTF8 Codierung. Trennzeichen (|) und Texttrenner (“) können beim Import ausgewählt werden.
Eigenschaftenkombinationen nach Import im Gambio-Shop:
Hilfreiche Links zu “Properties und Artikeleigenschaften im Gambio-Shop”:
Weitere Gambio-Beiträge und Gambio-Module:
Gambio Cross-Selling Produkte einstellen
Gambio-Modul “Cross Selling Artikel für Gambio-Shops automatisch einstellen” kaufen
Gambio Versandkosten nach Gewicht und PLZ-Gebiet berechnen
Gambio-Modul “Berechnung Versandkosten nach Gewicht und PLZ” kaufen
Gambio Adventskalender
Gambio-Modul “Gambio Adventskalender” kaufen
Fragen, Wünsche und Anregungen zu Insert Properties in Datenbank?
Senden Sie mir eine Nachricht an info@bt-webdesign.de