Import von xtCommerce und osCommerce Kundendaten mit xtc2oxid/osc2oxid

Bisher werden von dem xxCommerce-Importer keine Kundendaten importiert.

Die immer wieder vorgeschlagene Lösung, das über einen Direktimport mit dem generischen CSV-Import oder PHPMyAdmin zu lösen ist auch keine, da die Kunden-Daten, die bei OXID in einer Tabelle gespeichert werden, bei xxCommerce in 3 Tabellen gespeichert sind.

(Zur Ermittlung der OXID “countryid” im Kundensatz muss man sogar noch als 4. Tabelle die “oxcountry” von OXID mit berücksichtigen.)

Ich habe daher den OXID xxCommerce-Importer um eine Kunden-Import-Funktion erweitert.

Es wird alles notwendige übernommen,[B] außer dem Passwort[/B], da xxCommerce und OXID unterschiedliche Verschlüsselungen für Passsworte anwenden, und diese somit nicht kompatibel sind.

Als OXID-Username wird, wie in xxCommerce, die eMail-Adresse verwendet.

Die Haupt-Arbeit des Kopierens wird über ein SQL-Statement erledigt.

Da man damit aber nicht den Straßennamen in den Namen und die Hausnummer aufteilen kann, wie OXID das vorsieht, wird nach dem Kopieren die Kundentabelle noch einmal per PHP durchlaufen, um diese Aufteilung durchzuführen.

Bei dieser Gelegenheit wird auch gleich noch eine Text-Datei “[B]user_email.txt[/B]” in der Shop-Root erstellt, die alle eMail-Adressen der importierten Kunden enthält.

Mit deren Hilfe kann man die Kunden anmailen, um ihnen mitzuteilen, dass sie jetzt in einem neuen Shop zu Hause sind, und wie sie an ihr neues Passwort kommen…

Zum Einbau dieser Funktion geht man wie folgt vor:

In Datei “[B]xtc2oxid.php[/B]”

vor

//--- MANUFACTURERS ------------------------------------------------------

einfügen

//--- CUSTOMERS ------------------------------------------------------
printLine("IMPORTING CUSTOMERS");
$oIHandler->importCustomers();
printLine("Done.
");
//------------------------------------------------------------------------

Analog erfolgt der Einbau in die Datei “[B]osc2oxid.php[/B]”.

In Datei “[B]_functions.inc.php[/B]”

vor

/**
     * Manufacturer importer
     */

einfügen

/**
     * Customer importer
     */
    public function importCustomers()
    {
        $sOcmDb = $this->_sOcmDb;
        $sShopId = $this->_sShopId;
        
        $oxDB=oxDb::getDb(true);
        $oRs = $oxDB->Execute("SET SESSION sql_mode=''");  //Reset strict mode
        //Copy user data
        $sQ = "
        REPLACE INTO oxuser (
          oxid, 
          oxactive, 
          oxboni,
          oxrights,
          oxshopid,
          oxusername,
          oxcustnr,
          oxustid,
          oxcompany,
          oxfname,
          oxlname,
          oxstreet,
          oxcity,
          oxcountryid,
          oxzip,
          oxaddinfo,
          oxfon,
          oxprivfon,
          oxfax,
          oxsal,
          oxbirthdate,
          oxcreate,
          oxregister
          )
          
          (
          SELECT 
          c.customers_id, 
          1,
          1000,
          if (c.customers_status=0,'malladmin','user'),
          '$sShopId', 
          c.customers_email_address,
          if (c.customers_cid,c.customers_cid,c.customers_id+20000),
          c.customers_vat_id,
          a.entry_company,
          c.customers_firstname,
          c.customers_lastname,
          a.entry_street_address,
          a.entry_city,
          coo.oxid,
          a.entry_postcode,
          'Imported from xtCommerce',
          c.customers_telephone,
          c.customers_telephone,
          c.customers_fax,
          if (c.customers_gender=0,'Herr','Frau'),
          c.customers_dob,
          now( ),
          if (c.customers_date_added,c.customers_date_added,now())
          FROM 
          $sOcmDb.customers c,
          $sOcmDb.address_book a,
          $sOcmDb.countries cox,
          oxcountry coo
          WHERE 
          a.customers_id = c.customers_id and
          cox.countries_id=a.entry_country_id and
          coo.oxisoalpha2=cox.countries_iso_code_2 and
          c.customers_id>1
          )";
        $oRs = $oxDB->Execute($sQ);
        //Separate street-number and street and build text-file with user email-addresses for notification.
        $oRs = $oxDB->execute('select oxid,oxstreet,oxusername from oxuser where oxid<>"oxdefaultadmin"');
        if ( $oRs !== false && $oRs->recordCount() > 0) 
        {
          $emails=array();
          while ( !$oRs->EOF ) 
          {
            $street=$oRs->fields['oxstreet'];
            $street_a=explode(' ',$street);
            $add_dot=sizeof($street_a)==1;
            if ($add_dot)
            {
              $street_a=explode('.',$street);
            }
            if (sizeof($street_a)>1)
            {
              $street_nr=end($street_a);
              $n_street_nr=(float)$street_nr;
              if ($n_street_nr && is_numeric($n_street_nr))
              {
                $street=rtrim(str_replace($street_nr,'',$street));
                if ($add_dot)
                {
                  $street.='.';
                }
                $oxid=$oRs->fields['oxid'];
                $sQ="update oxuser set oxstreet='$street', oxstreetnr='$street_nr' where oxid='$oxid'";
                $oxDB->execute($sQ);
              }
            }
            $email=trim($oRs->fields['oxusername']);
            if ($email)
            {
              $emails[]=$email;
            }
            $oRs->moveNext();
          }
          if (sizeof($emails)>0)
          {
            global $sOxidConfigDir;
            
            sort($emails);
            $emails=implode("
",$emails);
            $fh=fopen($sOxidConfigDir.'user_email.txt','w');
            if ($fh)
            {
              fwrite($fh,$emails);
              fclose($fh);
            }
          }
        }
    }


In Datei “[B]_functions.inc.php[/B]”, “[B]public function cleanUpBeforeImport()[/B]”

vor

}

einfügen


        //Clean target user table, preserve mall admin
        $sQ="delete from oxuser where oxshopid = '".$this->_sShopId."' and oxid<>'oxdefaultadmin'";
        oxDb::getDb()->Execute($sQ);

Die Funktion wurde mit xtCommerce getestet, nicht jedoch mit osCommerce.

Sie sollte aber auch damit funktionieren.

Hallo Avange,

finde ich super, dass Du dich mit der XTC->Oxid Thematik auseinandersetzt.
Fand es eh schade, dass zwar vor geraumer Zeit ein Skript bereitgestellt wurde, auf das Feedback hier im Forum aber nicht so direkt eingegangen wurde. Deine Lösung werde ich in Kürze mal ausprobieren, erspart einiges an Handarbeit.