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.

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

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

ajoutez Type puis essayez


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.