Oxutilscount überladen

Hallo

Bezugnehmend auf diesen Artikel http://forum.oxid-esales.com/showthread.php?t=6604 möchte ich fragen, ob ich den ganzen Zauber auch machen muß um die oxutilscount.php zu überladen.
Ich möchte die dortige Funktion setManufacturerArticleCount( $aCache, $sMnfId, $sActIdent ) abändern, daß sie mir nur die Artikel zählt, die einen Bestand über 0 haben.

Dazu habe ich ein Minimodul geschrieben, was folgenden Code hat, aber leider noch keinen Effekt erzielt:


<?php
/**
 *  Extending oxutilscount to show only the maniufacturers with articles > 0 and articles.stock > 0
 *
 */
class enzutils extends enzutils_parent{

   /**
     * Saves and returns Manufacturers category article count into cache
     *
     * @param array  $aCache    Category cache data
     * @param string $sMnfId    Unique Manufacturer ident
     * @param string $sActIdent Unique user context ID
     *
     * @return int
     */
    public function setManufacturerArticleCount( $aCache, $sMnfId, $sActIdent )
    {
        // if Manufacturer/category name is 'root', skip counting
        if ( $sMnfId == 'root' ) {
            return 0;
        }

        $oArticle = oxNew( 'oxarticle' );
        $sArtTable   = $oArticle->getViewName();
        $sManTable = getViewName('oxmanufacturers');

        // select each Manufacturer articles count
        //#3485
        $sQ = "select count($sArtTable.oxid) from $sArtTable where $sArtTable.oxparentid = '' and oxmanufacturerid = '$sMnfId' and ".$oArticle->getSqlActiveSnippet() ." and oxstock > 0";

        $iValue = oxDb::getDb()->getOne( $sQ );

        $aCache[$sMnfId][$sActIdent] = (int) $iValue;

        $this->_setManufacturerCache( $aCache );

        return $aCache[$sMnfId][$sActIdent];
    }

}

Was muß ich hier noch tun, damit es arbeitet?

Danke.
Johannes

Jemand eine Idee, bitte?

Wenn die Klasse hier drin steht dann kannst du Sie nicht überladen, sehen kannst du das auch wenn du dir die Core Datei anschaust und guckst ob getInstance mit oxNew arbeitet oder nicht.

Mit Folgendem in der config.inc.php (ganz unten) sollte es gehen:

$this->_aConfigParams['aModules'] = array('oxutilsfile' => 'dein_modulordner/enzutils');

Hallo rubbercut

Danke für den Code, doch leider scheint das noch nicht zu funktionieren.
Ich habe die Zeile in die cust_config.inc.php geschrieben, welche ja am Ende der config.inc.php geladen wird.
Bist Du dir sicher, daß nicht am Ende “…=>enzutils/enzutils.php” stehen muß? Ich habe auch das mal ausprobiert und leider funktioniert das trotzdem nicht…

Johannes

Ich hatte den Fred nur überlesen: oxutilscount statt oxutilsfile paßt dann wohl besser (Sorry). Aber ohne “.php” !

Hallo

Folgende Zeile steht in der cust_config.inc.php:


$this->_aConfigParams['aModules'] = array('oxutilscount' => 'enzutils/enzutils');

But, nothing changed :frowning:

Boah - noch ein größeres Problem gibts bei der Methode!
Alle anderen Module werden dadurch deaktiviert und nicht mehr geladen!

Muß ich jetzt jedes einzelne Modul mit seinen Vererbungen in die cust_config.inc.php reinschreiben oder gibt es noch eine schönere Lösung?

Hallo

Nochmal ich.
Wenn ich also versuche in der cust_config.inc.php alle Module vorzeitig zu laden mit:


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

sagt mir php, daß die Funktion oxConfigFile::_loadVarsFromDb nicht bekannt sei… Aber in bootstrap.php wird doch auch oxconfig.php schon geladen?!

Ideen?

Johannes

Also meiner Ansicht nach musst du das alles nicht machen weil sich oxutilscount ganz normal überladen lässt. Was willst du eigentlich erreichen? Wie testet du ob dein Modul funktioniert?

Hallo

Ich habe die SQL-Abfrage der Funktion “setManufacturerArticleCount” erweitert, daß er mir nicht nur die Artikel zählt, sondern die Artikel mit Bestand > 0. Dadurch soll die Hersteller-Auswahlliste eingekürzt werden.

Testen tue ich das Modul indem ich den Cache leere und die Seite lade. Erscheint ein Hersteller in der Liste, der aktuell keine Artikel Bestand > 0 im Shop hat, dann wird meine setManufacturerArticleCount-Funktion (siehe 1. Thread) nicht geladen.

Johannes

