Bilderimport

  • Bilderimport
Für den Import von Artikeln mit dazugehörigen Bildern, kann sich an folgendem Beispielscript orientiert werden. Das Script, sowie die dazugehörige CSV Datei sollten Sie in den Ordner importer Ihres Xentrals Ordner ablegen. Das Beispiel-Script ist für die Beispiel-CSV-Datei obst.csv, welche hier als Tabelle dargestellt ist. In der CSV-Datei können Sie so viele Spalten für weitere Eigenschaften haben wie Sie möchten; hier wird lediglich das Grundlegendste gezeigt. In der Spalte Bild müssen Sie, falls die Bilder nicht im selben Ordner wie das Script liegen, den Pfad zu den Bildern angeben, jedoch keine Verlinkungen. Falls in Ihrem Xentral die Artikel schon existieren und Sie lediglich die Bilder hinzufügen wollen, so benötigen Sie in Ihrer CSV-Datei nur die Artikelnummer und eine Spalte mit dem Pfad für das Bild. Den Code müssen Sie entsprechend anpassen. Aufgerufen wird das Script mit php bilderimport.php artikel namedercsvdatei.csv in der Kommandozeile im Ordner importer Ihres Xentrals, falls Sie das Script dort abgespeichert haben.

Beispiel CSV Datei: obst.csv

Artikelnummer Artikelname Beschreibung Einkaufspreis Verkaufspreis Lieferant Bestellnummer Bild
115486 Apfel Ein roter Apfel 0,25 0,40 Obst GmbH 47577 apfel.png
115487 Birne Eine grüne Birne 0,30 0,50 Obst GmbH 47578 birne.png

Beispiel PHP Datei: bilderimport.php


<?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");
//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);



  }

    

}


?>

Beispiel Bilder zu bestehenden Artikeln hinzufügen

Mit dem folgenden Importscript kann man zu bereits bestehenden Artikeln neue Bilder hinzufügen. 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 man für das Verknüpfen der Bilder auf den Artikel benötigt.

Beispiel CSV Datei: obst.csv

Artikelnummer Bild
115486 apfel.png
115487 birne.png

Beispiel PHP Datei: bilderimport.php


<?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");
//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); 
 
  } 
} 
 
?>

War der Artikel hilfreich?
Vielen Dank für Ihr Feedback!

Made with ❤ at zwetschke.de