Class-Overloading klappt nicht

Thema wurde von inmotto, 30. Oktober 2016 erstellt.

  1. inmotto

    inmotto Neues Mitglied

    Registriert seit:
    17. August 2016
    Beiträge:
    3
    Danke erhalten:
    0
    #1 inmotto, 30. Oktober 2016
    Zuletzt von einem Moderator bearbeitet: 7. November 2016
    Ich möchte über das Registrierungsformular eine individuelle Kundennummer speichern können.
    Damit das Update-Sicher passiert, habe ich folgende Anleitung zu Rate gezogen: https://developers.gambio.de/tutorials.html?v=3.0.0.0&p=class-overloading.
    Folgende Klassen system/classes/accounts/CreateAccountContentControl.inc.php und system/classes/accounts/CreateAccountContentView.inc.php versucht ich zu überladen.

    Dafür habe ich das nicht existierende Verzeichnis user_classes/overloads/CreateAccountContentControl mit der Datei CreateAccountContentControl.inc.php erstellt. Der Name ist identisch mit dem Original.

    PHP:
    <?php
    require_once (DIR_FS_INC 'xtc_validate_email.inc.php');
    require_once (
    DIR_FS_INC 'xtc_encrypt_password.inc.php');
    require_once (
    DIR_FS_INC 'xtc_create_password.inc.php');
    require_once (
    DIR_FS_INC 'xtc_write_user_info.inc.php');
    require_once (
    DIR_WS_CLASSES 'vat_validation.php');

    MainFactory::load_class('DataProcessing');

    class 
    NAWCreateAccountContentControl extends NAWCreateAccountContentControl_parent
    {

        public function 
    proceed()
        {
            if(isset(
    $this->v_data_array['POST']['action']) && ($this->v_data_array['POST']['action'] == 'process'))
            {
                
    $this->get_customers_data();
            }
            return 
    parent::proceed();
        }

        protected function 
    get_customers_data()
        {
            
    $this->customer_data_array['cid'] = xtc_db_prepare_input($this->v_data_array['POST']['cid']);
            
    parent::get_customers_data();
        }

        protected function 
    save_data()
        {
            
    $this->create_customer_sql_data_array();
            
    parent::save_data();
        }

        protected function 
    create_customer_sql_data_array()
        {
            if( !empty(
    $this->customer_data_array[TABLE_CUSTOMERS]) )
            {
                
    $this->sql_data_array[TABLE_CUSTOMERS]['customers_cid']                = $this->customer_data_array['cid'];
            }
            
    parent::create_customer_sql_data_array();
        }

    }
    ?>
    und die zweite Datei liegt in dem Verzeichnis user_classes/overloads/CreateAccountContentView mit der Datei CreateAccountContentView.inc.php darin und dem Inhalt:

    PHP:
    <?php
    require_once(DIR_FS_INC 'xtc_get_country_list.inc.php');

    class 
    NAWCreateAccountContentView extends NAWCreateAccountContentView_parent
    {

        protected function 
    add_data()
        {
            
    $this->add_kundennummer();
            
    parent::add_data();
        }

        protected function 
    add_kundennummer()
        {
            if ( isset(
    $_POST['cid']) ) {
                
    $this->customer_data_array['cid'] = $_POST['cid'];
            }
            
    $this->content_array['form_data']['cid'] = array();
            
    $this->content_array['form_data']['cid']['name'] = 'cid';
            
    $this->content_array['form_data']['cid']['value'] = htmlspecialchars_wrapper($this->customer_data_array['cid']);
            
    $this->content_array['form_data']['cid']['required'] = 0;
        }

    }
    ?>
    Leider werden diese Dateien überhaupt nicht berücksichtigt.
    Kann mir jemand erklären was ich falsch mache?
    Vielen Dank für eure Hilfe.
     
  2. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Wenn Deine Shopversion 3.1 oder 3.2 ist, müssen die Dateien statt in
    user_classs/ overloads/
    in das Verzeichnis
    GXUsercomponents/ overloads/
     
  3. inmotto

    inmotto Neues Mitglied

    Registriert seit:
    17. August 2016
    Beiträge:
    3
    Danke erhalten:
    0
    #3 inmotto, 31. Oktober 2016
    Zuletzt von einem Moderator bearbeitet: 7. November 2016
    Vielen Dank für den Tipp. Das hat mir schon weitergeholfen.

    Ich habe zusätzlich noch die Klasse CustomerWriteService überladen, um die Daten zu speichern.
    Leider erhalte ich die Meldung:

    Code:
    <b>Fatal error</b>:  Declaration of CustomerWriteServiceOverload::createNewRegistree() must be compatible with CustomerWriteServiceInterface::createNewRegistree(CustomerEmailInterface $email, CustomerPasswordInterface $password, DateTime $dateOfBirth, CustomerVatNumberInterface $vatNumber, CustomerCallNumberInterface $telephoneNumber, CustomerCallNumberInterface $faxNumber, AddressBlockInterface $addressBlock, KeyValueCollection $addonValues) in <b>/html/shop/GXUserComponents/overloads/CustomerWriteService/CustomerWriteServiceOverload.inc.php</b> on line <b>247</b><br />
    Ich habe die Klasse aus dem _samples Verzeichnis kopiert.

    Vielen Dank für eure Hilfe.
     
  4. 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 kein "Overload", sondern die Kopie des Originals!

    In einem Overload sollen nur die Dinge enthalten sein, die sich gegenüber dem Original ändern, und nicht der komplette Code des Originals inkl. der gewünschten Änderungen.

    Denn das ist NICHT updatesicher, weil Du bei jedem Gambio-Release prüfen musst, ob sich an dem Gambio-Original etwas geändert hat.
     
  5. inmotto

    inmotto Neues Mitglied

    Registriert seit:
    17. August 2016
    Beiträge:
    3
    Danke erhalten:
    0
    Das Problem tauchte auf, da Gambio der Methode einen weiteren Parameter gegeben hat, der aber in dem Beispiel nicht enthalten ist. Nachdem ich diesen Parameter ergänzt habe klappte es prompt.

    Wenn solche Fälle eintreffen können, ist ein updatesichers Entwickeln unmöglich :(
     
  6. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Updatesicher ist nicht = muss nie wieder geändert werden.
    Das bedeutet eher, dass es nicht überschrieben wird.

    Es gibt schon einige Dateien, die man mit einem Overload so erweitern kann, dass man das nicht jedes mal neu machen muss (wenn man, wie Avenger oben schon geschrieben hat, nur den notwendigen Code im Overload hat).

    Aber es ändert sich auch immer wieder etwas, da Gambio den ganzen alten Kram raus wirft und neu schreibt.
    Da kann es schon passieren, dass man seine Module / Anpassungen überprüfen und ändern muss.