Template Scripts

Template Scripts ermöglichen die weitergehende Anpassung von PDF-Belegen, E-Mail-Templates und anderen Ausgabeformaten aus Xentral. Bereits im Standard stehen mit den Konfigurationsmöglichkeiten viele Einstellungsmöglichkeiten zur Verfügung. Dazu gehören die Anpassung der Schriftart und -größen, Positionierung von Elementen und einiges mehr. Sollen aber neue Daten hinzugefügt werden, Berechnungen stattfinden oder besondere Spracheinstellungen umgesetzt werden kann durch Rendering Scripts jedes Detail angepasst werden.

Briefpapier überladen

Ein Beispiel für die Anpassung von Templates in Xentral ist die Überladung des Briefpapiers. Hier können weitere Informationen integriert werden, die im Standard-Briefpapier nicht zur Verfügung stehen, wie zum Beispiel zusätzlich bei einer Artikelposition zur Artikelbeschreibung das Gewicht oder die Höhe.

Umsetzung

Die Datei die das Briefpapier überladen soll, muss class.briefpapier_custom.php heißen. Diese Datei muss im Ordner www/lib/dokumente liegen und ist dann für alle Belegarten (Rechnung, Auftragm Lieferschein, Gutschrift, etc.) gültig. Im folgenden Beispiel soll zusätzlich das Gewicht sowie die Höhe, Breite, Länge und Ursprungsregion des Artikels zur Artikelbeschreibung einer Position hinzugefügt werden. Bisher gibt es noch kein Custom Briefpapier, weshalb das Briefpapier vorerst wie in den Standardeinstellungen festgelegt aussieht: :entwickler:briefpapiervorher.png?nolink&700 Als Erstes erstellt man sich die Datei class.briefpapier_custom.php . Das Grundgerüst für das Custom Briefpapier sieht wie folgt aus:
<?php

include_once "class.briefpapier.php";

class BriefpapierCustom extends Briefpapier {

  function __construct(&$app)
  {
    $this->app = $app;
    parent::__construct($app);
  } 
  
} 
?>
Als Nächstes öffnet man die Datei class.briefpapier.php, die derzeit für das Layout des Briefpapiers zuständig ist und sucht sich die Funktion heraus, die man überladen möchte, kopiert sie und fügt sie unter der Funktion __construct ein. In diesem Fall kopiert man die Funktion renderItems(), da sie für die Darstellung der Artikelpositionen verantwortlich ist. Da die Funktion renderItems() recht umfangreich ist, wird hier jetzt nur angedeutet, wie der Code von class.briefpapier_custom.php im Anschluß aussehen könnte.
<?php

include_once "class.briefpapier.php";

class BriefpapierCustom extends Briefpapier {

  function __construct(&$app)
  {
    $this->app = $app;
    parent::__construct($app);
  } 
    
  public function renderItems()
  {

    $posWidth = $this->app->erp->Firmendaten("breite_position");
    $amWidth = $this->app->erp->Firmendaten("breite_menge");
    $itemNoWidth = $this->app->erp->Firmendaten("breite_nummer");
    
    ...
    ...
    ...
    
  }

} 
?>
Unterhalb von
if($item['ean']!="" && $item['ean']!="0"){
   if($item['desc']!=""){
      $item['desc']=$item['desc']."\r\n".$this->app->erp->Beschriftung("dokument_ean").": ".$item['ean'];
   }else{
      $item['desc']=$this->app->erp->Beschriftung("dokument_ean").": ".$item['ean'];
   }
}
wird nun die Größe, sowie die Höhe, Breite, Länge und Ursprungsregion des Artikels zur Variablen $item['desc'] hinzugefügt, da diese den Beschreibungstext beinhaltet und zu diesem die weiteren Werte hinzukommen sollen. Der fertige Abschnitt sieht dann so aus:
if($item['ean']!="" && $item['ean']!="0"){
   if($item['desc']!=""){
      $item['desc']=$item['desc']."\r\n".$this->app->erp->Beschriftung("dokument_ean").": ".$item['ean'];
   }else{
      $item['desc']=$this->app->erp->Beschriftung("dokument_ean").": ".$item['ean'];
   }
}

$daten = $this->app->DB->SelectArr("SELECT gewicht, laenge, breite, hoehe, ursprungsregion FROM artikel WHERE id = '".$item['artikel']."'");
$daten = reset($daten);

