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.

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

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

tambahkan Jenis lalu Coba


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.