$ quote-> setHasError(true)不工作

时间:2016-09-08 01:50:44

标签: php magento observers

我使用here中的代码添加观察者,从外部源获取qty,然后设置错误true / false。

我正确设置了观察者。我知道这是因为它正在做我需要的所有事情,除了显示购物车中有错误这一事实。

我在观察者中的代码(使用sales_quote_item_qty_set_after)是:

public function cartQtyUpdated(Varien_Event_Observer $observer) {
        if ($action = Mage::app()->getFrontController()->getAction()) {

            /** @var Mage_Sales_Model_Quote_Item $item */
            $item = $observer->getEvent()->getItem();

            if ($item->dataHasChangedFor('qty')) {

                $qty        = (int)$item->getQty();
                $product_id = (int)$item->getProduct()->getId();

                /** @var Mage_Catalog_Model_Product $product */
                $product = Mage::getModel('catalog/product')->load($product_id);

                $product_id = (int)$product->getEntityId();

                if ($product->getTypeId() == "configurable") {
                    $simple_id = (int)$item->getOptionByCode('simple_product')->getProduct()->getId();
                } else {
                    $simple_id = $product_id;
                }

                if (
                    $simple_id != '' &&
                    $qty != ''
                ) {

                    // Logic to get stock levels

                    if ($available['status'] == 'success') {

                        foreach ($options as $option) {
                            if ($option->getCode() == 'additional_options') {
                                $additional_options = unserialize($option->getvalue());
                                foreach ($additional_options as $key => $additional_option) {
                                    if ($additional_option['label'] == "Delivery Estimate") {
                                        $additional_options[$key]['value'] = $available['time'];
                                    }
                                }
                                $option->setValue(serialize($additional_options));
                            }
                        }
                        $item->setOptions($options)->save();
                        Mage::getSingleton('checkout/cart')->save();
                    } else {

                        $item->getQuote()->setHasError(true);
                        $item->addErrorInfo(
                            'checkout',
                            1,
                            Mage::helper('cataloginventory')->__('The requested Qty is not available.')
                        );
                        foreach ($options as $option) {
                            if ($option->getCode() == 'additional_options') {
                                $additional_options = unserialize($option->getvalue());
                                foreach ($additional_options as $key => $additional_option) {
                                    if ($additional_option['label'] == "Delivery Estimate") {
                                        $additional_options[$key]['value'] = "N/A";
                                    }
                                }
                                $option->setValue(serialize($additional_options));
                            }
                        }
                    }
                }
            }
        }
    }

似乎不起作用的部分是

$item->getQuote()->setHasError(true);
$item->addErrorInfo(
    'checkout',
    1,
    Mage::helper('cataloginventory')->__('The requested Qty is not available.')
);

我确信我在过去几天里有这个工作但是由于某种原因它不会保存错误。

当我输入我知道的数量不可用,并且我知道返回正确的错误时,购物车按钮仍然可见且购物车项目没有错误。

我在上面脚本的末尾添加了日志,并且可以安全地说setHasError()方法正在执行它的工作。另外,我添加了Mage::log($item->getErrorInfos(), 7, 'cart.log', true);,它返回一个包含我想要设置的确切错误的数组。

由于一切似乎都设置得当,我不确定为什么购物车没有显示错误以及为什么它似乎让我结账。

我能做些什么来找到观察者和购物车重新加载之间错误的丢失位置?

我觉得我在这里谈了一下,但这里有一个更新:

更新

我使用$item->getQuoteId()在observer方法中获取引用ID并使用

$session        = Mage::getSingleton('checkout/session');
$quote_id       = $session->getQuoteId();

获取cart.phtml文件中的报价ID。两个ID都是一样的。

真的可以对这些家伙和女孩的一些意见......

0 个答案:

没有答案