The script tried to execute a method or access a property of an incomplete object

Ich eröffne diesen Thread primär als eigene Notiz, falls ich mal wieder über diesen Fehler stolper :slight_smile:

Die komplette Fehlermeldung sieht ca. so aus:

Fatal error: oxcmp_basket::render() [<a href=‘function.oxcmp-basket-render’>function.oxcmp-basket-render</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition “testbasket” of the object you are trying to operate on was loaded before unserialize() gets called or provide a __autoload() function to load the class definition in /htdocs/ttt/views/oxcmp_basket.php on line 61

Ursache des Problems ist die Reihenfolge, in der Module im Admin erweitert werden.
So kann dieser Fehler reproduziert werden, indem man oxbasketitem & oxbasket ableiten möchte und dabei oxbasketitem vor oxbasket setzt, cookies löscht und ein Produkt in den Warenkorb legt:

oxbasketitem => test/testbasketitem
oxbasket => test/testbasket

wobei eine umgekehrte Reihenfolge funktioniert.

Also Fazit: bei irgendwelchen incomplete object-Fehlern die Reihenfolge der Ableitungseinträge der Module im Admin überprüfen und ggf. verändern.

Vielleicht hilft dieser Hinweis ja auch noch jemand anders.

Danke, ich hatte mal ein ähnliches Problem, konnte den Fehler aber nicht mehr reproduzieren.

[QUOTE=ManuelR;16079]oxbasketitem => test/testbasketitem
oxbasket => test/testbasket

wobei eine umgekehrte Reihenfolge funktioniert.

Also Fazit: bei irgendwelchen incomplete object-Fehlern die Reihenfolge der Ableitungseinträge der Module im Admin überprüfen und ggf. verändern.

Vielleicht hilft dieser Hinweis ja auch noch jemand anders.[/QUOTE]
Hat bei mir nicht geholfen…

[B]Kann auch gar nicht helfen![/B]

Weil der Ablauf so ist, dass beim Aktivieren einer Klasse nachgeschaut wird, ob in dieser Modul-Definitions-Struktur ein Overwrite-Modul für diese Klassen definiert ist.

D.h., dass die Reihenfolge der Aktivierung der Overwrite-Modul von der Reihenfolge der Aktivierung der Basisklassen bestimmt wird, und [B]nicht [/B]von der Reihenfolge in der Moduldefinition…

immer cookies löschen damit die session definitiv weg ist. der basket ist nämlich in der session als objekt gespeichert.

Das hilft auch nix…

Kommt immer noch der gleiche Fehler:

Fatal error: oxBasket::_clearBundles() [<a href=‘oxbasket.-clearbundles’>oxbasket.-clearbundles</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition “pt_basketitem_sellist” of the object you are trying to operate on was loaded before unserialize() gets called or provide a __autoload() function to load the class definition in …oxid\core\oxbasket.php on line 452

http://www.oxid-esales.com/forum/showthread.php?t=2758

[QUOTE=avenger;28744]Das hilft auch nix…

Kommt immer noch der gleiche Fehler:[/QUOTE]

Ich habe jetzt eine Lösung für das Problem erarbeitet ("[B]Dem Ingeniör ist nichts zu schwör![/B]")…

Wenn man in “[B]oxsession.php[/B]” die “[B]public function getBasket()[/B]” mit dem folgenden Code ersetzt, funktioniert das wieder:

    public function getBasket()
    {
      //Avenger -- Ensure existence of "oxbasketitem" class before "unserialize"
      if ( $this->_oBasket === null ) 
      {
        $sBasket = self::getVar( $this->_getBasketName() );
        if ( $sBasket ) 
        {
          $oBasketItem=oxnew('oxbasketitem');
          $oBasket = unserialize( $sBasket );
        } 
        if (!is_object($oBasket))
        {
          $oBasket = oxNew( 'oxbasket' );
        }
        $this->setBasket( $oBasket );
      }
      //Avenger -- Ensure existence of "oxbasketitem" class before "unserialize"
      return $this->_oBasket;
    }

Damit wird jetzt sicher gestellt, dass die “[B]oxbasketitem[/B]” Klasse (und ihre evtl. “overloads”) vorhanden ist(sind) bevor das “Basket”-Objekt aus der Session wiederhergestellt wird (“unserialize”).

(Das war ja genau das Problem, das die Fehlermeldung beschrieb: dass die “Overload”-Klasse noch nicht definiert war, wenn das “Basket”-Objekt aus der Session geladen wurde.)

Leider muss das direkt in der “[B]session.php[/B]” core Klasse geändert werden, da die Session Klasse nicht überladen werden kann.

Hallo Avenger,

ich hatte heute auch das Problem. In meinem Fall war es tatsächlich so, wenn ich oxbasket vor oxbasketitem in die Liste eintrage, funktioniert es; steht oxbasket nach oxbasketitem, knallt es.

Gruß, Kai

Hallo,

alter Thread, aber ich kann das Verhalten (umgekehrte Reihenfolge geht) genau so bestätigen!

Würde ich mal zumindest als Auffälligkeit bezeichnen. :wink:

Gruß Joscha