Note
This image import option is only available for self-hosted systems. Customers which are hosted on the Xentral cloud have the possibility to import images via the file browser.
In order to import articles with the corresponding images, you can use the following example script. This script and the corresponding CSV file should be placed in the importer folder of the Xentrals folder. The present example script is for the example CSV file obst.csv, which is shown here as a table. In the table of the CSV file many columns for further properties can be created. In the following only the basis is shown. It should be noted: In the column Image the path to the images must be specified, but no links. This action is only if the images are not located in the same folder as the script. If the articles already exist in user-Xentral only the images are to be added, the article number and a column with the path for the image. The code has to be adapted accordingly. This script is called bilderimport.php artikel namedercsvdatei.csv in the command line in the folder importer of the respective Xental, if the script was saved.
<?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); } } ?>
The following import script can be used to add new images to existing articles. For this, a unique property of an article is required, e.g. the article ID, the article number or the EAN. In the example the article number as unique property to find out the ID of the article, which is needed for linking the images to the article.
<?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); } } ?>