if($item['desc'] != ""){
   if($daten['gewicht'] != "" AND $daten['gewicht'] > 0){
      $item['desc'] = $item['desc']."\r\n"."Gewicht: ".$daten['gewicht']." kg";
   }          
}else{
   if($daten['gewicht'] != "" AND $daten['gewicht'] > 0){
      $item['desc'] = $item['desc']."Gewicht: ".$daten['gewicht']." kg";
   }
}

if($item['desc'] != ""){
   if($daten['laenge'] != "" AND $daten['laenge'] > 0){
      $item['desc'] = $item['desc']."\r\n"."Länge: ".$daten['laenge']." cm";
   }
}else{
   if($daten['laenge'] != "" AND $daten['laenge'] > 0){
      $item['desc'] = $item['desc']."Länge: ".$daten['laenge']." cm";
   }
}

if($item['desc'] != ""){
   if($daten['breite'] != "" AND $daten['breite'] > 0){
      $item['desc'] = $item['desc']."\r\n"."Breite: ".$daten['breite']." cm";
   }
}else{
   if($daten['breite'] != "" AND $daten['breite'] > 0){
      $item['desc'] = $item['desc']."Breite: ".$daten['breite']." cm";
   }
}
          
if($item['desc'] != ""){
   if($daten['hoehe'] != "" AND $daten['hoehe'] > 0){
      $item['desc'] = $item['desc']."\r\n"."Höhe: ".$daten['hoehe']." cm";
   }
}else{
   if($daten['hoehe'] != "" AND $daten['hoehe' > 0]){ 
      $item['desc'] = $item['desc']."Höhe: ".$daten['hoehe']." cm";
   }
}

$ursprungsregion = "";

switch($daten['ursprungsregion']){
   case "01":
      $ursprungsregion = "Schleswig-Holstein";
      break;
   case "02":
      $ursprungsregion = "Hamburg";
      break;
   case "03":
      $ursprungsregion = "Niedersachsen";
      break;
   case "04":
      $ursprungsregion = "Bremen";
      break;
   case "05":
      $ursprungsregion = "Nordrhein-Westfalen";
      break;
   case "06":
      $ursprungsregion = "Hessen";
      break;
   case "07":
      $ursprungsregion = "Rheinland-Pfalz";
      break;
   case "08":
      $ursprungsregion = "Baden-Württemberg";
      break;
   case "09":
      $ursprungsregion = "Bayern";
      break;
   case "10":
      $ursprungsregion = "Saarland";
      break;
   case "11":
      $ursprungsregion = "Berlin";
      break;
   case "12":
      $ursprungsregion = "Brandenburg";
      break;
   case "13":
      $ursprungsregion = "Mecklenburg-Vorpommern";
      break;
   case "14":
      $ursprungsregion = "Sachsen";
      break;
   case "15":
      $ursprungsregion = "Sachsen-Anhalt";
      break;
   case "16":
      $ursprungsregion = "Thüringen";
      break;
   case "99":
      $ursprungsregion = "ausländischer Ursprung";
      break;
}

if($item['desc'] != ""){
   if($ursprungsregion != ""){
      $item['desc'] = $item['desc']."\r\n"."Ursprungsregion: ".$ursprungsregion;
   }
}else{
   if($ursprungsregion != ""){
      $item['desc'] = $item['desc']."Ursprungsregion: ".$ursprungsregion;
   }
}  
Das Ergebnis sieht nun so aus: :entwickler:briefpapiernachher.png?nolink&700

Nur eine Belegart überladen

Desweiteren gibt es die Möglichkeit nur bestimmte Belege zu überladen. In folgendem Beispiel soll zur Artikelbeschreibung einer Position das nächste, also kleinste Mindesthaltbarkeitsdatum aus dem Lager für diesen Artikel auf einem Kommissionierschein angezeigt werden. Dazu muss der Lieferschein überladen werden, da der Kommissionierschein ebenfalls mit der class.lieferschein.php erstellt wird. Um die class.lieferschein.php Datei zu überladen, wird eine Datei namens class.lieferschein_custom.php erstellt und diese in den Xentralsordner nach www/lib/dokumente abgelegt. Bisher gibt es keine class.lieferschein_custom.php Datei, somit sieht der Kommissionierschein so aus: :entwickler:kommissionierscheinvorher.png?nolink&700 Das Grundgerüst der Datei sieht wie folgt aus:
<?php
if(!class_exists('BriefpapierCustom'))
{
  class BriefpapierCustom extends Briefpapier
  {
    
  }
}

class LieferscheinPDFCustom extends BriefpapierCustom {
  public $doctype;

