Teil 1 "ClassOverloading" aus der Serie "updatesichere Anpassungen in GX2"

Thema wurde von Nonito (Gambio), 31. Januar 2012 erstellt.

  1. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.730
    Danke erhalten:
    10.491
    Danke vergeben:
    1.500
    Kann ich, ähnlich wie bei den Templates, die ganze Seite unter user_classes/overloads/ordner/... abspeichern, oder nur einzelne Codes?
    Woran sehe ich ob ein Script in user_classes/overloads, oder Extender, oder conf gespeichert werden muss?


    P.S. sollte es nicht einen Teil 5 geben?
     
  2. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.139
    Danke erhalten:
    1.461
    Danke vergeben:
    449
    Beruf:
    Systemadmin, Webentwickler bei Reifen24.de
    Ort:
    PhpStorm
    #22 Steffen (indiv-style.de), 7. August 2012
    Zuletzt bearbeitet: 7. August 2012
    Kann ich die Klasse order_total überladen?

    Ich habs so probiert aber da kommt ne Fehlermeldung:

    Fatal error: Cannot redeclare class ot_cod_fee_ORIGIN in /srv/www/01-reifen24.de/htdocs/includes/modules/order_total/ot_cod_fee.php on line 35

    PHP:
    <?php

    class onepage_order_total extends onepage_order_total_parent {
            var 
    $modules;
            function 
    order_total_ORIGIN() {
            if (
    defined('MODULE_ORDER_TOTAL_INSTALLED') && xtc_not_null(MODULE_ORDER_TOTAL_INSTALLED)) {
                
    $this->modules explode(';'MODULE_ORDER_TOTAL_INSTALLED);
                
    $modules $this->modules;
                
    sort($modules); // cgoenner: we need to include the ot_coupon & ot_gv BEFORE ot_tax
                
    reset($modules);
                while (list (, 
    $value) = each($modules)) {
                    include_once (
    DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value);
                    include_once (
    DIR_WS_MODULES.'order_total/'.$value);

                    
    $class substr($value0strrpos($value'.'));
                    
    $GLOBALS[$class] = new $class ();
                }
                unset(
    $modules);
            }
        }
    }


    ?>
    ich will das:

    include (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value);
    include (DIR_WS_MODULES.'order_total/'.$value);

    in das updatessicher machen:

    include_once (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value);
    include_once (DIR_WS_MODULES.'order_total/'.$value);
     
  3. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Sicher dat....

    Das ist eigentlich schon updatesicher....

    Warum also das überladen?

    Es gibt aber definitiv ein Problem:

    PHP:
    function order_total_ORIGIN()
    ist natürlich falsch, und muss

    PHP:
    function onepage_order_total()
    sein, damit die Funktion bei Aktivierung der Klasse ausgeführt wird....

    Hier wird das zwar nicht verwendet, weil die komplette Routine ersetzt werden soll.

    Wenn man aber den Konstruktor einer "ORIGIN"-Klasse nur ergänzen will, ist Vorsicht angesagt...

    PHP:
    parent::order_total_ORIGIN();
    wird zwar funktionieren, aber man verhindert damit die Mehrfachüberladung, da man direkt den Konstruktor der Parent-Klasse aufruft.

    Was also tun?

    Hat mich einige Zeit gekostet, bis ich das kapiert hatte:

    PHP:
    parent::__construct();
    tut den Dienst!
     
  4. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.139
    Danke erhalten:
    1.461
    Danke vergeben:
    449
    Beruf:
    Systemadmin, Webentwickler bei Reifen24.de
    Ort:
    PhpStorm
    Die Änderungen von include zu include_once sollen in der /includes/classes/order_total.php gemacht werden. Da funzt es auch, nur dachte ich mir wenn ein SP kommt der diese order_total.php überschreibt isses schlecht. Deswegen das mit den user_classes

    Ich habe parent::order_total_ORIGIN(); und parent::__construct(); getestet! CHACHE GELÖSCHT!!!! und leider ist diese Fehlermeldung immer noch.
     
  5. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    PHP:
    function onepage_order_total()
     
  6. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.139
    Danke erhalten:
    1.461
    Danke vergeben:
    449
    Beruf:
    Systemadmin, Webentwickler bei Reifen24.de
    Ort:
    PhpStorm
    negativ! So sieht das im Moment aus:

    PHP:
    <?php

    class onepage_order_total extends onepage_order_total_parent {
            
        function 
    onepage_order_total() {
            
    parent::__construct();
            if (
    defined('MODULE_ORDER_TOTAL_INSTALLED') && xtc_not_null(MODULE_ORDER_TOTAL_INSTALLED)) {
                
    $this->modules explode(';'MODULE_ORDER_TOTAL_INSTALLED);
                
    $modules $this->modules;
                
    sort($modules); // cgoenner: we need to include the ot_coupon & ot_gv BEFORE ot_tax
                
    reset($modules);
                while (list (, 
    $value) = each($modules)) {
                    include_once (
    DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value);
                    include_once (
    DIR_WS_MODULES.'order_total/'.$value);

                    
    $class substr($value0strrpos($value'.'));
                    
    $GLOBALS[$class] = new $class ();
                }
                unset(
    $modules);
            }
        }
    }


    ?>
     
  7. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    PHP:
    parent::__construct();
    muss 'raus, da Du ja sonst diese Routine 2 mal ausführst.

    Du ersetzt ja den Kontruktor...

    Aber ich verstehe immer noch nicht, was Du Dir davon versprichst, statt "include" "include_once" zu verwenden....

    m.E. kannst Du Dir das Überladen komplett sparen, weil der Konstruktor der "order_total"-Klasse ja nur einmal aufgerufen wird...
     
  8. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.139
    Danke erhalten:
    1.461
    Danke vergeben:
    449
    Beruf:
    Systemadmin, Webentwickler bei Reifen24.de
    Ort:
    PhpStorm
    DANKE SUPPI, es funzt!

    Sinn ist es, für den OnePage-Checkout alles soweit updatessicher zu machen. Da steht in der Einbauanleitung volgendes drin:

    suche:
    include (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value);
    include (DIR_WS_MODULES.'order_total/'.$value);

    ersetze mit:
    include_once (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value);
    include_once (DIR_WS_MODULES.'order_total/'.$value);


    So, und jetzt dachte ich mir, diese Änderungen mit dem Überladen machen. Tick ich da falsch oder hab ich das im Grund falsch im Kopf!?!?!
     
  9. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Das ist m.E. völlig sinnfrei, vergiss das einfach....

    Oder frage den Autor, was er damit erreichen will....
     
  10. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.139
    Danke erhalten:
    1.461
    Danke vergeben:
    449
    Beruf:
    Systemadmin, Webentwickler bei Reifen24.de
    Ort:
    PhpStorm
    Das werd ich tun!
     
  11. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.139
    Danke erhalten:
    1.461
    Danke vergeben:
    449
    Beruf:
    Systemadmin, Webentwickler bei Reifen24.de
    Ort:
    PhpStorm
    Gibt es irgendwo eine Liste, welche Klassen überladen werden können? Scheint ja noch nicht überall zu funktionieren.
     
  12. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Man kann alle Klassen überladen, außer einigen Zahlungsklassen von Drittanbietern.

    Das sind alle Gambio-Klassen, und auch alte Klassen (z.B. "products", aber auch "Smarty" und Zahlungs- und Versand-Klassen), die das Anhängsel "_ORIGIN" im Klassennamen haben...

    Der ganze Admin-Bereich ist leider nicht so ohne weiteres im Zugriff....

    Über mein "USERMOD"-Konzept (http://www.gambio-forum.de/threads/...n-PHP-Programmen?p=38698&viewfull=1#post38698) kann ich mir das aber auch ermöglichen, ich habe mir so z.B. die "order"-Klasse überladen....
     
  13. HolgerNils (xycons.de)

    HolgerNils (xycons.de) G-WARD 2013/2014

    Registriert seit:
    29. Oktober 2011
    Beiträge:
    1.959
    Danke erhalten:
    449
    Danke vergeben:
    367
    #33 HolgerNils (xycons.de), 17. September 2012
    Zuletzt bearbeitet: 17. September 2012
    Nonito, Avenger,...? Was mach ich noch falsch? Ich bitte um eine kleine Hilfe ;-)
    Habe folgende Datei angelegt:
    /user_classes/overloads/AddressBookContentView/Packstation_AddressBookContentView.inc.php

    Mit folgendem Inhalt:
    Code:
    <?php
    /* --------------------------------------------------------------
       AddressBookContentView.inc.php 2010-10-07 gambio
       Gambio GmbH
       http://www.gambio.de
       Copyright (c) 2010 Gambio GmbH
       Released under the GNU General Public License (Version 2)
       [http://www.gnu.org/licenses/gpl-2.0.html]
       --------------------------------------------------------------
    
    
       based on:
       (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
       (c) 2002-2003 osCommerce(address_book.php,v 1.57 2003/05/29); www.oscommerce.com
       (c) 2003     nextcommerce (address_book.php,v 1.14 2003/08/17); www.nextcommerce.org
       (c) 2003 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: address_book.php 867 2005-04-21 18:35:29Z mz $)
    
       Released under the GNU General Public License
       ---------------------------------------------------------------------------------------*/
    
    // include needed functions
    require_once (DIR_FS_INC.'xtc_address_label.inc.php');
    require_once (DIR_FS_INC.'xtc_get_country_name.inc.php');
    require_once (DIR_FS_INC.'xtc_count_customer_address_book_entries.inc.php');
    
    class Packstation_AddressBookContentView extends Packstation_AddressBookContentView_parent {
        
        function AddressBookContentView()
        {
            $this->set_content_template('module/address_book.html');
            $this->set_flat_assigns(true);
        }
    
        function get_html($p_coo_message_stack)
        {
            if($p_coo_message_stack->size('addressbook') > 0)
            {
                $this->set_content_data('error', $p_coo_message_stack->output('addressbook'));
            }    
            
            $this->set_content_data('ADDRESS_DEFAULT', xtc_address_label($_SESSION['customer_id'], $_SESSION['customer_default_address_id'], true, ' ', '<br />'));
    
            $addresses_data = array();
    //PkSt        $addresses_query = xtc_db_query("select address_book_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from ".TABLE_ADDRESS_BOOK." where customers_id = '".(int) $_SESSION['customer_id']."' order by firstname, lastname");
            $addresses_query = xtc_db_query("select address_book_id, entry_type_id as type_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from ".TABLE_ADDRESS_BOOK." where customers_id = '".(int) $_SESSION['customer_id']."' order by firstname, lastname");
            while ($addresses = xtc_db_fetch_array($addresses_query)) {
                $format_id = xtc_get_address_format_id($addresses['country_id']);
                if ($addresses['address_book_id'] == $_SESSION['customer_default_address_id']) {
                    $primary = 1;
                } else {
                    $primary = 0;
                }
    //PkSt
                if ($addresses['type_id'] == 'p') {
                    $packstation = 1;
                } else {
                    $packstation = 0;
                }
    //PkSt
                
                $addresses_data[] = array ('NAME' => $addresses['firstname'].' '.$addresses['lastname'],
                                            'BUTTON_EDIT' => '<a href="'.xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'edit='.$addresses['address_book_id'], 'SSL').'">'.xtc_image_button('small_edit.gif', SMALL_IMAGE_BUTTON_EDIT).'</a>',
                                            'BUTTON_DELETE' => '<a href="'.xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'delete='.$addresses['address_book_id'], 'SSL').'">'.xtc_image_button('small_delete.gif', SMALL_IMAGE_BUTTON_DELETE).'</a>',
                                            'ADDRESS' => xtc_address_format($format_id, $addresses, true, ' ', '<br />'),
                                            'PRIMARY' => $primary,
    //PkSt
                                            'PACKSTATION' => $packstation,
    //PkSt
                                            'BUTTON_EDIT_URL' => xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'edit='.$addresses['address_book_id'], 'SSL'),
                                            'BUTTON_DELETE_URL' => xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'delete='.$addresses['address_book_id'], 'SSL'));
    
            }
            $this->set_content_data('addresses_data', $addresses_data);
    
            $this->set_content_data('BUTTON_BACK', '<a href="'.xtc_href_link(FILENAME_ACCOUNT, '', 'SSL').'">'.xtc_image_button('button_back.gif', IMAGE_BUTTON_BACK).'</a>', 1);
            $this->set_content_data('BUTTON_BACK_LINK', xtc_href_link(FILENAME_ACCOUNT, '', 'SSL'));
    
            if(xtc_count_customer_address_book_entries() < MAX_ADDRESS_BOOK_ENTRIES)
            {
                $this->set_content_data('BUTTON_NEW', '<a href="'.xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, '', 'SSL').'">'.xtc_image_button('button_add_address.gif', IMAGE_BUTTON_ADD_ADDRESS).'</a>', 1);
                $this->set_content_data('BUTTON_NEW_URL',  xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, '', 'SSL'));
            }
    
            $this->set_content_data('ADDRESS_COUNT', sprintf(TEXT_MAXIMUM_ENTRIES, MAX_ADDRESS_BOOK_ENTRIES));
    
            $t_html_output = $this->build_html();
    
            return $t_html_output;
        }
    }
    ?>
    Aber erhalte folgende Meldung...
    Fatal error: Call to a member function size() on a non-object in /var/www/web1413/html/system/views/account/AddressBookContentView.inc.php on line 36

    Da steht folgendes:
    if($p_coo_message_stack->size('addressbook') > 0)
     
  14. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    $p_coo_message_stack scheint nicht initialisiert zu sein...

    PHP:
        function AddressBookContentView()     {
             
    $this->set_content_template('module/address_book.html');
             
    $this->set_flat_assigns(true);
         }
    brauchst Du übrigens nicht mit aufzunehmen, das ändert sich ja nicht....

    Du solltest auch ein
    PHP:
    $t_html_output=parent::get_html($p_coo_message_stack)
    in "function get_html($p_coo_message_stack)" mit aufnehmen, weil sonst die Überladungskette unterbrochen wird, und sonst niemand mehr das Ding überladen kann..
     
  15. HolgerNils (xycons.de)

    HolgerNils (xycons.de) G-WARD 2013/2014

    Registriert seit:
    29. Oktober 2011
    Beiträge:
    1.959
    Danke erhalten:
    449
    Danke vergeben:
    367
    Hi Avenger,
    danke für dir Hinweise. Ich frag jetzt aber mal ganz doof: Wie initialisiere ich das Teil?

    Wenn ich ihm '' zuweise bekomme ich einen anderen Fehler:
    Fatal error: Call to a member function size() on a non-object in /var/www/web1413/html/user_classes/overloads/AddressBookContentView/Packstation_AddressBookContentView.inc.php on line 32

    Wenn ich $p_coo_message_stack[] = ''; zuweise diesen:Fatal error: Cannot use object of type messageStack as array in /var/www/web1413/html/user_classes/overloads/AddressBookContentView/Packstation_AddressBookContentView.inc.php on line 31

    Stehe im moment echt auf dem Schlauch.

    Eigentlich will ich ja nur einen Wert dem "$addresses_data[]" hinzufügen. Ist die Vorgehensweise dann korrekt das ganze Geraffel zu wiederholen und sozusagen neu aufzubauen?

    Danke Vorab!
     
  16. Nonito (Gambio)

    Nonito (Gambio) Administrator
    Mitarbeiter

    Registriert seit:
    21. April 2011
    Beiträge:
    279
    Danke erhalten:
    134
    Danke vergeben:
    52
    Wenn du $p_coo_message_stack als Parameter in die Methode übergibst und in der Methode gleich via $p_coo_message_stack->size('addressbook') damit arbeiten möchtest, muss die Variable ein fertiges Objekt sein, d.h. initialisiere mal damit:

    PHP:
    $p_coo_message_stack = new messageStack();
     
  17. HolgerNils (xycons.de)

    HolgerNils (xycons.de) G-WARD 2013/2014

    Registriert seit:
    29. Oktober 2011
    Beiträge:
    1.959
    Danke erhalten:
    449
    Danke vergeben:
    367
    Ah, dank Euch Beiden!
    Das werde ich gleich ausprobieren.
     
  18. HolgerNils (xycons.de)

    HolgerNils (xycons.de) G-WARD 2013/2014

    Registriert seit:
    29. Oktober 2011
    Beiträge:
    1.959
    Danke erhalten:
    449
    Danke vergeben:
    367
    #38 HolgerNils (xycons.de), 17. September 2012
    Zuletzt bearbeitet: 17. September 2012
    Hm, jetzt meckert er das Original an?! o_O
    Fatal error: Call to a member function size() on a non-object in /var/www/web1413/html/system/views/account/AddressBookContentView.inc.php on line 36

    Hm, ist wieder weg, nachdem ich das Verzeichnis und die Datei in /overload/ gelöscht, Cache gelöscht und beides wieder angelegt habe. Komischer Effekt. Aber "er" scheint sie nicht zu benutzen...

    Edit: Ein "s" vergessen im Verzeichnisnamen, ich Döskopf!

    ES GEHT! DANKE nochmals Avenger & Nonito!
     
  19. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ich hatte das bei mir getestet, das funktionierte einwandfrei....

    Das Objekt wird richtig übergeben...

    Das wird so aber nicht funktionieren, weil "$p_coo_message_stack" ja dann nur lokal definiert ist, und nicht das "richtige" Objekt referenziert....
     
  20. Gerd Schoolmann

    Gerd Schoolmann Erfahrener Benutzer

    Registriert seit:
    23. August 2012
    Beiträge:
    165
    Danke erhalten:
    23
    Danke vergeben:
    21
    Guten Morgen,

    mal ´ne ganz dumme Frage: wozu brauche ich den ganzen Kram mit Überladung? Bisher habe ich Änderungen immer direkt im Code vorgenommen und gedacht, damit sei alles erledigt. Muss ich jetzt für jede Datei irgendwelche overload-Verzeichnisse angeben oder Konstruktoren erstellen? Mit objektorientierter Programmierung habe ich so gut wie noch nie zu tun gehabt (ausser mal eine Fortbildung in Java, und das war mir damals schon zu heavy).

    Vielen Dank für Eure Statements.