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.