  function __construct($app,$projekt="")
  {
    $this->app=&$app;
    //parent::Briefpapier();
    $this->doctype="lieferschein";
    $this->doctypeOrig="Lieferschein";
    parent::__construct($this->app,$projekt);
  } 

}
?>
Als nächstes sucht man die passende Funktion die man überladen möchte in der class.lieferschein.php. In diesem Fall ist es die Funktion GetLieferschein. Diese Funktion wird kopiert und unter dem Konstruktor __construct eingefügt. Da die Funktion GetLieferschein recht lang ist, wird hier nur angedeutet, wie die Datei derzeit aussieht:
<?php
if(!class_exists('BriefpapierCustom'))
{
  class BriefpapierCustom extends Briefpapier
  {
    
  }
}

class LieferscheinPDFCustom extends BriefpapierCustom {
  public $doctype;

  function __construct($app,$projekt="")
  {
    $this->app=&$app;
    //parent::Briefpapier();
    $this->doctype="lieferschein";
    $this->doctypeOrig="Lieferschein";
    parent::__construct($this->app,$projekt);
  } 
  
  function GetLieferschein($id,$info="",$extrafreitext="")
  {
    $this->doctypeid = $id;
    if(method_exists($this->app->erp,'LieferscheinSeriennummernberechnen'))$this->app->erp->LieferscheinSeriennummernberechnen($id);
    $briefpapier_bearbeiter_ausblenden = $this->app->erp->Firmendaten('briefpapier_bearbeiter_ausblenden');
    $briefpapier_vertrieb_ausblenden = $this->app->erp->Firmendaten('briefpapier_vertrieb_ausblenden');
    $adresse = $this->app->DB->Select("SELECT adresse FROM lieferschein WHERE id='$id' LIMIT 1");
    
    ...
    ...
    ...
    
  }

}
?>
Nun werden die Anpassungen im Code vorgenommen. Wenn man diese nun einfach hinzufügen würde, wären diese für Lieferscheine und Kommissionierscheine gültig. Allerdings sollen hier nur die Kommissionierscheine angepasst werden weshalb mit einem if Statement vorher geprüft wird, ob es sich um einen Kommissionierschein handelt. Die Änderungen werden unter
/*
  if(!empty($chargen)){
    foreach($chargen as $chargen=>$charge){
      $chargenliste = $chargenliste.$charge['charge'].";";
    }

    $chargenliste=substr($chargenliste, 0, -1);

    $value['chargen'] = $this->app->DB->Select("SELECT chargenverwaltung FROM artikel WHERE id='".$value[artikel]."' LIMIT 1");

    if($value['chargen']=="0"){
      $value['beschreibung'] = $value['beschreibung'];
    }else{
      $value['beschreibung'] = $value['beschreibung']."\r\n".$this->app->erp->Beschriftung("dokument_charge").": ". $chargenliste;
    }
  }
*/
hinzugefügt. Das Ganze sieht dann so aus:
if($info == "kommissionierschein"){
  if($value['freifeld1'] != ""){
    //$value['beschreibung'] .= "\r\n"."Bitte folgendes MHD wählen: ".$value['freifeld1'];
  }else{
    $mhd = $this->app->DB->Select("SELECT MIN(mhddatum) FROM lager_mindesthaltbarkeitsdatum WHERE artikel= '".$value['artikel']."' AND mhddatum > CURDATE()");
    $value['beschreibung'] .= "\r\n"."Kleinstes MHD im Lager: ".$mhd;
  }
}

Endergebnis: :entwickler:kommissionierscheinnachher.png?nolink&700

Adressdatenstammblatt überladen

Ebenso wie das Briefpapier können auch andere Dokumente überladen werden, wie z.B. das Adressstammblatt. Die Definitionen dafür finden sich in der Klasse AdressstammblattPDF in der Datei class.adressstammblatt.php im Ordner www/lib/dokumente. Zunächst wird die class.adressstammblatt_custom.php erstellt. Das Grundgerüst für das dafür sieht wie folgt aus:
<?php

include_once "class.adressstammblatt.php";

class AdressstammblattPDFCustom extends AdressstammblattPDF {

  function __construct($app,$projekt="")
  {
    $this->app=$app;
    $this->doctype="adresse";
    $this->doctypeOrig="Adressstammblatt";
    parent::__construct($this->app,$projekt);
  } 
} 
?>
Anschließend können zusätzliche Daten im Stammdatenblatt ausgegeben werden. Bitte orientieren Sie sich dazu an der Klasse AdressstammblattPDF und den beiden darin enthaltenen Funktionen renderDocument() und GetAdressstammblatt().
War der Artikel hilfreich?
Vielen Dank für Ihr Feedback!

Made with ❤ at zwetschke.de