Inhaltsverzeichnis
Im Folgenden wird erklärt, wie eine CSV-Datei per Kommandozeile eingelesen werden kann.
Sowohl das PHP Script als auch die CSV-Datei liegen in diesem Beispiel im Ordner Importer des xentral Ordners.
Kopf des Scripts
Damit das Script auf die eigenen Funktionen von xentral zugreifen kann, müssen ein paar Klassen eingebunden und Objekte erstellt werden. Dies geschieht mit folgendem Code:
<?php // Nur einfache Fehler melden error_reporting(E_ERROR | E_WARNING | E_PARSE); include_once("../conf/main.conf.php"); include_once("../phpwf/plugins/class.mysql.php"); include_once("../phpwf/plugins/class.string.php"); include_once("../phpwf/plugins/class.user.php"); include_once("../www/lib/class.erpapi.php"); class app_t { var $DB; var $String; var $User; } $app = new app_t(); $app->User = new User($app); $conf = new Config(); $app->DB = new DB($conf->WFdbhost,$conf->WFdbname,$conf->WFdbuser,$conf->WFdbpass); $app->String = new String(); $erp = new erpAPI($app); $app->erp = $erp;
Parameter übergeben
Wird in der Konsole ein Script aufgerufen mit
php script.php Datei
werden die Parameter in das Array $argv gespeichert. Es ist sinnvoll zu prüfen, ob überhaupt ein Parameter gegeben ist und ob die im Aufruf angegebene Datei existiert:
if(!isset($argv[1])) { die("Keine Datei zum Import angegeben"); } if(!file_exists($argv[1])) { die("Datei ".$argv[1]." existiert nicht"); } if(!is_file($argv[1])) { die($argv[1]." ist keine Datei"); }
Einlesen der Datei
Hier wird gezeigt, wie die Datei eingelesen werden kann:
$csvimport = new CSVImport($app, $argv[1]); class CSVImport { var $app; var $Datei; function __construct(&$app, $Datei) { $this->app = $app; $this->Datei = $Datei; } function read() { if($this->Datei && file_exists($this->Datei) && is_file($this->Datei)) { if (($handle = fopen($this->Datei, "r")) !== FALSE) { $row = 0; while (($csv = fgetcsv($handle, 0, ";")) !== FALSE) { //$line = iconv("ISO-8859-1","UTF-8", $line); //Falls Script in UTF-8 und CSV in ANSI gespeichert ist wird der String umgewandelt foreach($csv as $k => $el)$csv[$k] = iconv("ISO-8859-1","UTF-8", $el); $row++; //$csv = str_getcsv($line, "\t","\""); //Wenn CSV mit Tab getrennt und einzelne Elemente mit " umschlossen sind //$csv = str_getcsv($line, ";",""); //mit ; getrennt if($row < 5) { //Falls der Kopf der Datei 4 Zeilen hat kann man dies z.B. zum Debuggen verarbeiten } else { //Ab hier werden die eigentlichen Daten verarbeitet $this->verarbeite($csv); } } } } else { return false; } } function verarbeite(&$csv) { //Verarbeiten der einzelnen Daten ... } }
Verarbeiten der Daten mit Wawifunktionen
Die erpAPI-Klasse bietet viele Funktionen zum Import bzw. zum Verarbeiten der Daten. Im vorliegenden Beispiel wird der Import von Artikeln erklärt:
function verarbeite(&$csv) { //Verarbeiten der einzelnen Daten if($csv[30]) { $data['nummer'] = $csv[2]; //Falls Artikelnummer 3. Spalte ist $data['name_de'] = $csv[0]; //Falls Artikelname in der ersten Spalte ist $data['kurztext_de'] = $csv[22]; /*$data['beschreibung_de'] = .... $data['hersteller'] = ... $data['herstellerlink'] = ...*/ $data['gewicht'] = $csv[48]; if($scv[32] == 'D1')$data['umsatzsteuer'] = 'ermaessigt'; //Daten werden mit der erpAPI gespeichert $artikelid = true; $artikelid = $this->app->erp->InsertUpdateArtikel($data); //Nun die Verkaufspreise $preisbrutto = $csv[30]; $nettopreis = $preisbrutto / (1+($scv[32]=='D1'?7:19)/100); //print_r($data); //echo $nettopreis; $this->app->erp->AddVerkaufspreis($artikelid,1,0,$nettopreis); } if($csv[31]) { //Downloadartikel $data2['nummer'] = $csv[2].'D'; //Falls Artikelnummer 3. Spalte ist $data2['name_de'] = $csv[0].' Download'; //Falls Artikelname in der ersten Spalte ist $data2['kurztext_de'] = $csv[22]; /*$data['beschreibung_de'] = .... $data['hersteller'] = ... $data['herstellerlink'] = ...*/ if($scv[32] == 'D1')$data2['umsatzsteuer'] = 'ermaessigt'; if(isset($artikelid)) { $data2['variante'] = 1; $data2['variante_von'] = $artikelid; } $artikelid2 = $this->app->erp->InsertUpdateArtikel($data2); $preisbrutto = $csv[31]; $nettopreis = $preisbrutto / (1+($scv[32]=='D1'?7:19)/100); //print_r($data2); //echo $nettopreis; $this->app->erp->AddVerkaufspreis($artikelid2,1,0,$nettopreis); } }
Gesamte Datei
Die gesamte Datei gestaltet sich wie folgt:
<?php // Nur einfache Fehler melden error_reporting(E_ERROR | E_WARNING | E_PARSE); include_once("../conf/main.conf.php"); include_once("../phpwf/plugins/class.mysql.php"); include_once("../phpwf/plugins/class.string.php"); include_once("../phpwf/plugins/class.user.php"); include_once("../www/lib/class.erpapi.php"); class app_t { var $DB; var $String; var $User; } $app = new app_t(); $app->User = new User($app); $conf = new Config(); $app->DB = new DB($conf->WFdbhost,$conf->WFdbname,$conf->WFdbuser,$conf->WFdbpass); $app->String = new String(); $erp = new erpAPI($app); $app->erp = $erp; if(!isset($argv[1])) { die("Keine Datei zum Import angegeben"); } if(!file_exists($argv[1])) { die("Datei ".$argv[1]." existiert nicht"); } if(!is_file($argv[1])) { die($argv[1]." ist keine Datei"); } $csvimport = new CSVImport($app, $argv[1]); $csvimport->read(); class CSVImport { var $app; var $Datei; function __construct(&$app, $Datei) { $this->app = $app; $this->Datei = $Datei; } function read() { if($this->Datei && file_exists($this->Datei) && is_file($this->Datei)) { if (($handle = fopen($this->Datei, "r")) !== FALSE) { $row = 0; while (($csv = fgetcsv($handle, 0, ";")) !== FALSE) { //$line = iconv("ISO-8859-1","UTF-8", $line); //Falls Script in UTF-8 und CSV in ANSI gespeichert ist wird der String umgewandelt foreach($csv as $k => $el)$csv[$k] = iconv("ISO-8859-1","UTF-8", $el); $row++; //$csv = str_getcsv($line, "\t","\""); //Wenn CSV mit Tab getrennt und einzelne Elemente mit " umschlossen sind //$csv = str_getcsv($line, ";",""); //mit ; getrennt if($row < 5) { //Falls der Kopf der Datei 4 Zeilen hat kann man dies z.B. zum Debuggen verarbeiten } else { //Ab hier werden die eigentlichen Daten verarbeitet $this->verarbeite($csv); } } return true; } else die("Konnte Datei ".$this->Datei." nicht oeffnen!\r\n"); } else { echo $this->Datei." nicht gefunden\r\n"; return false; } } function verarbeite(&$csv) { //Verarbeiten der einzelnen Daten if($csv[30]) { $data['nummer'] = $csv[2]; //Falls Artikelnummer 3. Spalte ist $data['name_de'] = $csv[0]; //Falls Artikelname in der ersten Spalte ist $data['kurztext_de'] = $csv[22]; /*$data['beschreibung_de'] = .... $data['hersteller'] = ... $data['herstellerlink'] = ...*/ $data['gewicht'] = $csv[48]; if($scv[32] == 'D1')$data['umsatzsteuer'] = 'ermaessigt'; //Daten werden mit der erpAPI gespeichert $artikelid = true; $artikelid = $this->app->erp->InsertUpdateArtikel($data); //Nun die Verkaufspreise $preisbrutto = $csv[30]; $nettopreis = $preisbrutto / (1+($scv[32]=='D1'?7:19)/100); //print_r($data); //echo $nettopreis; $this->app->erp->AddVerkaufspreis($artikelid,1,0,$nettopreis); } if($csv[31]) { //Downloadartikel $data2['nummer'] = $csv[2].'D'; //Falls Artikelnummer 3. Spalte ist $data2['name_de'] = $csv[0].' Download'; //Falls Artikelname in der ersten Spalte ist $data2['kurztext_de'] = $csv[22]; /*$data['beschreibung_de'] = .... $data['hersteller'] = ... $data['herstellerlink'] = ...*/ if($scv[32] == 'D1')$data2['umsatzsteuer'] = 'ermaessigt'; if(isset($artikelid)) { $data2['variante'] = 1; $data2['variante_von'] = $artikelid; } $artikelid2 = $this->app->erp->InsertUpdateArtikel($data2); $preisbrutto = $csv[31]; $nettopreis = $preisbrutto / (1+($scv[32]=='D1'?7:19)/100); //print_r($data2); //echo $nettopreis; $this->app->erp->AddVerkaufspreis($artikelid2,1,0,$nettopreis); } } }
Import Datei einmalig ausführen
Die Datei, welche die CSV Datei verarbeitet (.php Datei), muss im xentral Ordner in den Ordner importer gespeichert sein. Hier werden auch die benötigten CSV Dateien zum Verarbeiten abgelegt. In diesem Beispiel ist die PHP Datei beispielimporter.php und die CSV Datei beispieldaten.csv.
Im Anschluss wird die Konsole aufgerufen und in den importer Ordner gewechselt, z.B. mit
cd /var/www/html/wawision/importer
Der Pfad kann, je nachdem wie die Verzeichnisstruktur aufgebaut ist, abweichen.
Mit
php beispielimporter.php beispieldaten.csv
wird die PHP Datei aufgerufen und der Code darin ausgeführt.
Die Dateinamen müssen durch die jeweiligen Dateinamen ersetzt werden.
Es kann sein, dass ein Typ angegeben werden muss, hier wird die Konsole jedoch darauf aufmerksam machen und die möglichen Typen nennen. Dann erfolgt der Aufruf mit
php beispielimporter.php beispieltyp beispieldaten.csv
Je nach Dateigröße der CSV Datei, kann der Ablauf mehrere Minuten in Anspruch nehmen. Der Code wurde komplett ausgeführt, wenn in der Kommandozeile wieder der Benutzernamen und Pfad in einer neuen Zeile erscheint.
Import Datei mehrmals manuell ausführen
Die Datei, welche die CSV Datei verarbeitet (.php Datei), muss im xentral Ordner in den Ordner importer abgelegt werden. Hier werden auch die benötigten CSV Dateien zum Verarbeiten abgelegt. In diesem Beispiel ist die PHP Datei beispielimporter.php und die CSV Datei beispieldaten.csv.
Im Anschluss wird die Konsole aufgerufen und in den importer Ordner gewechselt, z.B. mit
cd /var/www/html/wawision/importer
Der Pfad kann je nachdem wie die Verzeichnisstruktur aufgebaut ist abweichen.
Mit
php beispielimporter.php
wird die PHP Datei aufgerufen und der Code darin ausgeführt. Der Dateinamen muss durch den jeweiligen Dateinamen ersetzt werden. Je nach Dateigröße der CSV Datei, kann der Ablauf mehrere Minuten in Anspruch nehmen. Der Code wurde komplett ausgeführt, wenn in der Kommandozeile wieder der Benutzernamen und Pfad in einer neuen Zeile erscheint.