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.

Sivakumar
quelle

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();
        }
    }
Sivakumar
quelle
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

Keyul Shah
quelle
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