Von osCommerce zu PrestaShop

5. April 2011 um 08:04 | 2 Kommentare

Für die Übertragung von Daten aus einem osCommerce-Shop zu PrestaShop 1.4 stehen verschiedene Möglichkeiten zur Verfügung. Folgende zwei Varianten werden nachfolgend vorgestellt.

Vor dem Import sollte man unbedingt eine Datenbanksicherung durchführen. Dies kann man bei PrestaShop unter “Tools” > “DB-Backup” erledigen. Es ist auch sinnvoll, wenn man vor dem Import vorhandene Artikel-, Kategorie- und Herstellerbilder unterhalb des PrestaShop-Verzeichnisses img/ löscht.

osCommerce-Importer

Ein Modul zur Übertragung von Daten aus einem osCommerce-Shop steht seit der PrestaShop-Version 1.4 zur Verfügung. Es existierten zwar schon vorher Möglichkeiten für eine Datenübernahme. Dies waren jedoch kommerzielle Erweiterungen, die separat erworben werden mussten. Ab PrestaShop 1.4 ist jetzt ein entsprechendes Modul kostenfrei vorhanden. Genaugenommen sind es zwei Module.

Zum einen das Modul Shop-Importer, das eine grundsätzliche Schnittstelle zur Verfügung stellt. Und zum anderen ein für das jeweilige Shopsystem passendes Importmodul. Da steht bisher das Modul osCommerce-Importer für die Anbindung zu einem osCommerce-Shop zur Verfügung. Mit weiteren Modulen für andere Shopsysteme ist zu rechnen.

Diese beiden Module müssen als ersten Schritt im PrestaShop-Backoffice unter “Module” > “Migrations-Tools” installiert werden.

osc-to-ps-module

Danach kann man im Shop-Importer mit Klick auf “Konfigurieren” den Import per osCommerce-Importer einstellen.

osc-to-ps-shop-importer

Diese Variante kann genutzt werden, um die Datenübernahme aus einem Shop auf Basis von osCommerce 2.2 und osCommerce 2.3 durchzuführen. Für die Version osCommerce 3, die sowieso noch nicht produktiv einsetzbar ist, kann man osCommerce-Importer derzeit nicht nutzen.

Bei der folgenden Anleitung wird davon ausgegangen, dass in PrestaShop noch keine Daten (Kategorien, Produkte, Kunden, Bestellungen usw) vorhanden sind oder beim Importvorgang gelöscht werden.

Importprozess

  1. Zugangsdaten

    Es müssen die Zugangsdaten der osCommerce-Datenbank angegeben werden. Diese Daten findet man im osCommerce-Verzeichnis in der Datei includes/configure.php.

    osc-to-ps-import-1

    Ein Datenbank-Präfix ist eine gleichbleibende Zeichenfolge, die am Anfang aller Tabellennamen existiert (z.B. ps_ oder osc_ ). Ob ein Präfix angegeben werden muss, sieht man in der osCommerce-Datenbank (z.B. per phpMyAdmin) oder in der osCommerce-Datei includes/database_tables.php. Normalerweise muss man in das Feld nichts eintragen, da osCommerce 2.x standardmäßig keinen Präfix nutzt.

  2. Import-Optionen

    Die Import-Optionen können an dieser Stelle ausgewählt werden. Manche der Optionen kann man abwählen, da osCommerce keine Zulieferer oder Kundengruppen unterstützt. In der Regel wird man auch nicht die Währung und Sprache importieren müssen.

    osc-to-ps-import-2

    Man hat die Möglichkeit, bei den Herstellern, Kategorien und Produkten die Bilder mit zu übernehmen. Es ist auch möglich, durch Anhaken der Papierkorb-Checkbox dafür zu sorgen, dass die vorhandenen PrestaShop-Einträge vorher gelöscht werden. Man findet in Prestashop 1.4 noch den einen oder anderen Übersetzungsfehler. Staat bedeutet hier States bzw Bundesländer.

  3. Erweiterte Optionen

    Hier hat man die Möglichkeit einzustellen, mit welcher Durchlaufanzahl der Import durchgeführt werden soll. Außerdem lässt sich definieren, was bei Importfehlern passieren soll.

    osc-to-ps-import-3

  4. Spezielle Optionen

    Bei den speziellen Optionen kann man die Standardsprache und die Standardwährung des osCommerce-Shops wählen. Außerdem muss die Shop-URL mitgeteilt werden, damit die Bilder (Artikel,Kategorien etc) übernommen werden können.

    osc-to-ps-import-4

  5. Test der Datenbank

    Es erfolgt ein Verbindungstest zur Datenbank.

    osc-to-ps-import-5

  6. Test des Imports

    Danach wird der Importprozesses testweise durchlaufen.

    osc-to-ps-import-6

  7. Importdurchlauf

    Als letzten Schritt kann man dann den Import starten. Nach Abschluss des Imports erhält man eine entsprechende Meldung.

    osc-to-ps-import-7

  8. Fehler beim Import

    Im Importprozesss kann es zu Fehlern kommen. Eine Meldung könnte so aussehen.

    osc-to-ps-import-8

