review_save_after l'observateur d'événements ne fonctionne pas correctement

8

J'utilise la version Magento 1.8. J'ai écrit un observateur qui doit s'exécuter lorsque l'administrateur enregistre une critique de produit avec le statut "Approuvé". Et j'ai créé un attribut de notation pour chaque produit avec multiselect et il devrait automatiquement se mettre à jour à chaque fois que l'administrateur enregistre la critique d'un produit.

Remarque: les avis figurent dans Rapports / Avis / Avis sur les produits.

etc / Config.xml Code:

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

mode / Code Observateur

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

Lorsque l'administrateur tente d'enregistrer la révision d'un produit, le code d'observateur ci-dessus est en cours d'exécution et la révision est mise à jour correctement, mais le produit obtient la valeur de la révision précédente plutôt que la dernière révision mise à jour.

J'ai écrit <review_save_after>mais ça prenait une valeur précédente. Quel est l'événement appelé après "Enregistrer l'avis" Est-ce correct ou non?

Veuillez me dire où je me trompe.

Merci d'avance.

Sivakumar
la source

Réponses:

4

Après de nombreuses recherches, j'ai trouvé une solution ... :-) Mais nous pouvons le faire très facilement.

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
la source
1
<review_save_after>
 <observers>
    <efkadminhtml>
        <type>singleton</type> 
        <class>efkadminhtml/observer</class>
        <method>ratingsUpdate</method>
    </efkadminhtml>
</observers>

ajoutez Type puis essayez

Keyul Shah
la source
J'ai mis cette ligne <type> singleton </type> . Mais aucun effet n'obtient toujours le même problème.
Sivakumar
essayez de vous connecter en utilisant Mage :: log ('test'). et s'il vous plaît faites le moi savoir
Keyul Shah
Mage :: log ('test') affiche test . La fonction d'observateur est en cours d'exécution.
Sivakumar
Ensuite, votre observateur fonctionne bien
Keyul Shah
2
letsmakeitgo.com/blog/2011/06/… suivez ce lien pour le codage
Keyul Shah