Bewertungen bei allen Varianten anzeigen lassen

Halloo liebe Oxid-Gemeinde,

neben der Funktion, dass alle Varianten-Bewertungen beim Vater-Artikel angezeigt werden, würde ich diese gerne auch bei sämtlichen anderen Varianten anzeigen lassen. Ist das irgendwie möglich?

Hier eine ausführlichere Beschreibung meiner Idee. Folgendes Szenario

Ein Vaterartikel “X” hat vier Varianten “A”, “B”, “C” und “D”.
Ein Kunde bewertet Variante “C”.
Diese Bewertung wird nun bei “C” angezeigt und bei entsprechender Einstellung auch bei “X”.
Ich möchte jedoch, dass die Bewertung für “C” auch bei “A”, “B” und “D” angezeigt wird.

OXID 6.2
PHP 7.3
Wave-Theme
Kenntnisstand absoluter Newbie

Ich freue mich auf eure Antworten und hoffe, dass ihr mir helfen könnt. :slight_smile:

Dazu musst in article.php die Methode getreviews(); anpassen, damit grundsätzlich immer der Parent-Artikel zum Laden der Bewertungen geladen wird.

Das ist ein sehr guter Hinweis. Ich scheitere aktuell an der Problematik, dass ich die Varianten-IDs nicht abfragen kann, wenn sich der Nutzer bereits in einer Variante befindet.

Es geht ja um folgende Funktion:
public function getReviews()

    {

        $aIds = [$this->getId()];

        if ($this->oxarticles__oxparentid->value) {

            $aIds[] = $this->oxarticles__oxparentid->value;

        }

        $parentid = $this->oxarticles__oxparentid->value;

        // showing variant reviews ..

        if ($this->getConfig()->getConfigParam('blShowVariantReviews')) {

            $aAdd = $this->getVariantIds();

            if (is_array($aAdd)) {

                $aIds = array_merge($aIds, $aAdd);

            }

        }

        $oReview = oxNew(\OxidEsales\Eshop\Application\Model\Review::class);

        $oRevs = $oReview->loadList('oxarticle', $aIds);

        //if no review found, return null

        if ($oRevs->count() < 1) {

            return null;

        }

        return $oRevs;

    }

Speziell war meine Idee diese Zeile abzuändern:
$aAdd = $this->getVariantIds();
…und zwar so, dass hier halt immer die Varianten des Vaters abgerufen werden und nicht vom aktuellen Objekt, bei dem sich der Nutzer gerade befindet. Das ist bei mir gerade so der Knackpunkt. Hast du da vielleicht noch einen Hinweis für mich? :slight_smile:

public function getReviews()
    {
		$aIds = [$this->getId()];
        if($this->getParentId() != "")$aIds = [$this->getParentId()];

		$oArticle = oxNew(\OxidEsales\Eshop\Application\Model\Article::class);
		if(!$oArticle->load($this->getParentId()))$oArticle->load($this->getId());

        if ($oArticle->oxarticles__oxparentid->value) {
            $aIds[] = $oArticle->oxarticles__oxparentid->value;
        }

        // showing variant reviews ..
        if ($this->getConfig()->getConfigParam('blShowVariantReviews')) {
            $aAdd = $oArticle->getVariantIds();
            if (is_array($aAdd)) {
                $aIds = array_merge($aIds, $aAdd);
            }
        }
		
        $oReview = oxNew(\OxidEsales\Eshop\Application\Model\Review::class);
        $oRevs = $oReview->loadList('oxarticle', $aIds);

        //if no review found, return null
        if ($oRevs->count() < 1) {
            return null;
        }

        return $oRevs;
}

Sollte gehen…

Wow… Hilfe zu so später Stunde! Was für eine super Community :slight_smile: es funktioniert super und basierend auf deiner Lösung konnte ich sogar auch die Anzahl an Kundenmeinungen entsprechend für die Varianten anpassen. Die letzte Stelle an der ich hänge ist nun die Berechnung des Bewertungsdurchschnitts. Ich habe hierzu folgenden Code gefunden, habe jedoch leider keinen Ansatz, wie ich das entsprechend abändern muss:
/**

     * Returns product rating average

     *

     * @param bool $blIncludeVariants - include variant ratings

     *

     * @return double

     */

    public function getArticleRatingAverage($blIncludeVariants = false)

    {

        if (!$blIncludeVariants) {

            return round($this->oxarticles__oxrating->value, 1);

        } else {

            $oRating = oxNew(\OxidEsales\Eshop\Application\Model\Rating::class);

            return $oRating->getRatingAverage($this->getId(), 'oxarticle', $this->getVariantIds());

        }

    }

Auch hier willst immer auf Basis des Vaters arbeten

ändern in

$oArticle = oxNew(\OxidEsales\Eshop\Application\Model\Article::class);
if(!$oArticle->load($this->getParentId()))$oArticle->load($this->getId());

return $oRating->getRatingAverage($this->getId(), 'oxarticle', $oArticle->getVariantIds());

Ich bin echt begeistert von der Hilfsbereitschaft. Vielen lieben Dank. Es funktioniert einwandfrei :slight_smile:

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.