Insert Gambio Properties in Gambio-Datenbank

Neue Artikeleigenschaften automatisch vor Import in Gambio-SQL-Tabellen anlegen

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

Artikeleigenschaften im Gambio-Admin anlegen

Artikeleigenschaften im Gambio-Shop 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.

Artikeleigenschaftswerte im Gambio-Shop einstellen

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:

Properties-Tabellen in Gambio-Datenbank
Gambio Datenbank - Properties - SQL-Tabellen

 

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:

Zuordnung Product und Properties in Gambio-Datenbank

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:

Export Artikeleigenschaften im Gambi-Shop

Durch den Export erhält man die richtigen Spaltenüberschriften mit den richtigen Properties-Ids:

Import Products-Properties mit CSV-Datei in Gambio-Shop

 

Download Beispiel CSV-Datei für Import Artikel mit Eigenschaften in Gambio-Datenbank:

 

Import Artikeleigenschaften im Gambio-Shop:

Gambio-Shop Import Artikeleigenschaften aus CSV-Datei

Wichtig:
Gambio erwartet CSV-Importdateien mit UTF8 Codierung. Trennzeichen (|) und Texttrenner (“) können beim Import ausgewählt werden.

Eigenschaftenkombinationen nach Import im Gambio-Shop:

Eigenschaftenkombinationen im Gambio Shop nach Import

Fragen, Wünsche und Anregungen zu Insert Properties in Datenbank?

Senden Sie mir eine Nachricht an info@bt-webdesign.de

05254 / 67673
info@bt-webdesign.de
Kontaktformular