Preisberechnung listenansicht (4.6.1_45706 CE)

[B]Edit: Bitte Thread ins DE-Forum verschieben, habs verpeilt.[/B]
Hallo zusammen,

eine Verständnisfrage, welche mich nun bereits seit 2 Tagen beschäftigt, und deren Lösung sich mir verschließt:

Ich lasse mir in der oxarticle einen var_dump ausgeben, um zu sehen, an welchen Stellen überall die Funktion getPrice aufgerufen wird.

Dabei ist mir in der Listenansicht aufgefallen (?cl=alist&cnid=musterkat.), dass getPrice() bereits vor dem <html>-Tag ein paar mal durchlaufen wird.

Die alist.php ruft in der render()-Funktion $this->getArticleList(); auf. Verfolgt man diese Kette weiter, landet man irgendwann in der selectString()-Funktion von oxarticlelist, welche wiederum auf die selectString von oxlist zurückgreift.

Irgendwo dazwischen passiert aber noch der Aufruf von Oxarticle::getPrice(). Ich finde den entsprechenden Aufruf innerhalb von diesem Ablauf einfach nicht:

string(53) "oxarticlelist loadCategoryArticles selectString start"
oxPrice Object
(
[_dBrutto:protected] => preisA
[_dNetto:protected] =>
[_dVat:protected] =>
[_blNetPriceMode:protected] =>
)
oxPrice Object
(
[_dBrutto:protected] => normalpreis
[_dNetto:protected] =>
[_dVat:protected] =>
[_blNetPriceMode:protected] =>
)
string(51) “oxarticlelist loadCategoryArticles selectString end”

Meine Fragen dazu: Wo passiert der Aufruf? Wieso 2x pro Artikel, wiese 2x mit unterschiedlichen Preisen? Wieso greift nach der ersten Berechnung der Cache in getPrice nicht?

Weiterführend:
Der Aufruf von getPrice passiert bei mir pro angezeigtem Artikel 2x, eingeloggt als Benutzer der Benutzergruppe PreisA berechnet mir getPrice() das erste mal korrekt den PreisA, beim zweiten mal allerdings nicht. Erst diese zweite Berechnung landet (komischerweise) im “Cache” von oxarticle (if-Abfrage in der Funktion getPrice()). Dies führt wiederum dazu, dass der Aufruf von getFPrice() im Template listitem_grid.tpl die gecachte Version ausliefert, welche falsch ist, da es sich nicht mehr um PreisA handelt.

In der Detailansicht passiert der Aufruf für den Artikel korrekterweise nur einmal, mit dem richtigen Preis.

Habe etwas weiter getestet: Davon abgesehen dass getPrice() in der Listenansicht beim laden der Artikelliste 2x pro Artikel aufgerufen wird, muss beim cachen in getPrice() mMn irgendetwas schief laufen (oder auch nicht, falls nein bitte um Erklärung :slight_smile: )

Hier die etwas modifizierte getPrice() in der oxarticle:

    public function getPrice( $dAmount = 1 )
    {
        $myConfig = $this->getConfig();
        // Performance
        if ( !$myConfig->getConfigParam( 'bl_perfLoadPrice' ) || !$this->_blLoadPrice ) {
            return;
        }
            
        // return cached result, since oPrice is created ONLY in this function 

    if ( $dAmount != 1 || $this->_oPrice === null ) {
        $oPrice = oxNew( 'oxPrice' );

            // get base
            $oPrice->setPrice( $this->getBasePrice( $dAmount ) );

            // price handling
            if ( !$this->_blCalcPrice && $dAmount == 1 ) {
                return $this->_oPrice = $oPrice;
            }

            $this->_calculatePrice( $oPrice ); 
            if ( $dAmount != 1 ) {
                return $oPrice;
            }

            $this->_oPrice = $oPrice;
            print_r("not cached ");
   } else print_r("cached ");
   
   print_r("getPrice: ".$this->_oPrice->getNettoPrice()."
");
      
        
        return $this->_oPrice;
    }

Ergib bei mir in der Listenansicht, bei 8 Artikeln, am Anfang der Seite folgende Ausgabe (1x print_r ist noch in getGroupPrice() vorhanden):

getgroupprice, user in group a: 1
getgroupprice, user in group a: 1
not cached getPrice: 20.9008264463
cached getPrice: 32.9917355372
getgroupprice, user in group a: 1
getgroupprice, user in group a: 1
not cached getPrice: 20.9008264463
cached getPrice: 41.2396694215
getgroupprice, user in group a: 1
getgroupprice, user in group a: 1
not cached getPrice: 20.9008264463
cached getPrice: 41.2396694215
getgroupprice, user in group a: 1
getgroupprice, user in group a: 1
not cached getPrice: 20.9008264463
cached getPrice: 41.2396694215
getgroupprice, user in group a: 1
getgroupprice, user in group a: 1
not cached getPrice: 20.9008264463
cached getPrice: 41.2396694215
getgroupprice, user in group a: 1
getgroupprice, user in group a: 1
not cached getPrice: 20.9008264463
cached getPrice: 41.2396694215
getgroupprice, user in group a: 1
getgroupprice, user in group a: 1
not cached getPrice: 20.9008264463
cached getPrice: 32.9917355372
getgroupprice, user in group a: 1
getgroupprice, user in group a: 1
not cached getPrice: 20.9008264463
cached getPrice: 32.9917355372

schön zu sehen dass getPrice() 2x pro Artikel aufgerufen wird, und beim 2ten mal die “gecachte” Version ausgeliefert wird. Allerdings sollte mMn im Cache doch eigentlich die zuvor berechnete Version landen, also die, wo korrekt erkannt wurde das der Nutzer sich in der Gruppe PreisA befindet.

Auf jeden Fall sitzt dieser “falsche” Preis ab diesem Zeitpunkt im Cache fest und wird bei allen folgenden Aufrufen im Template auch zurückgegeben.