OXID – oxorder um Felder erweitern

Einleitung

Manchmal ist es unter OXID erforderlich die Bestellungen (oxorder) um weitere Felder zu erweitern. Möchte man also z.B. die Bestellungen um ein weiteres Feld „customusername“, weil man aus einer anderen Applikation wie z.B. einem Onlinespiel den Accountnamen festhalten möchte fällt es eines wohmöglich schwer zu entscheiden an welchem Platz man diese Implementation vornimmt.

An dieser Stelle gibt es wie immer viele Wege die zum Ziel führen, jedoch die einen mehr oder minder Schmerz befreit und die anderen weniger.

Einerseits möchte man, in den meisten Fällen, die Updatefähigkeit von OXID beibehalten und andererseits mit möglichst wenig Aufwand die Bestellungen auch erweitert bekommen.

oxorder Überladen

Wo soll denn nun die Implementation des weiteren Feldes durchgeführt werden? Für genau diese Frage gibt es eine recht entspannte Lösung.

_loadFromBasket und _setUser sind hier die passenden Stichworte. _loadFromBasket sammelt alle aus dem Warenkorb relevanten Informationen zusammen und setzt die entsprechenden Attribute des oxorder-Objektes. Sie lässt sich überladen und es gibt keinen notwendigen Grund Methoden in OXID zu überschreiben oder gar auf irgend einem anderen Wege die Updatefähigkeit herauszulösen.

 

Beispiel Implementation

In diesem Beispiel gehe ich davon aus, dass die metadata.php bereits angelegt und das oxorder-Model bereits unter den „extend“-Klassen eingetragen ist. Des Weiteren sind die Datenbankfelder bereits in oxorder sowie oxuser vorhanden.

Dieses Beispiel wird einen weiteren Accountnamen – „Spielernamen“ zu einer Bestellung hinzufügen.

Überladen des Models
<?php

class myCustomOrder extends myCustomOrder_parent{

    protected function _loadFromBasket( oxBasket $oBasket ){
        parent::_loadFromBasket($oBasket);
        $this->_setCustomFields($oBasket); // <-- optional
    }

    protected function _setCustomFields(oxBasket $oBasket){
        /**
        * weitere Verarbeitung von Attributen 
        (Bspw. custom fields aus oxBasket, wenn oxBasket überladen wurde)
        (optional)
        **/
    }

    protected function _setUser( $oUser ){
        parent::_setUser($oUser);
        $this->oxorder__customusername = clone $oUser->oxuser__customusername;
    }
	
}

_setUser wird in jedem Falle aufgerufen, sobald die Bestellung mit finalizeOrder angelegt wird.
Dies lässt sich auch ebenfalls schön im SVN-Repository von OXID nachvollziehen:
http://oxid.googlecode.com/svn/trunk/core/oxorder.php

0

Leave a Reply