Klassen überladen

Fragen Rund um den Quelltext.
Florian
Beiträge: 0
Registriert: Mo 15. Mai 2017, 17:05

Klassen überladen

Beitragvon Florian » Mo 26. Feb 2018, 12:37

Zum Anpassen von WaWision, lassen sich Klassen bzw. deren Methoden gemäß der Beschreibung im Online-Handbuch überladen, die zu überladenen Klassen sind derzeit jedoch begrenzt. Je nach Anforderungen müssen aber auch andere Klassen/Methoden überladen werden, bei denen der beschriebene Ansatz nicht greift, wie z.B. die YUI-Klasse (./phpwf/plugins/class.yui.php). Bei Verwendung der OS-Version lässt sich der Quellcode dort natürlich direkt anpassen, passt man den Quellcode über die .src.php-Dateien bei Nicht-OS-Versionen an, geht dabei ggf. Quellcode und Funktionalität der Nicht-OS-Version verloren. Zudem ist dieser Ansatz unabhängig von der verwendeten Version nicht update-sicher, so dass die Anpassungen nach einem Update verloren gehen. Um dies zu vermeiden, kann man folgenden Ansatz wählen, hier am Beispiel der YUI-Klasse:

Datei "class.yui_custom.php" erstellen, darin eine YUICustom-Klasse definieren und damit die YUI-Klasse erweitern:

Code: Alles auswählen

class YUICustom extends YUI {

  function __construct(&$app) {
    parent::__construct($app);
  }

}
Wenn nicht bereits vorhanden, die erpAPI-Klasse erweitern.

In der erpAPICustom-Klasse dann eine YUICustom-Methode zum Nachladen der angepassten Klasse definieren und das entsprechende Objekt überschreiben.

Code: Alles auswählen

  function YUICustom()
  {
    $customfile = '../phpwf/plugins/class.yui_custom.php';
    if (file_exists($customfile)) {
      include_once($customfile);
      if (class_exists('YUICustom')) $this->app->YUI = new YUICustom($this->app);
    }
  }
Diese in der Konstruktor-Methode aufrufen.

Code: Alles auswählen

class erpAPICustom extends erpAPI
{
  var $commonreadonly = 0;

