review_save_after người quan sát sự kiện không chạy đúng


8

Tôi đang sử dụng phiên bản Magento 1.8. Tôi đã viết một trình quan sát phải chạy khi quản trị viên lưu đánh giá sản phẩm với trạng thái "Đã phê duyệt". Và tôi đã tạo một thuộc tính xếp hạng cho mọi sản phẩm với multiselect và nó sẽ tự động cập nhật mỗi khi quản trị viên lưu đánh giá cho một sản phẩm.

Lưu ý: Đánh giá trong Báo cáo / Đánh giá / Đánh giá sản phẩm.

vv / Mã cấu hình:

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

chế độ / Mã quan sát

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

Khi quản trị viên đang cố lưu đánh giá cho một sản phẩm, mã người quan sát ở trên đang thực thi và đánh giá đang cập nhật chính xác nhưng sản phẩm đang nhận được giá trị đánh giá trước đó thay vì đánh giá cập nhật mới nhất.

Tôi đã viết <review_save_after>nhưng nó nhận được giá trị trước đó. Sự kiện được gọi sau "Lưu đánh giá" Điều đó có đúng hay không?

Xin vui lòng cho tôi biết tôi sai ở đâu.

Cảm ơn trước.

Câu trả lời:


4

Sau rất nhiều nghiên cứu tôi đã có giải pháp ... :-) Nhưng chúng tôi có thể làm điều này rất dễ dàng.

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>

thêm Loại rồi thử


Tôi đã đặt dòng đó <type> singleton </ type> . Nhưng không có tác dụng vẫn nhận được cùng một vấn đề.
Sivakumar

thử đăng nhập bằng Mage :: log ('test'). và xin vui lòng cho tôi biết
Keyul Shah 23/12/13

Mage :: log ('test') đang hiển thị thử nghiệm . Chức năng quan sát viên đang thực thi.
Sivakumar

Sau đó, người quan sát của bạn đang hoạt động tốt
Keyul Shah 23/12/13

2
letmakeitgo.com/blog/2011/06/ từ theo liên kết này để mã hóa
Keyul Shah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.