review_save_afterイベントオブザーバーが正しく実行されていません


8

Magento 1.8バージョンを使用しています。管理者がステータスが「承認済み」の製品レビューを保存するときに実行する必要があるオブザーバーを作成しました。そして、私はmultiselectを使用してすべての製品の格付け属性を作成し、管理者が製品のレビューを保存するたびに自動的に更新されるはずです。

注:レビューは、レポート/レビュー/製品レビューにあります。

etc / Config.xmlコード:

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

モード/オブザーバーコード

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

管理者が製品のレビューを保存しようとすると、上記のオブザーバーコードが実行され、レビューは正しく更新されますが、製品は最新の更新されたレビューではなく、以前のレビュー値を取得しています。

私は書いた<review_save_after>が、それは以前の値を取得しています。「レビューを保存」の後に呼び出されるイベントは何ですか?正しいですか?

どこが間違っているのか教えてください。

前もって感謝します。

回答:


4

多くの研究の後、私は解決策を得ました... :-)しかし、私たちはこれを非常に簡単に行うことができます。

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>

タイプを追加してから試してください


その行を<type> singleton </ type>と書きました。しかし、同じ問題が発生しても効果はありません。
Sivakumar

Mage :: log( 'test')を使用してログを記録してみてください。そして私に知らせてください
Keyul Shah

Mage :: log( 'test')はtestを表示しています。オブザーバー機能が実行中です。
Sivakumar

その後、オブザーバーは
正常に

2
letsmakeitgo.com/blog/2011/06/… このリンクに従ってコーディング
Keyul Shah
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.