Gambio Export revisited...

Thema wurde von Avenger, 6. Oktober 2012 erstellt.

  1. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Bei der Vorbesprechung der G-WARD-Gewinner (und anderer aktiver Foren-User) mit Daniel und Nonito am Tage des User-Meetings in Bremen, wurde als eines der drängendsten Probleme die Anpassung von Export-Modulen benannt, da einige Zielportale neue/andere Daten erwarten, als bisher vorgesehen.

    Nun sind die aktuellen Exportmodule so übel, dass man da als User kaum etwas ändern kann.

    Ich hatte vor Jahren das Ganze schon mal im xtc-Umfeld komplett überarbeitet, so dass das wesentlich übersichtlicher gehandhabt wird.

    Und in meinem Archiv habe ich das noch gefunden (aus dem Jahr 2008!).

    Das verfolgte Konzept ist wie folgt:

    Es gibt eine Basis-Export-Klasse, die alle operativen Aufgaben erledigt.

    Die Export-Klassen für die Zielsysteme sind jetzt eine Art "Plugin", die diese Basis-Klasse beerben.

    Sie sind letzten Endes nur noch dazu da, die Struktur des Export-Headers, und die zu exportierenden Datenfelder zu definieren (jeweils in der gleichen Reihenfolge).

    (Im Gegensatz zu den jetzigen Modulen, die ein unüberschaubares Programmgewirr sind, ist das jetzt total übersichtlich!)

    Für die Definition der zu exportierenden Felder sind im Export-Modul die folgenden Daten verfügbar:

    PHP:
    brand_name
    categories_name
    code_isbn
    code_jan
    code_mpn
    code_upc
    google_export_availability_id
    google_export_condition
    manufacturers_name
    nc_ultra_shipping_costs
    products_date_added
    products_date_available
    products_description
    products_ean
    products_fsk18
    products_id
    products_image
    products_keywords
    products_model
    products_name
    products_price
    products_quantity
    products_shippingtime
    products_short_description
    products_tax_class_id
    products_url
    products_vpe
    products_vpe_status
    products_vpe_value
    products_weight
    Also alles, was man so brauchen könnte.

    Die Export-Basis-Klasse und die Plugin-Klassen wurden gleich überladbar konzipiert, so dass man diese auch beeinflussen kann.

    Das Export-Plugin für "billiger.de" sieht jetzt z.B. wie folgt aus:

    PHP:
    <?php
    /* -----------------------------------------------------------------------------------------
    $Id: billiger.php,v 1.1.1.1.2.1 2008/11/30 11:16:34 avenger Exp $

    Author: Avenger, entwicklung@powertemplate.de

    Copyright © 2008 (xtCommerce Version), Avenger
    Copyright © 2012 (Gambio Version), Avenger

    Export plugin for billiger.de

    -----------------------------------------------------------------------------------------
    based on:
    (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
    (c) 2002-2003 osCommerce(cod.php,v 1.28 2003/02/14); www.oscommerce.com
    (c) 2003     nextcommerce (invoice.php,v 1.6 2003/08/24); www.nextcommerce.org
    (c) 2004        XT - Commerce; www.xt-commerce.com

    Released under the GNU General Public License
    ---------------------------------------------------------------------------------------*/

    defined'_VALID_XTC' ) or die( 'Direct Access to this location is not allowed.' );

    define('MODULE_BILLIGER_TEXT_DESCRIPTION''Export - Billiger.de');
    define('MODULE_BILLIGER_TEXT_TITLE''Billiger.de - CSV');

    include_once(
    DIR_WS_CLASSES.'export.php');

    class 
    billiger_ORIGIN extends export
    {
        function 
    __construct()
        {
            
    parent::init();
            
    $this->field_separator=';';
        }

        function 
    export_header_field_names()
        {
        
    $export_header_field_names=array(
          
    'id',
          
    'hersteller',
          
    'modell_nr',
          
    'name',
          
    'kategorie',
          
    'beschreibung',
          
    'bild_klein',
          
    'bild_gross',
          
    'link',
          
    'lieferzeit',
          
    'lieferkosten',
          
    'preis',
          
    'waehrung',
          
    'aufbauservice',
          
    '24_Std_service',
          
    'EAN',
          
    'ASIN',
          
    'ISBN',
          
    'PZN',
          
    'ISMN',
          
    'EPC',
          
    'VIN'
        
    );
            return 
    $export_header_field_names;
        }

        function 
    export_data_field_names()
        {
        
    $export_data_field_names=array(
          
    'products_id',
          
    'manufacturers_name',
          
    'products_model',
          
    'products_name',
          
    'categories_name',
          
    'products_description',
          
    'products_image',
          
    'products_image_big',
          
    'products_url',
          
    'products_shippingtime',
          
    'shipping_costs',
          
    'products_price',
          
    'currency',
          
    '',
          
    '',
          
    'products_ean',
          
    '',
          
    'code_isbn',
          
    '',
          
    '',
          
    ''
        
    );
            return 
    $export_data_field_names;
        }
    }

    MainFactory::load_origin_class('billiger');
    ?>
    In

    PHP:
        function __construct()
        {
            
    parent::init();
        
    $this->field_separator=';';
        }
    wird die Initialisierung der Basisklasse aufgerufen, und das Zeichen definiert, das als Feldtrenner in den Exportdaten zu verwenden ist.

    In der "export_header_field_names"-Methode des Plugins werden in einem Array die Namen der Exportfelder definiert, die das Zielsystem als Namen erwartet (daraus wird die erste Zeile der Export-Datei aufgebaut...).

    PHP:
        function export_header_field_names()
        {
            
    $export_header_field_names=array(
              
    'id',
              
    'hersteller',
              
    'modell_nr',
              
    'name',
              
    'kategorie',
              
    'beschreibung',
              
    'bild_klein',
              
    'bild_gross',
              
    'link',
              
    'lieferzeit',
              
    'lieferkosten',
              
    'preis',
              
    'waehrung',
              
    'aufbauservice',
              
    '24_Std_service',
              
    'EAN',
              
    'ASIN',
              
    'ISBN',
              
    'PZN',
              
    'ISMN',
              
    'EPC',
              
    'VIN'
            
    );
          return 
    $export_header_field_names;
        }
    In der "export_data_field_names"-Methode des Plugins werden dann ebenfalls in einem Array die Namen der Datenfelder definiert, die in der Exportdatei ausgegeben werden sollen (in der gleichen Reihenfolge wie die korrespondierenden Feldnamen).

    PHP:
        function export_data_field_names()
        {
            
    $export_data_field_names=array(
              
    'products_id',
              
    'manufacturers_name',
              
    'products_model',
              
    'products_name',
              
    'categories_name',
              
    'products_description',
              
    'products_image',
              
    'products_image_big',
              
    'products_url',
              
    'products_shippingtime',
              
    'shipping_costs',
              
    'products_price',
              
    'currency',
              
    '',
              
    '',
              
    'products_ean',
              
    '',
              
    'code_isbn',
              
    '',
              
    '',
              
    ''
            
    );
          return 
    $export_data_field_names;
        }
    Und das ist dann alles, was notwendig ist, um das Exportformat für das jeweilige Zielsystem zu definieren!

    Es gibt auch Fälle, in denen ein XML-Export verlangt wird, z.B. für "golem.de".

    Auch das ist berücksichtigt, das Export-Plugin dafür sieht wie folgt aus:

    PHP:
    <?php
    /* -----------------------------------------------------------------------------------------
    $Id: golem.php,v 1.1.1.1.2.1 2008/11/30 11:16:34 avenger Exp $

    Author: Avenger, entwicklung@powertemplate.de

    Copyright © 2008 (xtCommerce Version), Avenger
    Copyright © 2012 (Gambio Version), Avenger

    Export plugin for golem.de (XML-export!)

    -----------------------------------------------------------------------------------------
    based on:
    (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
    (c) 2002-2003 osCommerce(cod.php,v 1.28 2003/02/14); www.oscommerce.com
    (c) 2003     nextcommerce (invoice.php,v 1.6 2003/08/24); www.nextcommerce.org
    (c) 2004        XT - Commerce; www.xt-commerce.com

    Released under the GNU General Public License
    ---------------------------------------------------------------------------------------*/

    defined'_VALID_XTC' ) or die( 'Direct Access to this location is not allowed.' );

    define('MODULE_GOLEM_TEXT_DESCRIPTION''Export - Golem.de (XML)<br><b>Format:</b><br>');
    define('MODULE_GOLEM_TEXT_TITLE''Golem.de - XML');

    // include needed functions
    include_once(DIR_WS_CLASSES.'export.php');

    class 
    golem_ORIGIN extends export
    {
      function 
    __construct()
      {
        
    parent::init();
        
    $this->field_separator='xml';
      }

        function 
    export_header_field_names()
        {
            
    //create header
            
    return '<?xml version="1.0" encoding="utf-8"?>
    <doc>'
    ;
        }

        function 
    export_data_field_names($export_data)
        {
            
    //create content
            
    return '
        <product>
            <group>'
    .parent::xml_convert($export_data['categories_name']).'</group>
            <pid>'
    .parent::xml_convert($export_data['products_model']).'</pid>
            <name>'
    .parent::xml_convert($export_data['products_name']).'</name>
            <manufacturer>'
    .parent::xml_convert($export_data['manufacturers_name']).'</manufacturer>
            <description>'
    .parent::xml_convert($export_data['products_description']).'</description>
            <ean>'
    .$export_data['products_ean'].'</ean>
            <prices>
                <price>
                    <currency>'
    .$export_data['currency'].'</currency>
                    <inctax>'
    .$export_data['products_price'].'</inctax>
                    <extax>'
    .$export_data['products_price_net'].'</extax>
                </price>
            </prices>
            <availability>'
    .$export_data['products_quantity'].'</availability>
            <url>'
    .$export_data['products_url'].'</url>
        </product>'
    ;
      }

        function 
    export_footer()
        {
            
    //create footer
            
    return '
    </doc>'
    ;
        }
    }

    MainFactory::load_origin_class('golem');
    ?>
    Etwas komplexer, aber immer noch gut überschaubar....

    Und man kann natürlich auch einfach neue Plugins definieren, wenn man woanders hin exportieren will.

    Ich habe schon mal die aktuellen Definitionen für "billiger.de", "froogle,de", "guenstiger.de" und "golem.de" so angepasst, wie sie den derzeit verwendeten Export-Modulen entsprechen.

    Es werden noch kenntnisreiche Freiwillige gesucht, die die Datendefinitionen der anderen Export-Module in die entsprechenden Plugins umwandeln....
     

    Anhänge:

  2. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    Ist mit Sicherheit das Grundkonzept was dringend gebraucht wird.

    In der Basisklasse kann ich doch auch noch benötigte Datenfelder hinzufügen? ODER?
    Für Google sind ja noch die GoogleCats usw. notwendig.

    So und da jetzt noch ne Oberfläche fürs Admin geschaffen und das Teil wäre perfekt. Das schau ich mir doch mal genauer an. Sehr interessanter Ansatz. Und das aus dem Jahre 2008!!!
     
  3. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Sicher, man muss die SQL-Abfrage nur entsprechend erweitern.
     
  4. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ich denke nicht, dass man eine Admin-Oberfläche braucht.....

    Die Plugin-Definitionen muss ja nicht jeder machen...

    Und Leute die das können und bereit stellen gibt es sicher genügend (mehr als 10 Minuten braucht man dazu nicht)..

    Und da das ganze updatesicher und durch kopieren installierbar ist, reicht das m.E. voll aus.

    So eine Admin-Oberfläche macht das gleich 10 Mal aufwändiger.....
     
  5. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ja, sehe ich auch so.

    Ich habe bei der Gelegenheit auch die Berechnung der Versandkosten neu gemacht:

    bisher mussten die ja beim Export für eingegeben werden, so dass die für alle Artikel gleich sind.

    Wenn diese angegeben werden, werden diese weiterhin für alle Artikel genommen.

    Sonst wird geprüft, ob Artikelversandkosten definiert sind.

    Falls vorhanden werden diese verwendet.

    Falls nicht vorhanden, werden die günstigsten Versandkosten der installierten Shipping-Module für den Artikel innerhalb des Shop-Landes verwendet.....

    Neu ist auch das Feld "google_category", das nun für den Export zur Verfügung steht.
     

    Anhänge:

  6. Kiom

    Kiom Mitglied

    Registriert seit:
    19. Januar 2012
    Beiträge:
    8
    Danke erhalten:
    0
    Danke vergeben:
    1
    Wir sind seit kurzem live mit unserem Shop und haben nun das Problem der Anbindung an die Preissuchmaschinen. Ein Problem ist dass die Formate nicht aktuell sind ein anderes ist dass die Versandkosten nur global pro Preissuchmaschine eingegeben werden können.

    Da wir unterschiedliche Versandkosten für Artikel haben (3,90 € Kleinpaket, 6,90 € Paket, 59,90 € Spedition) ist für uns der Export nicht brauchbar.

    In unserem bisherigen OS Commerce (PX Webshop) konnte mann die Versandkosten automatisch vom Versandmodul berechnen lassen. Ebenso konnte man die Exportformate selbst anlegen oder verändern.

    In diesem Bereich sollte Gambio dringend tätig werden, man verliert sonst sehr an Sichtbarkeit.

    Wie löst Ihr das Problem das Preissuchmaschinen korrekt und automatisiert angesprochen werden können ?