Probleme

Die Übernahme der Daten aus einem osCommerce-Shop zu PrestaShop funktioniert mit diesen Modulen schon relativ gut. Folgende Fehler sind aufgefallen:

  • Steuersätze

    Der Steuersatz wird derzeit beim Import nicht berücksichtigt. Die Produkte werden mit dem Nettopreis importiert. Man kann die Übernahme des Steuersatzes erreichen, wenn man folgende Änderung in der Select-Abfrage (Zeile ~249) der Funktion getProducts in der Datei modules/importerosc/importerosc.php hinzufügt

    1
    
    , p.`products_tax_class_id` as id_tax_rules_group
    

    Wobei man darauf achten muss, dass die IDs der Steuersätze in osCommerce denen in PretaShop entsprechen (z.B. ID 1 = 19%).

    Mit der Erweiterung dieser Select-Abfrage kann man beim Import auch weitere Daten(z.B. ean13) in die PrestaShop-Tabelle ps_product bekommen, wenn man derartige Daten in der osCommerce-Datenbank hat

    Sofern alle Artikel den gleichen Steuersatz haben, kann man ansonsten auch nach dem Import die Spalte id_tax_rules_group in der Tabelle ps_product manuell auf den entsprechenden Wert (siehe Tabelle ps_tax) setzen. z.B.

    1
    
    UPDATE ps_product SET id_tax_rules_group = '1';
    

    Die in osCommerce angelegten Steuerklassen und Steuersätze werden nicht übernommen. Die Übernahme der Steuersätze wird vermutlich in einer späteren Version vom Shop-Importer kommen, da in der Datei shopimporter.php bereits (auskommentierter) Programmcode für die Steuerverwaltung vorhanden ist.

  • Kennwörter der Kunden

    Wer nicht mit osCommerce 2.3.1, sondern mit einer früheren osCommerce-Version gestartet ist, wird das Problem haben, dass sich die osCommerce-Kunden nach der Datenübernahme nicht in PrestaShop einloggen können. Der Grund dafür ist, dass sich die Kennwortverwaltung in osCommerce 2.3.1 geändert hat.

    Es ist so, dass beim Import in der PrestaShop-Tabelle ps_customer zwei Felder hinzugefügt werden.

    • id_customer_importerosc (ID-Nr. der osCommerce-Kunden)
    • passwd_importerosc (Kennwort der osCommerce-Kunden)

    Der vorgesehene Ablauf ist, dass bei der Anmeldung in PrestaShop geschaut wird, ob ein Wert in passwd_importerosc steht und dieser mit dem eingegebenen Wert übereinstimmt. Falls ja, wird passwd_importerosc geleert und das normale Kundenkennwort in passwd gefüllt. Dies erledigt das Modul osCommerce-Importer beim PrestaShop-Hook “Before Authentication”.

    osc-to-ps-module-authentication-1

    Den Code dafür findet man in der Datei modules/importerosc/importerosc.php ganz unten. Damit das Anmelden der osCommerce-Kunden beim PrestaShop klappt, kann man diese osCommerce-Datei in das PrestaShop-Verzeichnis modules/importerosc/ kopieren bzw als password_funcs.php speichern und die Funktion hookbeforeAuthentication in der Datei importerosc.php wie folgt anpassen:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    public function hookbeforeAuthentication($params)
    {
       $passwd = trim(Tools::getValue('passwd'));
       $email = trim(Tools::getValue('email'));
       $result = Db::getInstance()->GetRow('
         SELECT *
         FROM `'._DB_PREFIX_     .'customer`
         WHERE `active` = 1 AND `email` = \''.pSQL($email).'\'');                       
     
       if ($result && !empty($result['passwd_'.$this->name]))
        { 
          if ((file_exists(dirname(__FILE__).'/passwordhash.php')) && (file_exists(dirname(__FILE__).'/passwordhash.php')))
          {
             include(dirname(__FILE__).'/passwordhash.php');
             include(dirname(__FILE__).'/password_funcs.php');           
     
             if(tep_validate_password($passwd, $result['passwd_'.pSQL($this->name)]))
             {
                $ps_passwd =  md5(pSQL(_COOKIE_KEY_.$passwd));
                Db::getInstance()->Execute('
                UPDATE `'._DB_PREFIX_.'customer`
                SET `passwd` = \''.pSQL($ps_passwd).'\', passwd_'.pSQL($this->name).' = \'\'
                WHERE `'._DB_PREFIX_.'customer`.`id_customer` ='.(int)$result['id_customer'].' LIMIT 1');
             }
          }
       }
    }
    
  • Produktwert bei Bestellungen

    Sofern der Produktwert der osCommerce-Bestellungen nach dem Import in PrestaShop nicht korrekt angezeigt wird, kann man in der Funktion getOrders in der Datei modules/importerosc/importerosc.php (Zeile ~346) den Wert für total_products_wt vor einem erneuten Import wie folgt anpassen

    1
    
    $orders[$key]['total_products_wt'] = $this->getValue('SELECT value FROM `'.addslashes($this->prefix).'orders_total` WHERE `orders_id` = '.$order['id_cart'].' AND class=\'ot_subtotal\'');
    
  • Fehlende Kundenangaben

    Die Geschlechtsangabe des Kunden wird nicht übernommen. Dies kann man durch eine Anpassung der Funktion getCustomers in der Datei modules/importerosc/importerosc.php (Zeile ~175) korrigieren.

    1
    2
    3
    4
    
    case 'id_gender':
        (array_key_exists($val, $genderMatch) ? $val = $genderMatch[$val] : $val = 9);
       $return[$i][$attr] = $val;              
        break;
    

CSV-Import

PrestaShop bietet eine Importfunktion im Backoffice unter “Tools” > “Import”. Damit lassen sich Kategorien, Produkte, Produktattribute, Kunden, Adressen, Hersteller und Lieferer auf Basis von CSV-Dateien importieren. CSV-Dateien kann man beispielsweise mit Excel oder OpenOffice erstellen. Man kann diese aber auch per Skript generieren.

Importprozess

  1. Genierung der CSV-Dateien

    Nachfolgend ein Beispiel für ein einfaches Skript, dass die Kunden aus dem osCommerce-Shop ausliest und eine CSV-Datei erstellt, die sich dann in PrestaShop importieren lässt. Es wird dabei davon ausgegangen, dass noch keine Kunden in PrestaShop vorhanden sind. Einfach die folgende Datei in das osCommerce-Adminverzeichnis, das per htaccess-Schutz gesichert sein sollte, als export-customers.php kopieren und im Browser aufrufen.

    http://www.domain.de/adminverzeichnis/export-customers.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
    <?php
    $timestamp = time();
    header('Content-Type: text/x-csv; charset=UTF-8');
    header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
    header('Content-Disposition: attachment; filename=customers-'.$timestamp.'.csv');
    header('Pragma: no-cache'); 
     
    require('includes/configure.php');
    require('includes/database_tables.php');
     
    $output = 'Kennung;Aktiv (0/1);Geschlecht;E-Mail *;Kennwort *;Geburtstag (JJJJ-MM-TT);Nachname *;Vorname *;Newsletter (0/1);Opt-in (0/1)' . "\n";  
     
    $dbhandle = mysql_connect (DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD);
    $db = mysql_select_db(DB_DATABASE, $dbhandle);
    mysql_query("SET NAMES utf8");
     
    $customers = mysql_query("select *,DATE_FORMAT(customers_dob, '%Y-%m-%d') as customers_dob from " . TABLE_CUSTOMERS . " order by customers_id");
     
    $i = 0;
    while($customer = mysql_fetch_array($customers)) {
       // Kennung
        $output .= $customer['customers_id'] . ';';        
       // Aktiv (0/1)
       $output .= '1;';       
       // Geschlecht (Herr = 1, Frau = 2, sonst 9)
       switch($customer['customers_gender'])
       {
          case ("m"):
          $output .= '1;'; 
          break;
          case ("f"):
          $output .= '2;'; 
          break;
          default:
          $output .= '9;';
         break;
       }     
       // E-Mail *
        $output .= $customer['customers_email_address'] . ';';            
       // Kennwort *
        $output .= uniqid() . ';';        
       // Geburtstag (JJJJ-MM-TT) 
       if($customer['customers_dob'] != '00-00-00') {
          $output .= $customer['customers_dob'] . ';';     
          }
          else {
          $output .= ';';           
          }  
       // Nachname *
        $output .= $customer['customers_lastname'] . ';';     
       // Vorname *
        $output .= $customer['customers_firstname'] . ';';       
       // Newsletter (0/1)
        $output .= $customer['customers_newsletter'] . ';';      
       // Opt-in (0/1) 
        $output .= '0;';         
       // Zeilenumbruch
       $output .= "\n";    
    }
    echo $output;
    ?>
    
  2. Import der CSV-Dateien

    Der Import der CSV-Dateien im PrestaShop-Backoffice unter “Tools” > “Import” ist selbsterklärend. Man muss die zu importierende Datei auswählen. Die Voreinstellung für die Feldtrenner kann man in der Regel so belassen. Man kann dort dann auch angeben, dass bestehende Einträge, in diesem Fall die Kunden, gelöscht werden.

    osc-to-ps-csv-1-1

    Im nächsten Schritt muss man dann darauf achten, dass die Spalten übereinstimmen. Und man muss angeben, dass die erste Zeile übersprungen werden soll, sofern man in der ersten Zeile der CSV-Datei die Überschriften hat.

    osc-to-ps-csv-2

Probleme

  • Kennwörter

    Man kann das Kennwort der Kunden aus osCommerce nicht einfach 1:1 in die PrestaShop-Datenbank übernehmen. Das Kennwort wird in der osCommerce-Datenbank nicht im Klartext, sondern als verschlüsselte Version gespeichert. Beim Import per CSV-Datei wird das übergebene Kennwort jedoch im Klartext erwartet. Außerdem hat PrestaShop sowohl in der Datenbank als auch im Programmcode eine Grenze von 32 Zeichen für die Kennwörter und eine andere Verschlüsselungsmethode. Eine Lösungsmöglichkeit wäre, dass man wie in export-customers.php eine willkürliche Zeichenfolge als Kennwort nimmt. Im obigen Skript ist das per uniqid() umgesetzt. Kann man auch umfangreicher bewerkstelligen, so dass die Kennwörter sicherer werden. Der Kunde müsste sich dann auf der Loginseite von PrestaShop ein neues Kennwort zusenden lassen. Oder der Shopbetreiber sendet allen Kunden ein neues Kennwort zu und informiert die Shopkunden dann gleich über den Wechsel des Shopsystems.

Fazit

Die Nutzung des PrestaShop-Moduls osCommerce-Importer ist derzeit vermutlich die schnellste Variante, um Daten aus einem osCommerce-Shop zu übernehmen. Eine komplett fehlerfreie Übernahme der Daten darf man jedoch nicht erwarten. Vorherige oder nachträgliche Anpassungen sind in der Regel notwendig. Wer mehr Kontrolle haben möchte, sollte den Weg über die CSV-Dateien gehen. So kann man die osCommerce-Daten vor dem Import überprüfen.

Bookmarken, twittern oder mailen: Diese Icons verlinken auf Bookmark Dienste bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • MisterWong
  • Y!GG
  • Webnews
  • Digg
  • del.icio.us
  • TwitThis
  • Hype
  • Facebook
  • Google Bookmarks
  • Technorati
  • email
Flattr this

Dieser Artikel wurde am 5. April 2011 um 08:04 von Stefan Kanitz geschrieben (aktualisiert am 5. April 2011 um 08:50) und unter der Kategorie Shopsysteme archiviert. Du kannst diesen Artikel kommentieren oder einen Trackback auf Deinen Blog setzen. Die Kommentare lassen sich per RSS Feed oder per Mailbenachrichtigung verfolgen.

2 Kommentare/Trackbacks/Tweetbacks

  1. Hat perfekt geklappt, ich habe die Umstellung letzte Woche bei einem Kunden durchgeführt und es kam im Umstellungsprozess zu keinem Fehler. Selbst mit von mir entwickelten Modulen hat es teilweise sogar keine Probleme gegeben. Dafür “Daumen hoch”.

    Grßu
    Manfred

  2. ich finde den modul Schei….. das es verlangt sachen die mann nicht angeben kann:
    Please select a default language
    Please select a default currency
    Please set your shop url

Hinterlasse einen Kommentar

 
 
 

Du kannst diese HTML-Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Bitte die Kommentar-Regeln beachten. Hinweise zum Datenschutz.