Anmerkung
Diese Möglichkeit des Bilderimports besteht nur bei selbst gehosteten Systemen. Kunden welche auf der xentral Cloud gehostet sind haben die Möglichkeit Bilder über den Dateibrowser zu importieren und zuzuordnen.
Um Artikel mit den dazugehörigen Bildern zu importieren, kann sich an folgendem Beispielscript orientiert werden. Dieses Script sowie die dazugehörige CSV Datei sollten im Ordner importer des xentrals Ordners abgelegt werden. Das vorliegende Beispiel-Script ist für die Beispiel-CSV-Datei obst.csv, welche hier als Tabelle dargestellt ist. Dabei können in der Tabelle der CSV-Datei bedarfsmäßig viele Spalten für weitere Eigenschaften erzeugt werden. Im Folgenden wird lediglich die Grundlage gezeigt. Dabei ist zu beachten: In der Spalte Bild muss der Pfad zu den Bildern angegeben werden, jedoch keine Verlinkungen. Diese Aktion ist nur durchzuführen, falls die Bilder nicht im selben Ordner wie das Script liegen. Falls in Benutzer-xentral die Artikel bereits existieren und lediglich die Bilder hinzugefügt werden sollen, wird in der CSV-Datei nur die Artikelnummer und eine Spalte mit dem Pfad für das Bild benötigt. Der Code ist danach entsprechend anzupassen. Aufgerufen wird dieses Script mit php bilderimport.php artikel namedercsvdatei.csv in der Kommandozeile im Ordner importer des jeweiligen xentrals, falls das Script dort abgespeichert wurde.
<?PHP // Nur einfache Fehler melden error_reporting(E_ERROR | E_WARNING | E_PARSE); require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/../xentral_autoloader.php'; $laravel = require_once __DIR__ . '/../bootstrap/app.php'; $kernel = $laravel->make(Illuminate\Contracts\Console\Kernel::class); $kernel->bootstrap(); 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"); //include_once("../www/lib/class.erpapi_custom.php"); class secure_t { var $id; function GetGET($val) { if($val == 'id')return ''; return $_GET[$val]; } } class app_t { var $DB; var $String; var $User; } if(empty($app)) { $app = new app_t(); } if(empty($app->Secure))$app->Secure = new secure_t(); if(empty($app->User))$app->User = new User($app); if(empty($app->Conf)) { $conf = new Config(); $app->Conf = $conf; } if(empty($app->DB))$app->DB = new DB($conf->WFdbhost,$conf->WFdbname,$conf->WFdbuser,$conf->WFdbpass); if(empty($app->String))$app->String = new WawiString(); if(empty($app->erp)) { $erp = new erpAPI($app); $app->erp = $erp; } if(isset($argv[1]) && isset($argv[2])) { $importer = new Importer($app, $argv[1] ,'./'.$argv[2], isset($argv[3])?$argv[3]:null); } else { echo "Bitte import_mit_bild.php Typ <Datei>.csv angeben\r\n"; echo "mögliche Typen: artikel "; echo "\r\n"; } class Importer { function __construct(&$app, $typ, $Datei, $parameter) { $this->app = $app; $projekt = $this->app->DB->Select("SELECT standardprojekt FROM firma WHERE id='".$this->app->User->GetFirma()."' LIMIT 1"); $projektid = $projekt; $this->Laender = $this->app->erp->GetSelectLaenderliste(true); $col = array(0,2,3); $csvarray = array(); if(file_exists($Datei) && is_file($Datei)) { $csvfile = $Datei; if (($handle = fopen($csvfile, "r")) !== FALSE) { $row = 0; while (($csv = fgetcsv($handle,0,';')) !== FALSE) { $row++; //Falls Datei in ISO-8859-1 und nicht UTF-8 $num = count($csv); //Anzahl Spalten in CSV //ab zweiter Spalte ausführen aber nur wenn es mehr als eine Spalte gibt if($row > 1 && $num >= 2) { foreach($csv as $k =>$v){ $ucsv[$k] = $v; } //Parameter als escaped Version für direkte SQL-Statements foreach($csv as $k =>$v){ $csv[$k] = $this->app->DB->real_escape_string($v); } switch($typ) { case 'artikel': $this->artikel($csv, $ucsv); break; } }elseif($row == 1){ } } fclose($handle); } } else { echo "Datei ".$Datei." existiert nicht\r\n"; exit; } } function artikel(&$csv, &$ucsv) { //Holt die Werte aus dem $ucsv Array, dessen Indizes den Spalten der CSV Datei entsprechen ab 0 beginnend $nummer = $ucsv[0]; $name_de = $ucsv[1]; $anabregs_text = $ucsv[2]; $einkaufspreis = $ucsv[3]; $verkaufspreis = $ucsv[4]; $lieferantenname = $ucsv[5]; $bestellnummer = $ucsv[6]; $bild = $ucsv[7]; //Variablen werden in ein neues Array gespeichert, um Artikel einfacher einzufügen. Keys entsprechen Spaltennamen der Tabelle artikel in der Datenbank $art['nummer'] = $nummer; $art['name_de'] = $name_de; $art['anabregs_text'] = $anabregs_text; //Fügt den Artikel in die Datenbank ein $artid = $this->app->erp->InsertUpdateArtikel($art); //Komma der Einkaufs- und Verkaufspreise werden mit einem Punkt ersetzt $einkaufspreis = str_replace(',','.',$einkaufspreis); $verkaufspreis = str_replace(',','.',$verkaufspreis); //Holt die Lieferantenid, welche für den Einkaufspreis benötigt wird $adresselieferant = $this->app->DB->Select("SELECT id FROM adresse WHERE name_de = \"$lieferantenname\""); //Wenn eine Lieferantenid existiert, wird der Einkaufspreis hinzugefügt if($adresselieferant != ""){ $this->app->erp->AddEinkaufspreis($artid, 1, $adresselieferant, $bestellnummer, $name_de, $einkaufspreis); } //Verkaufspreis wird hinzugefügt $this->app->erp->AddVerkaufspreis($artid, 1, 0, $verkaufspreis); //Holt den Pfad für den Speicherort der Bilder $pfad = $this->app->Conf->WFuserdata; $pfad = rtrim($pfad); //Legt den Ordner für den Speicherort der Bilder fest, sollte der Ordner dms sein $pfad .= "/dms/"; //Falls der Ordner dms nicht existiert, wird er angelegt if(!file_exists($pfad)){ mkdir($pfad, 0777, true); } $speicherpfad = $pfad.$this->app->Conf->WFdbname; if(!file_exists($speicherpfad)) { mkdir($speicherpfad, 0777, true); } //Datei wird angelegt und in xentral hinterlegt $fileid = $this->app->erp->CreateDatei($bild, $bild, "", "", $bild, "",true,$speicherpfad); $this->app->erp->AddDateiStichwort($fileid, "Bild", "artikel", $artid); } } ?>
Mit dem folgenden Importscript können zu bereits bestehenden Artikeln neue Bilder hinzugefügt werden. Hierfür wird eine eindeutige Eigenschaft eines Artikels benötigt, wie z.B. die ArtikelID, die Artikelnummer oder die EAN. Im Beispiel wird anhand der Artikelnummer als eindeutige Eigenschaft die ID des Artikels herausgefunden, die für das Verknüpfen der Bilder auf den Artikel benötigt wird.
<?PHP // Nur einfache Fehler melden error_reporting(E_ERROR | E_WARNING | E_PARSE);require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/../xentral_autoloader.php'; $laravel = require_once __DIR__ . '/../bootstrap/app.php'; $kernel = $laravel->make(Illuminate\Contracts\Console\Kernel::class); $kernel->bootstrap(); 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"); //include_once("../www/lib/class.erpapi_custom.php"); class secure_t { var $id; function GetGET($val) { if($val == 'id')return ''; return $_GET[$val]; } } class app_t { var $DB; var $String; var $User; } if(empty($app)) { $app = new app_t(); } if(empty($app->Secure))$app->Secure = new secure_t(); if(empty($app->User))$app->User = new User($app); if(empty($app->Conf)) { $conf = new Config(); $app->Conf = $conf; } if(empty($app->DB))$app->DB = new DB($conf->WFdbhost,$conf->WFdbname,$conf->WFdbuser,$conf->WFdbpass); if(empty($app->String))$app->String = new WawiString(); if(empty($app->erp)) { $erp = new erpAPI($app); $app->erp = $erp; } if(isset($argv[1]) && isset($argv[2])) { $importer = new Importer($app, $argv[1] ,'./'.$argv[2], isset($argv[3])?$argv[3]:null); } else { echo "Bitte bilderimport.php Typ <Datei>.csv angeben\r\n"; echo "mögliche Typen: artikel "; echo "\r\n"; } class Importer { function __construct(&$app, $typ, $Datei, $parameter) { $this->app = $app; $projekt = $this->app->DB->Select("SELECT standardprojekt FROM firma WHERE id='".$this->app->User->GetFirma()."' LIMIT 1"); $projektid = $projekt; $this->Laender = $this->app->erp->GetSelectLaenderliste(true); $col = array(0,2,3); $csvarray = array(); if(file_exists($Datei) && is_file($Datei)) { $csvfile = $Datei; if (($handle = fopen($csvfile, "r")) !== FALSE) { $row = 0; while (($csv = fgetcsv($handle,0,';')) !== FALSE) { $row++; //Falls Datei in ISO-8859-1 und nicht UTF-8 $num = count($csv); //Anzahl Spalten in CSV //ab zweiter Spalte ausführen aber nur wenn es mehr als eine Spalte gibt if($row > 1 && $num >= 2) { foreach($csv as $k =>$v){ $ucsv[$k] = $v; } //Parameter als escaped Version für direkte SQL-Statements foreach($csv as $k =>$v){ $csv[$k] = $this->app->DB->real_escape_string($v); } switch($typ) { case 'artikel': $this->artikel($csv, $ucsv); break; } }elseif($row == 1){ } } fclose($handle); } } else { echo "Datei ".$Datei." existiert nicht\r\n"; exit; } } function artikel(&$csv, &$ucsv) { //Holt die Werte aus dem $ucsv Array, dessen Indizes den Spalten der CSV Datei entsprechen ab 0 beginnend $artikelnummer = $ucsv[0]; // muss eindeutig sein, wie z.B. Artikelid, Artikelnummer oder EAN der Artikel nehmen $bild = $ucsv[1]; //Eindeutige Artikelid wird geholt $artikelid = $this->app->DB->Select("SELECT id FROM artikel WHERE nummer = '$artikelnummer' LIMIT 1"); //Holt den Pfad für den Speicherort der Bilder $pfad = $this->app->Conf->WFuserdata; $pfad = rtrim($pfad); //Legt den Ordner für den Speicherort der Bilder fest, sollte der Ordner dms sein $pfad .= "/dms/"; //Falls der Ordner dms nicht existiert, wird er angelegt if(!file_exists($pfad)){ mkdir($pfad, 0777, true); } $speicherpfad = $pfad.$this->app->Conf->WFdbname; if(!file_exists($speicherpfad)) { mkdir($speicherpfad, 0777, true); } //Datei wird angelegt und in xentral hinterlegt $fileid = $this->app->erp->CreateDatei($bild, $bild, "", "", $bild, "",true,$speicherpfad); $this->app->erp->AddDateiStichwort($fileid, "Bild", "artikel", $artikelid); } } ?>