  function __construct(&$app)
  {
    $this->app = $app;
    parent::__construct($app);
    $this->YUICustom();
Nun kann man in der YUICustom-Klasse beliebige Methoden der YUI-Klasse überladen oder diese Erweitern. In meine Fall habe ich somit z.B. die TableSearch-Methode angepasst.

Beste Grüße
Florian

Florian
Beiträge: 0
Registriert: Mo 15. Mai 2017, 17:05

Re: Klassen überladen

Beitragvon Florian » Mi 28. Feb 2018, 16:47

Nachtrag: Wird eine Methode die Quellcode aus einer Nicht-OS-Version enthält, komplett mit eigenem Quellcode oder dem aus der OS-Version (*.src.php) überschrieben, geht die Funktion natürlich auch verloren. Zum Ausführen der Funktionalität aus der Nicht-OS-Version, muss dann je nach Anforderung vor oder nach den gewünschten Anpassungen, die Methode der Elternklasse über "parent::NameDerMethode()" aufgerufen werden. In den meisten Fällen lassen sich somit die gewünschten Anpassungen bewerkstelligen.

Für zukünftige Versionen wäre eine striktere Abtrennung von Quellcode der OS- und Nicht-OS-Versionen sinnvoll, um derartige Probleme beim Anpassen zu vermeiden.

Beste Grüße
Florian

sauterbe
Administrator
Beiträge: 6
Registriert: Mi 31. Dez 2014, 14:34

Re: Klassen überladen

Beitragvon sauterbe » Mi 28. Feb 2018, 18:22

super danke / ja genau

Nico
Beiträge: 0
Registriert: Di 28. Nov 2017, 15:22

Re: Klassen überladen

Beitragvon Nico » Do 19. Apr 2018, 11:24

Gibt es denn auch eine Möglichkeit die Klasse widgets/_gen/widget.gen.rechnung.php zu überladen?

Hatte in der Open-Source Version die Rechnungsform angepasst. Nun habe ich nach dieser Anleitung versucht die widget.gen.rechnung.php Klasse in der Pro-Version zu überladen. Bekomme aber dann folgenden Fehler:
PHP Fatal error: Uncaught Error: Call to a member function CreateNew() on null in Zeile: $this->form = $this->app->FormHandler->CreateNew("rechnung"); da er anscheinend den FormHandler nicht kennt.

Vielleicht mache ich auch einfach nur was falsch :roll:
Folgende Änderungen habe ich gemacht:

Code: Alles auswählen

class erpAPICustom extends erpAPI {

    var $commonreadonly = 0;

    function __construct(&$app) {

        $this->app = $app;
        parent::__construct($app);
        $this->WidgetGenRechnungCustom();
    }

    function WidgetGenRechnungCustom() {
        $customfile = 'widgets/_gen/widget.gen.rechnung_custom.php';
        if (file_exists($customfile)) {
            include_once($customfile);
        }
    }

}

Code: Alles auswählen

include_once 'widgets/_gen/widget.gen.rechnung.php';
class WidgetGenrechnungCustom extends WidgetGenrechnung
{

  public function __construct($app,$parsetarget)
  {  
        parent::__construct($app, $parsetarget);
  }
  
  function Form()
  {
    $this->form = $this->app->FormHandler->CreateNew("rechnung");
    $this->form->UseTable("rechnung");
    $this->form->UseTemplate("rechnungCustom.tpl",$this->parsetarget);  //Setzen des angepassten Templates
    .
    .
    .
  }
VG
Nico

Florian
Beiträge: 0
Registriert: Mo 15. Mai 2017, 17:05

Re: Klassen überladen

Beitragvon Florian » Do 19. Apr 2018, 14:52

Hallo Nico,

die Widgets können überladen werden in dem Du innerhalb von "./www/widgets/" eine entsprechende Datei mit dem Zusatz "_custom" ablegst z.B. "widget.rechnung_custom.php", die Datei des zu überladenen Widgets bzw. der Klasse z.B. "widget.rechnung.php" includierst. Dann gemäß der Namenskonvention eine Klasse mit dem Zusatz "Custom" des zu überladenen Widgets bzw. der Klasse definieren z..B. "WidgetRechnungCustom". Zusammengefasst also:

Code: Alles auswählen

include_once ('widget.rechnung.php');
class WidgetRechnungCustom extends WidgetRechnung
{

  public function __construct($app,$parsetarget)
  {  
        parent::__construct($app, $parsetarget);
  }
    .
    .
    .
  }
In der Klasse "erpAPICustom" musst bzw. kannst Du nach meiner Ansicht hinsichtlich der Widgets nichts weiter sinnvolles machen, weil diese dynamisch bei Bedarf nachgeladen werden und nicht wie die Template- und YUI-Klasse als immer als Eigenschaft der App-Klasse.

Für die über die Widgets erzeugten Formulare und deren Verarbeitung ist die FormHandlerField-Klasse "./phpwf/plugins/class.formhandler(.src).php" verantwortlich (Eigenschaft "$this->form" des Widgets), die wiederum mit den Klassen der Object-API unter "./www/objectapi/mysql/" bzw. "./www/objectapi/mysql/_gen/" zusammenarbeitet. Wenn Du die Widgets bzw. die generierten Formulare hinsichtlich der zusätzlichen Erfassung von Daten anpassen willst, musst Du zwangsläufig auch die Klassen der Object-API anfassen. Die lassen sich aber bisher noch nicht nach dem gängigen Schema überladen. Zumindest nach dem Stand meiner letzten Quellcode-Analyse der Version 18.1. Da Wawision hier aber bisher fast ausschließlich nur die generierten Klassen unter "./www/objectapi/mysql/_gen/" verwendet, könntest Du diese unter "./www/objectapi/mysql/" überladen. Diese Dateien könnten dann aber zukünftig überschrieben werden, wenn bei einem Update entsprechende Anpassungen installiert werden. Bisher ist das wohl nur bei der "object.shopexport.php" der Fall. Besser wäre es natürlich die Methode "Get" der "ObjectAPI" Klasse hinsichtlich der "_custom" Namenserweiterung anzupassen und die spezifischen ObjectAPI-Klassen überall im Quellcode über die Mtehode zu laden.

Beste Grüße
Florian

Nico
Beiträge: 0
Registriert: Di 28. Nov 2017, 15:22

Re: Klassen überladen

Beitragvon Nico » Do 19. Apr 2018, 15:21

Wunderbar. Funktioniert :) Hast mir echt weitergeholfen.

Vielen Dank
Nico

Nico
Beiträge: 0
Registriert: Di 28. Nov 2017, 15:22

Re: Klassen überladen

Beitragvon Nico » Di 24. Apr 2018, 11:07

Hätte doch noch eine Nachfrage:

Ich möchte nun die Felder, die ich im Formular hinzugefügt habe in der Datenbank abspeichern.

Dazu habe ich unter "objectapi/mysql/" die Klasse "object.rechnung_custom" erzeugt und der Inhalt sieht wie folgt aus:

Code: Alles auswählen

include_once('_gen/object.gen.rechnung.php');

class ObjRechnungCustom extends ObjGenRechnung {

    public function Update() {
        error_log("Update");
        parent::Update(); 
    }
}
Also im Grunde genauso wie die bereits existierende "object.shopexport". Allerdings wird die Updatefunktion beim Speichern nicht aufgerufen, da ich im Error-Log auch nix erhalte.
Woran könnte das liegen?

Nico
Beiträge: 0
Registriert: Di 28. Nov 2017, 15:22

Re: Klassen überladen

Beitragvon Nico » Mi 2. Mai 2018, 16:51

Hat sich erledigt. Man muss die neue File genauso nennen, wie die parent (also bei mir objectapi/mysql/object.rechnung.php) und die Klasse muss auch so heißen ("ObjRechnung" und nicht "ObjRechnungCustom") .

Nico
Beiträge: 0
Registriert: Di 28. Nov 2017, 15:22

Re: Klassen überladen

Beitragvon Nico » Mo 30. Jul 2018, 17:40

Ich hätte da ein neues Problem.

Ich habe das Lager-Modul überladen. Nun funktioniert das Umlagern von Seriennummern aber nicht mehr, da man einzelne Seriennummern nicht mehr auswählen kann.

Ich nehme mal an, dass es daran liegt, da man bei der LagerCustom den Code von der Opensouce nimmt und dort keine Seriennummern vorgesehen sind. Es funktioniert nämlich schon nicht, wenn man keine Änderungen in der LagerCustom vornimmt.

Gibt es da eine andere Möglichkeit oder habe ich was übersehen?

VG
Nico

sauterbe
Administrator
Beiträge: 6
Registriert: Mi 31. Dez 2014, 14:34

Re: Klassen überladen

Beitragvon sauterbe » Mi 1. Aug 2018, 22:14

das kann sein / ab 18.3 ist auch in der ENT oder PRO der Quelltext zur originalen Version vorhanden