Überschreiben von oxutils, oxlang etc

Als ich das erste mal das Konzept der Module von Oxid gezeigt bekommen habe war ich begeistert. Als ich dann jedoch die Bilderresize Funktion bearbeiten wollte folgte schnell Ernüchterung, nicht alles lässt sich überschreiben. Also ging das Modifizieren der core files wieder los. Als einem dann, mit dem Update auf 4.4.2, die Möglichkeit genommen wurde, die oxlang zu überschreiben, musste eine Lösung her, da ich diese in unseren Modulen dazu verwenden das spezifische language file zu laden. Das Problem das sich mache Klassen trotz oxNew nicht überschreiben lassen liegt daran das die Config aModules noch nicht von der DB geladen hat. Das ganze geschieht hier:


    public function init()
    {
        include getShopBasePath().'config.inc.php';
        include getShopBasePath().'core/oxconfk.php';

        //adding trailing slashes
        $oFileUtils = oxUtilsFile::getInstance();
        $this->sShopDir     = $oFileUtils->normalizeDir($this->sShopDir);
        $this->sCompileDir  = $oFileUtils->normalizeDir($this->sCompileDir);
        $this->sShopURL     = $oFileUtils->normalizeDir($this->sShopURL);
        $this->sSSLShopURL  = $oFileUtils->normalizeDir($this->sSSLShopURL);
        $this->sAdminSSLURL = $oFileUtils->normalizeDir($this->sAdminSSLURL);

        ...

        $sCoreDir = $this->getConfigParam( 'sShopDir' );
        $this->setConfigParam( 'sCoreDir', $sCoreDir.'/core/' );

        try {
            //starting up the session
            $this->getSession()->start();

            $sShopID = $this->getShopId();

            // load now
            $this->_loadVarsFromDb( $sShopID );
        } 
        ...

Wenn man nun die normalizeDir Funktion aus oxUtilsFile kopiert braucht man oxUtilsFile nicht laden. Das Einzige was man nun noch zu tun hat ist ‘aModules’ auf jeden Fall zu laden, was durch $this->_loadVarsFromDb( $sShopID, array(‘aModules’) ); bewerkstelligt wird. Hier mal der Code:


    public function normalizeDir( $sDir )
    {
        if ( isset($sDir) && $sDir != "" && substr($sDir, -1) !== '/' ) {
            $sDir .= "/";
        }

        return $sDir;
    }

    public function init()
    {
        include getShopBasePath().'config.inc.php';
        include getShopBasePath().'core/oxconfk.php';

        //adding trailing slashes
        $this->sShopDir     = $this->normalizeDir($this->sShopDir);
        $this->sCompileDir  = $this->normalizeDir($this->sCompileDir);
        $this->sShopURL     = $this->normalizeDir($this->sShopURL);
        $this->sSSLShopURL  = $this->normalizeDir($this->sSSLShopURL);
        $this->sAdminSSLURL = $this->normalizeDir($this->sAdminSSLURL);

        ...

        $sCoreDir = $this->getConfigParam( 'sShopDir' );
        $this->setConfigParam( 'sCoreDir', $sCoreDir.'/core/' );

        $sShopID = $this->getShopId();

        // load now
        $this->_loadVarsFromDb( $sShopID, array('aModules') );
        
        
        try {
            //starting up the session
            $this->getSession()->start();

            // load now
            $this->_loadVarsFromDb( $sShopID );
        }
        ...

Das Ganze mag noch nicht 100% optimal sein, jedoch hält der Oxid Shop so nun das was ich mir davon versprochen habe, nämlich als Entwickler alles überschreiben zu können. Es wäre schön wenn das Ganze in der Form Einzug in den Core halten würde und eine Diskussion entsteht die es zum Ziel hat das ganze “sauber” zu lösen.

Ich pusche das ganze mal, weil ich das Thema wichtig finde.

Mein Ansatz ist in der config.inc.php, die muss ja sowieso editiert werden.
Am Ende einfügen:


    include getShopBasePath().'core/oxconfk.php';
    $this->_loadVarsFromDb( $this->getShopId(), array('aModules') );

Mit oxlang geht es. Sollte aber auch Dein anderes Problem beheben (Rückmeldung währe toll… auch Feedback ob das mit der EE so funktioniert - getShopId()).

[QUOTE=MBa;39644]Ich pusche das ganze mal, weil ich das Thema wichtig finde.

Mein Ansatz ist in der config.inc.php, die muss ja sowieso editiert werden.
Am Ende einfügen:


    include getShopBasePath().'core/oxconfk.php';
    $this->_loadVarsFromDb( $this->getShopId(), array('aModules') );

Mit oxlang geht es. Sollte aber auch Dein anderes Problem beheben (Rückmeldung währe toll… auch Feedback ob das mit der EE so funktioniert - getShopId()).[/QUOTE]
Ich habe das mal untersucht…

Man erhält damit die zusätzliche Möglichkeit, die folgenden Klassen zu überladen:

oxutilsfile
oxsession
oxutilsserver
oxdb
Das ist die dann Liste der überladbaren Klassen (Startseite)

oxutilsfile
oxsession
oxutilsserver
oxdb

oxutilsobject
oxutils
oxexceptionhandler
oxshopcontrol
start
oxshop
oxlang
oxstr
oxstrregular
oxseoencoder
oxcmp_user
oxuser
oxcmp_lang
oxcmp_cur
oxbasketitem
oxbasket
oxutilsurl
oxcmp_shop
oxcmp_categories
oxmanufacturerlist
oxmanufacturer
oxseoencodermanufacturer
oxcategorylist
oxcategory
oxutilsdate
oxutilscount
oxcontentlist
oxcontent
oxcmp_utils
oxcmp_news
oxcmp_basket
oxviewconfig
oxutilsview
oxutilsview
oxarticlelist
oxarticle
oxactions
oxprice
oxlist
oxbase
oxvatselector
oxdiscountlist
oxdiscount
oxtagcloud
oxrssfeed
oxnewslist
oxnews
oxpricelist
oxutilsstring
oxoutput
oxseoencodercontent

@marco, kann man das nicht in den Core (oxConfig) reinmachen?
Generell, je früher die Modulkette geladen ist, desto flexibler ist das System.

Wir hatten das auf der Mailinglist mal angesprochen, das geht wohl wegen der EE Sachen nicht. Ich würds aber an deiner Stelle nochmal auf der Mailinglist posten.

Hi,

ich habe versucht die nicht überladbare Klasse “oxseoencoder” mit meiner eigenen Klasse “lowurl_oxseoencoder”, die sich in einem Modul befindet, zu überladen.
Dafür habe ich dann in der config.inc.php Datei folgenden Code eingebaut:


include getShopBasePath().'core/oxconfk.php';
$this->_loadVarsFromDb( $this->getShopId(), array('aModules') );

$this->aModules = 
        array(‘oxseoencoder’ => ‘lowurl_oxseoencoder’ 
);  

Leider ohne Erfolg.
Eigentlich möchte ich in der oxseoencoder Klasse nur eine Methode überschreiben. Das wars!

Kann mir jmd. helfen?

Hi,

Du kannst mal noch das durchspielen, was hier ganz unten empfohlen wird:

Gruß

Man kann nur oxSeoEncoderCategory etc. erweitern, nicht oxSeoEncoder.