review_save_after pengamat acara tidak berjalan dengan benar

8

Saya menggunakan versi Magento 1.8. Saya telah menulis pengamat yang harus dijalankan ketika admin menyimpan ulasan produk dengan status "Disetujui". Dan saya telah membuat atribut peringkat untuk setiap produk dengan multiselect dan harus secara otomatis memperbarui setiap kali ketika admin menyimpan ulasan untuk suatu produk.

Catatan: Ulasan ada di Laporan / Ulasan / Ulasan Produk.

etc / Config.xml Code:

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

mode / Kode Pengamat

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

Ketika admin berusaha menyimpan ulasan untuk suatu produk, kode pengamat di atas sedang dijalankan dan ulasan diperbarui dengan benar, tetapi produk mendapatkan nilai ulasan sebelumnya daripada ulasan terbaru yang diperbarui.

Saya menulis <review_save_after>tetapi mendapatkan nilai sebelumnya. Apa yang disebut dengan acara setelah "Simpan Ulasan" Apakah itu benar atau tidak?

Tolong beritahu saya di mana saya salah.

Terima kasih sebelumnya.

Sivakumar
sumber

Jawaban:

4

Setelah banyak penelitian saya mendapat solusi ... :-) Tetapi kita dapat melakukan ini dengan sangat mudah.

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

tambahkan Jenis lalu Coba

Keyul Shah
sumber
Saya telah meletakkan baris itu <type> singleton </type> . Namun tidak ada efek yang masih mendapatkan masalah yang sama.
Sivakumar
coba masuk menggunakan Mage :: log ('test'). dan tolong beri tahu saya
Keyul Shah
Mage :: log ('test') menampilkan tes . Fungsi pengamat sedang mengeksekusi.
Sivakumar
Kemudian pengamat Anda bekerja dengan baik
Keyul Shah
2
letsmakeitgo.com/blog/2011/06/... ikuti tautan ini untuk pengkodean
Keyul Shah