Der Ereignisbeobachter review_save_after wird nicht ordnungsgemäß ausgeführt


8

Ich verwende die Magento 1.8-Version. Ich habe einen Beobachter geschrieben, der ausgeführt werden muss, wenn der Administrator eine Produktbewertung mit dem Status "Genehmigt" speichert. Und ich habe ein Bewertungsattribut für jedes Produkt mit Multiselect erstellt und es sollte jedes Mal automatisch aktualisiert werden, wenn der Administrator die Bewertung für ein Produkt speichert.

Hinweis: Bewertungen finden Sie unter Berichte / Bewertungen / Produktbewertungen.

etc / Config.xml Code:

<review_save_after>
    <observers>
        <efkadminhtml>
            <class>efkadminhtml/observer</class>
            <method>ratingsUpdate</method>
        </efkadminhtml>
    </observers>
</review_save_after>

Modus / Beobachtercode

public function ratingsUpdate(Varien_Event_Observer $observer)
{
    $object = $observer->getEvent()->getObject();
    $statusId = $object->getStatusId();

    if($statusId == 1) {
        $common = Mage::getSingleton('catalog/common');
        $attribute = $common->getAttribute('ratings');
        Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

        $productId = $object->getEntityPkValue();
        $product = Mage::getModel('catalog/product')->load($productId);
        $avgRating = Mage::getBlockSingleton('efkreports/product_allReviews')->getAvgReview($product->getId());

        Mage::log($avgRating);
        Mage::log($attribute->getOptionId(round($avgRating)));
        $product->setRatings($attribute->getOptionId(round($avgRating)));
        //$product->setRatings(round($avgRating));
        $product->save();
    }
}

Wenn der Administrator versucht, die Bewertung für ein Produkt zu speichern, wird der obige Beobachtercode ausgeführt und die Überprüfung wird korrekt aktualisiert, aber das Produkt erhält eher den vorherigen Überprüfungswert als die letzte aktualisierte Überprüfung.

Ich schrieb, <review_save_after>aber es bekam vorherigen Wert. Wie heißt das Ereignis nach "Bewertung speichern" ? Ist das richtig oder nicht?

Bitte sag mir, wo ich falsch liege.

Danke im Voraus.

Antworten:


4

Nach vielen Recherchen habe ich eine Lösung gefunden ... :-) Aber wir können das sehr einfach machen.

public function ratingsUpdate(Varien_Event_Observer $observer)
    {
        $object = $observer->getEvent()->getObject();
        $data = $object->getData();

        $newRatings = $data['ratings'];
        $reviewId = $data['review_id'];

        $newSumRatings = 0;
        foreach($newRatings as $r) {
            $value = $r % 5;
            $newSumRatings += ($value) ? $value : 5;
        }
        $newAvgRating = $newSumRatings;

        $statusId = $object->getStatusId();
        if($statusId == 1) {
            $common = Mage::getSingleton('catalog/common');
            $attribute = $common->getAttribute('ratings');
            Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

            $productId = $object->getEntityPkValue();
            $product = Mage::getModel('catalog/product')->load($productId);

            $reviews = Mage::getModel('review/review')
                ->getResourceCollection()
                ->addStoreFilter(Mage::app()->getStore()->getId()) 
                ->addEntityFilter('product', (int)$productId)
                ->addStatusFilter(Mage_Review_Model_Review::STATUS_APPROVED)
                ->setDateOrder()
                ->addRateVotes();

            $avg = 0;

            if (count($reviews) > 0) {
                foreach ($reviews->getItems() as $review) {
                    $temp = 0;
                    if($reviewId == $review->getReviewId()) {
                        $sum += $newSumRatings;
                    } else {
                        foreach( $review->getRatingVotes() as $vote ) {
                            $temp += $vote->getPercent() / 20;
                        }
                        $sum += $temp;  
                    }
                }

                $avg = $sum / (count($reviews) * 3);
            }

            $product->setRatings($attribute->getOptionId(round($avg)));
            $product->save();
        }
    }

1
<review_save_after>
 <observers>
    <efkadminhtml>
        <type>singleton</type> 
        <class>efkadminhtml/observer</class>
        <method>ratingsUpdate</method>
    </efkadminhtml>
</observers>

Fügen Sie Type hinzu und versuchen Sie es dann


Ich habe diese Zeile <type> singleton </ type> gesetzt . Aber kein Effekt bekommt immer noch das gleiche Problem.
Sivakumar

Versuchen Sie, sich mit Mage :: log ('test') anzumelden. und bitte lassen Sie es mich wissen
Keyul Shah

Mage :: log ('test') zeigt test an . Die Beobachterfunktion wird ausgeführt.
Sivakumar

Dann arbeitet Ihr Beobachter gut
Keyul Shah

2
letmakeitgo.com/blog/2011/06/… folgen Sie diesem Link zum Codieren
Keyul Shah
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.