Im Demoshop werden Hersteller immer angezeigt, auch die mit 0 Artikeln. setManufacturerArticleCount steuert glaube ich nur die Anzahl Seiten im Locator. Wenn man nur da was ändert passt die Anzahl Seiten nicht mehr mit der Anzahl angezeigter Artikel zusammen.

Hallo

Das mag schon so sein, aber wenn man der Manufacturer-List sagt, daß Sie nur die anzeigen soll die [{ if $oManufacturerlistentry->getNrOfArticles() > 0 }] zeigen soll, dann macht sie das auch.
Nun will ich aber die getNrOfArticles() überladen um nicht nur nach Artikel > 0 sondern auch nach Artikel.Bestand > 0 zu suchen. Das sollte doch möglich sein!

Johannes

Ja sicher, nur ohne genau zu sehen was du gemacht hast kann man nicht sehen warum es nicht funktioniert. Am Überladen liegts m. E. nicht. Um das zu testen ändere einfach die Funktion direkt in der Klasse und schau ob’s geht.

Okay, ne Idee.

Also habe ich oxutilscount.php in der Funktion setManufacturerArticleCount die SELECT-Zeile wir folgt abgeändert:


$sQ = "select count($sArtTable.oxid) from $sArtTable where $sArtTable.oxparentid = '' and oxmanufacturerid = '$sMnfId' and ".$oArticle->getSqlActiveSnippet() ." and $sArtTable.oxstock > 0";

Wie ich sehen konnte greift meine oxstock-Abfrage auch hier nicht :frowning:

Dein Problem dürfte auch der Cache sein. So sollte es aber gehen:

'oxutilscount' => 'enzutils/enzutils'
<?php
class enzutils extends enzutils_parent{

    public function setManufacturerArticleCount( $aCache, $sMnfId, $sActIdent )
    {
        // if Manufacturer/category name is 'root', skip counting
        if ( $sMnfId == 'root' ) {
            return 0;
        }

        $oArticle = oxNew( 'oxarticle' );
        $sArtTable   = $oArticle->getViewName();
        $sManTable = getViewName('oxmanufacturers');

        // select each Manufacturer articles count
        //#3485
        $sQ = "select count($sArtTable.oxid) from $sArtTable where $sArtTable.oxparentid = '' and oxmanufacturerid = '$sMnfId' and ".$oArticle->getSqlActiveSnippet() ." and oxstock > 0";

        $iValue = oxDb::getDb()->getOne( $sQ );

        $aCache[$sMnfId][$sActIdent] = (int) $iValue;

        $this->_setManufacturerCache( $aCache );

        return $aCache[$sMnfId][$sActIdent];
    }
	
	
	public function getManufacturerArticleCount( $sManufacturerId )
    {
        // current category unique ident
        $sActIdent = $this->_getUserViewId();

        // loading from cache
        $aManufacturerData = $this->_getManufacturerCache();
        $iCnt = $this->setManufacturerArticleCount( $aManufacturerData, $sManufacturerId, $sActIdent );
        return $iCnt;
    }
}

Hallo

Aha, ich muß den getter dort auch mit einbauen! Na dann…
Gesagt - getan und: es scheint was anders zu sein - leider wurden jetzt aktuelle keine Namen mehr in der Liste ausgegeben. Das kann aber ggf. am Cache hängen.

Leider schmiert mir gerade der Webserver alle paar Minuten ab, weswegen ein Testen & Leeren des Caches extrem nervig ist…

So - Webserver läuft endlich wieder aber leider zeigt die Manufacturer-Liste immernoch Einträge mit Artikeln die Bestand = 0 haben :frowning:

Da fällt mir auf (analog zu meinem anderen Problem mit den Bestand = 0), daß ich hier die SQL-Abfrage ja auch noch darauf abändern muß, daß er Artikel mitzählt, die Lieferbarkeit = Standard und Bestand = 0 haben, aber die weglässt welche andere Werte.

Laß Dir die gesamte Abfrage ausgeben (getSqlActiveSnippet!):

select count(oxv_oxarticles_de.oxid) from oxv_oxarticles_de where oxv_oxarticles_de.oxparentid = '' and oxmanufacturerid = '1234oxid5678' and ( oxv_oxarticles_de.oxactive = 1 and ( oxv_oxarticles_de.oxstockflag != 2 or ( oxv_oxarticles_de.oxstock + oxv_oxarticles_de.oxvarstock ) > 0 ) and IF( oxv_oxarticles_de.oxvarcount = 0, 1, ( select 1 from oxv_oxarticles_de as art where art.oxparentid=oxv_oxarticles_de.oxid and ( art.oxactive = 1 ) and ( art.oxstockflag != 2 or art.oxstock > 0 ) limit 1 ) ) )

Mit Deinem Zusatz ergeben sich also keine Änderungen. Entsprechend musst die SQL-Abfrage noch nach Deinen Wünschen anpassen, fertig ;).