php-overloads in 4.5.1.1 - GXModules - steh wieder auf dem Schlauch...

Thema wurde von markus_wick, 22. Januar 2022 erstellt.

  1. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Und noch mal ich....
    Vieles klingt immer so easy, geht dann aber augenscheinlich doch nicht einfach so wie ich das dachte.

    Ich möchte die Datei /includes/modules/shipping/dp.php modifizieren (Gewichtsangabe raus). Ich hatte die Modifikation schon unter 3.14.3.0, lief bestens - aber direkt in die Datei geschrieben, nix overload oder so. Nun wollte ich das halbwegs updatesicher per Overload machen. Also als erster Test: Originaldatei modifiziert, das was ich vorhabe würde gehen, passt. Originaldatei wieder auf Ursprung zurück gesetzt.
    Originaldatei dupliziert, Modifikation reingeschrieben und hier abgelegt:

    GXModules/realrecyclers/eigene_mods/Shop/Overloads/includes/modules/shipping/dp.php

    geht nicht, bzw: Sobald die Datei da ist, wird die Warenkorbseite nicht mehr angezeigt (was interessant ist, da die Datei den Warenkorb gar nicht modifiziert sondern die Anzeige einen Schritt später bei der Kasse). Deaktiviere ich die Datei (.old angehängt) geht der Warenkorb wieder normal, aber natürlich alles ohne Änderung. Auch wenn ich die Datei ablege unter

    GXModules/realrecyclers/eigene_mods/Shop/Overloads/dp.php

    das selbe Verhalten.

    Was mache ich falsch?
     
  2. Moritz (Gambio)
    Moritz (Gambio) Administrator
    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.694
    Danke vergeben:
    903
    Ein Overload muss in einem Ordner liegen, der so heißt, wie die zu überladene Klasse, in deinem Fall dp (Auch wenn die Klasse dp_ORIGIN heißt, _ORIGIN ist ein Sonderfall und wird weggelassen). Dein Overload hat dann einen anderen Klassennamen, den du frei wählen kannst, z. B. noWeightDisplayDp.

    GXModules/realrecyclers/eigene_mods/Shop/Overloads/dp/noWeightDisplayDp.inc.php

    Die Datei hat dann folgenden Inhalt
    PHP:
    class noWeightDisplayDp extends noWeightDisplayDp_parent
    {
    // Methoden, die du überladen willst.
    }
    Die Doku dazu: https://developers.gambio.de/tutori...ern-bestehender-php-klassen#Class-Overloading
     
  3. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Danke Moritz - ach du liebe Güte, ist ja komplizierter als ich dachte... Ich dachte es wird einfach statt der Orginal-Datei die Datei genutzt die im Overload-Verzeichnis liegt... Da muss ich mich doch wohl oder übel noch mit Begriffen wie "Klasse","Methode" etc. beschäftigen...
     
  4. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Hmmm... Irgendwie klappts noch nicht.... Warenkorb bleibt wieder weiss/leer...

    Also (ich habs jetzt mit dem dpd.php probiert, nicht dp.php).

    Ich habe die Orginal dpd.php dupliziert.
    Name der Datei nun: dpd_mod.php
    Das heisst, das ist erst mal nur eine umbenannte Kopie der Originaldatei.
    Zusätzlich zu meiner Modifikation (ich habe einfach mal das ' x ' vor der Gewichtsangabe zu einem 'xxx' gemacht um zu sehen ob die drei xxxe angezeigt werden).
    Abgelegt unter
    GXModules/realrecyclers/eigene_mods/Shop/Overloads/dpd/dpd_mod.php

    Hab ich nun da stehen:

    Code:
    <?php
    
    class dpd_mod extends dpd
    {
        var $code, $title, $description, $enabled, $num_zones;
     
    ((…….. für forum-post weggelassen……))
     
                        $shipping_method = MODULE_SHIPPING_DPD_TEXT_WAY . ' ' . $dest_country . ': (' . $shipping_num_boxes
                                           . ' xxx ' . $shipping_weight . ' ' .
    
    ((…….. für forum-post weggelassen……))
    
    }
    
    MainFactory::load_origin_class('dpd');
    
    Oder ist die komplette Übernahme des Inhaltes der Originaldatei falsch?
    Du hast geschrieben:
    Was bedeutet das dann für die modifizierte Datei?
    Es gibt dort die Bereiche:
    Code:
    /**
         * class constructor
         */
    public function __construct()
        {
           ....
        }
    
    und

    Code:
    /**
         * class methods
         */
        function quote($method = '')
        {
    }
    (in letzterem stecken aber noch mehr Funktionen wie function check(), function install(), function remove(), function keys()

    Der Teil den ich modifizieren will, steckt innerhalb der Funktion function quote($method = '')

    Was genau muss ich dann zwischen
    Code:
    <?php
    
    class dpd_mod extends dpd
    {
        var $code, $title, $description, $enabled, $num_zones;
    
    ......
    
    }
    
    packen damit ich die eine Zeile
    Code:
    $shipping_method = MODULE_SHIPPING_DPD_TEXT_WAY . ' ' . $dest_country . ': (' . $shipping_num_boxes
                                           . ' xxx ' . $shipping_weight . ' ' .
    die sich innerhalb der Funktion
    function quote($method = '')
    {

    befindet modifizieren kann?

    Sorry wenn ich so doof frage, aber das ist für mich schlicht neu und ich würde es gerne verstehen.
     
  5. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Ah, jetzt habe ich mal einiges in der modifizierten Datei weggelassen!

    Jetzt steht da:

    Code:
    <?php
    
    class dpd_mod extends dpd_ORIGIN
    {
          
        /**
         * class methods
         */
        function quote($method = '')
        {
    (.................... incl. meiner Modifikation)
    
    return $keys;
        }
    }
    Also ich habe am Anfang weggelassen:

    Code:
     var $code, $title, $description, $enabled, $num_zones;
      
      
        /**
         * class constructor
         */
        public function __construct()
        {
    (........)
    }
    und am Ende weggelassen:

    Code:
    MainFactory::load_origin_class('dpd');
    
    Jetzt scheint es zu gehen.

    Ich habe also den gesamten Bereich der nach * class methods steht drin, alles andere nicht. Passt das so oder ist das noch zu blauäugig?
     
  6. Moritz (Gambio)
    Moritz (Gambio) Administrator
    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.694
    Danke vergeben:
    903
    Ne, du hast es jetzt zwar geschafft, aber so solltest du es nicht machen. So sollte es sein:

    GXModules/realrecyclers/eigene_mods/Shop/Overloads/dpd/dpd_mod.php
    PHP:
    <?php

    class dpd_mod extends dpd_mod_parent
    {
        public function 
    quote($method '')
        {
            
    // Original-Methode ausführen
            
    $this->quotes parent::quote($method)
          
            
    // Ergebnis nachträglich manipulieren
            
    $this->quotes['methods']['title'] .= ' Textergänzung';
          
            return 
    $this->quotes;
        }
    }
    Es kann manchmal notwendig sein den Modulcache zu leeren.
     
  7. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    o_O
    Erst mal Danke für Deine Geduld!!!!
    Vielleicht hätte ich vorausschicken sollen, dass ich eigentlich Innenarchitekt bin, wenngleich nicht völlig unbeleckt im programmieren - aber komplett naiv was php angeht....

    Deswegen verzeih mir wenn das was ich noch alles fragen werde recht... quarkig erscheint... ich versuche mich ranzutasten und zu verstehen was ich da tue. Deswegen: Danke für die Nachhilfe :) Ich hatte auch kurz überlegt ob ich nicht einfach, wie bislang unter 3.14.3.0 erfolgreich geschehen, die Originaldatei im includes Ordner modifiziere. Das ist in einer Minute geschehen, funktioniert und gut ists. Aber: Ich habe nunmal den Ehrgeiz, das Ganze auf die korrekte Art und Weise lösen zu wollen.... Hält das Hirn geschmeidig.

    So, ich fasse mal zusammen (ohne das jetzt schon korrekt umsetzen zu können):
    1) Mein Ansatz, überhaupt irgendwelchen Inhalt der Originaldatei in die dpd_mod.php übernehmen zu wollen ist nicht richtig.
    2) Die Originaldatei macht ganz einfach was sie macht.
    3) Ich führe dann mit der Overload-Datei die Originaldatei bzw. deren Funktion quasi noch mal aus und modifiziere dann das Ergebnis.

    Ich fürchte, das ist mir mit meinen Nicht-Kenntnissen zu kompliziert... Mir is ja schon die Zeile " $this->quotes['methods']['title'] .= ' Textergänzung';" suspekt.
    Was kommt statt "methods", was kommt statt "title" in die Zeile?
    Und wie manipuliere ich das Ganze, damit das Gewicht nicht auftaucht obwohl es ja schon drin ist?

    Denn das was die Funktion da zurückgibt beinhaltet ja Dinge, zu deren Modifikation ich nicht fähig bin wenn mir schon der korrekte php-Syntax nicht geläufig ist, das habe ich mir einfacher vorgestellt.

    Ich wollte ja eigentlich nur eines erreichen, da sollte nicht stehen:

    DHL Paket (4,99 EUR) Versand nach: DE: (1 x 1.001 kg)

    Sondern nur:

    DHL Paket (4,99 EUR) Versand nach: DE

    Ich denke, ich mache das wieder in der Originaldatei, da gehts einfach. Und nach jedem Update sehe ich mal nach, obs noch da ist. Und wenn nicht, schreib ich´s wieder rein....

    :(Deprimiert mich zwar ein wenig, dass ich das nicht so hinbekomme wie es eigentlich sein müsste (Overload), aber man muss ja nicht alles können...
     
  8. barbara
    barbara G-WARD 2014-2020
    Registriert seit:
    14. August 2011
    Beiträge:
    35.657
    Danke erhalten:
    11.371
    Danke vergeben:
    1.616
    Erstelle dir doch einen Klon, den du z.b. dp-2 nennst. (Muss Inder Datei überall geändert werden) dann hast du bei Updates nicht das Problem, das es einfach überschrieben wird.
     
  9. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Im Liveshop passt ja auch alles, der läuft noch unter 3.14.3.0, dort habe ich es direkt in der Originaldatei erledigt, geht schnell und unkompliziert.

    Im Testshop, den ich jetzt auf 4.5.1.1 upgedated habe wollte ich es mit dem Overload versuchen - aber ich passe.... Ich komme zwar mit html recht gut zu Rande, hab mir eine recht große WaWi incl. Buchhaltung und Shopanbindung per REST-API programmiert - aber php erschliesst sich mir halt gar nicht....

    Deshalb, bevor ich mich quäle und dann doch nach jedem Update das Ganze prüfen muss: Ich änder die Originale, sauber dokumentiert, und feddich is die Laube.
     
  10. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Hatte ich auch kurz überlegt. Aber wenn sich dann mal was grundsätzliches ändert, funktiert der klon vielleicht auch niocht mehr und dann hab ich den Salat.
     
  11. Anonymous
    Anonymous Administrator
    Mitarbeiter
    Registriert seit:
    26. April 2011
    Beiträge:
    1.954
    Danke erhalten:
    1.588
    Danke vergeben:
    339
    @markus_wick
    @Devil

    Hier das ganze mal als Modul, was bei allen Versandmodulen im Bestellvorgang die Gewichtsangabe entfernt. Dateien im Shop entpacken, Modulcache und Seitencache leeren, Modul im Modul-Center installieren. Eventuell erneut den Cache leeren nach der Installation. Kompatibel sollte das Modul mit Shopversion 3.9 bis 4.5.1.1 sein.
     

    Anhänge:

  12. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Ich habs meiner Frau vorgelesen, die hat mich nur angesehen als hätte ich Drogen genommen...

    Danke Till, so was kann ich nicht. Macht aber auch nix.
     
  13. Christian Mueller
    Christian Mueller Beta-Held
    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.824
    Danke erhalten:
    981
    Danke vergeben:
    312
    Du kannst die Dateien nicht an den in der Zip-Datei angegebenen Ort kopieren und den Cache leeren?
     
  14. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Oh, das kann ich sehr wohl.
    Aber wenn Du den Thread aufmerksam verfolgt hast, war mein Plan, den Vorgang des Overloads (also der Programmierung des selben) selbst zu erledigen - da dachte ich noch blauäugigerweise, dass ich das schon hinbekomme. Als dann Till freundlicherweise die Programmierung mal so nebenher aus dem Handgelenk geschüttelt hat und ich mir das angesehen habe was er da in der .php so macht bin ich erst mal etwas.... erschrocken.
    Eine Zip-Datei eintpacken und die Dateien hochladen nebst Cache leeren bekomme ich so grade mal hin ohne danach Urlaub nehmen zu müssen. Aber als php Overload mit der Aufgabe, bei der Ausgabe der Versandarten einfach nur die Gewichtsangebe wegzulassen dies hier zu programmieren:

    Code:
    class NoShippingWeightInCheckout extends NoShippingWeightInCheckout_parent
    {
        public function quote($method = '', $module = '')
        {
            $quotes_array = parent::quote($method,$module);
            foreach ($quotes_array as $a => $modules) {
                foreach ($modules['methods'] as $i=>$module) {
                    if (preg_match("/(.*):.*\((.*)\)/", $module['title'], $titleArray)) {
                        $title                                    = $titleArray[1];
                        $quotes_array[$a]['methods'][$i]['title'] = trim($title);
                    }
                }
            }
            return $quotes_array;
        }
    }
    ... das traue ich mir absolut überhaupt garnicht zu. Vor allem das

    if (preg_match("/(.*):.*\((.*)\)/", $module['title'], $titleArray)) {$title= $titleArray[1];$quotes_array[$a]['methods'][$i]['title'] = trim($title);

    hat mich eher ratlos zurückgelassen....
     
  15. Christian Mueller
    Christian Mueller Beta-Held
    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.824
    Danke erhalten:
    981
    Danke vergeben:
    312
    Das war nicht ganz klar, daß sich das darauf bezog, weil Du die Anleitung zur Installation kommentiert hattest.

    Ja, Regular Expressions sind mächtig und können Angst machen. Ich fange da auch jedes Mal wieder neu an mir die Funktionen zu vergegenwärtigen.
     
  16. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Ich hatte eigentlich die Hoffnung, das geht ähnlich wie bei den SmartyBlocks. Dass statt der Originaldatei dann eben die selbs-bearbeitete Version im GXModules Ordner genutzt wird. Dass es aber notwendig ist, quasi das Ergebnis der Oirginaldatei zu nehmen und dann zu manipulieren überfordert mich... Wenn es nur darum ginge, an das Ergebnis was dranzuhängen - das hätte ich vielleicht noch hinbekommen. Aber php-Manipulationen in einem Array sind für jemandem der noch gar keine Ahnung vom Syntax hat einfach zu viel... Im Grunde glaube ich es ja richtig zu interpretieren: Till löscht alles zwischen den Klammern incl. der Klammern, falls solche da sind. Aber hier gilt: Schuster bleib bei deinen Leisten...
     
  17. Anonymous
    Anonymous Erfahrener Benutzer
    Mitarbeiter
    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.749
    Danke vergeben:
    137
    Reguläre Ausdrücke zu erklären, würde hier echt jeden Rahmen sprengen. Aber für den konkreten Einzelfall hilft eventuell schon dies: https://regex101.com/r/g9Wxim/1
     
  18. markus_wick
    markus_wick Erfahrener Benutzer
    Registriert seit:
    10. Oktober 2018
    Beiträge:
    982
    Danke erhalten:
    222
    Danke vergeben:
    156
    Das würde ich auch nicht erwarten, Marco. Ich war schon happy dass Till da was programmiert hat. Danke für den Link!
     
  19. Moritz (Gambio)
    Moritz (Gambio) Administrator
    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.694
    Danke vergeben:
    903
    Es geht auch komplettes Ersetzen statt nachträglicher Ergänzung, es ist nur die am wenigsten elegante Lösung die auch am meisten Potenzial hat mit etwaigen weiteren Overloads derselben Klasse zu kollidieren. Daher hatten Till und ich das erst gar nicht weiter erwähnt.
     
  20. Anonymous
    Anonymous Erfahrener Benutzer
    Mitarbeiter
    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.749
    Danke vergeben:
    137
    Außerdem hebelt man damit jedwede Wirkung von Updates aus. Wenn man beim Ersetzen eine minimal angepasste Kopie der Originaldatei verwendet, zementiert man genau diesen Zustand; das kann gewünscht sein, ist es in aller Regel aber nicht.