Magento thất bại khi cố gắng lưu sản phẩm bên trong người quan sát sự kiện trên frontend?


15

Tôi có một chức năng được gắn với một người quan sát sự kiện

Một trong những yêu cầu là khi nó lặp qua dữ liệu mục đơn hàng, nếu một thuộc tính sản phẩm nào đó trống, nó sẽ đưa ra yêu cầu lấy dữ liệu cụ thể thông qua một mô hình riêng biệt (hoạt động tốt).

mã vấn đề về cơ bản giải quyết vấn đề này

foreach ($order->getAllItems() as $key => $item) {
    /** @var Tantor_Catalog_Model_Product $productData */
    $productData = $item->getProduct();
    $_item = Mage::getModel('catalog/product')->load($productData->getId());
    $_item->setNetsuiteItemIid('foo');
    $_item->save();
}

tuy nhiên Magento đang ném một ngoại lệ

2014-03-05T21:14:14+00:00 ERR (3):
exception 'Exception' with message 'Warning: Invalid argument supplied for foreach()  in /var/www/html/app/code/core/Mage/Eav/Model/Entity/Abstract.php on line 1180' in /var/www/html/app/code/core/Mage/Core/functions.php:245
Stack trace:
#0 /var/www/html/app/code/core/Mage/Eav/Model/Entity/Abstract.php(1180): mageCoreErrorHandler(2, 'Invalid argumen...', '/var/www/html/a...', 1180, Array)
#1 /var/www/html/app/code/core/Mage/Eav/Model/Entity/Abstract.php(1123): Mage_Eav_Model_Entity_Abstract->_collectSaveData(Object(Tantor_Catalog_Model_Product))
#2 /var/www/html/app/code/core/Mage/Core/Model/Abstract.php(318): Mage_Eav_Model_Entity_Abstract->save(Object(Tantor_Catalog_Model_Product))
#3 /var/www/html/app/code/local/Tantor/Netsuite/Model/Observer.php(218): Mage_Core_Model_Abstract->save()
#4 /var/www/html/app/code/core/Mage/Core/Model/App.php(1338): Tantor_Netsuite_Model_Observer->saveOrder(Object(Varien_Event_Observer))
#5 /var/www/html/app/code/core/Mage/Core/Model/App.php(1317): Mage_Core_Model_App->_callObserverMethod(Object(Tantor_Netsuite_Model_Observer), 'saveOrder', Object(Varien_Event_Observer))
#6 /var/www/html/app/Mage.php(447): Mage_Core_Model_App->dispatchEvent('sales_order_pla...', Array)
#7 /var/www/html/app/code/core/Mage/Sales/Model/Order.php(1096): Mage::dispatchEvent('sales_order_pla...', Array)
#8 [internal function]: Mage_Sales_Model_Order->place()
#9 /var/www/html/app/code/core/Mage/Core/Model/Resource/Transaction.php(105): call_user_func(Array)
#10 /var/www/html/app/code/core/Mage/Core/Model/Resource/Transaction.php(159): Mage_Core_Model_Resource_Transaction->_runCallbacks()
#11 /var/www/html/app/code/core/Mage/Sales/Model/Service/Quote.php(189): Mage_Core_Model_Resource_Transaction->save()
#12 /var/www/html/app/code/core/Mage/Sales/Model/Service/Quote.php(249): Mage_Sales_Model_Service_Quote->submitOrder()
#13 /var/www/html/app/code/core/Mage/Checkout/Model/Type/Onepage.php(774): Mage_Sales_Model_Service_Quote->submitAll()
#14 /var/www/html/app/code/core/Mage/Checkout/controllers/OnepageController.php(511): Mage_Checkout_Model_Type_Onepage->saveOrder()
#15 /var/www/html/app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Checkout_OnepageController->saveOrderAction()
#16 /var/www/html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('saveOrder')
#17 /var/www/html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#18 /var/www/html/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#19 /var/www/html/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#20 /var/www/html/index.php(86): Mage::run('', 'store')
#21 {main}

Tại sao tôi có thể sử dụng mã giống hệt nhau trong tập lệnh của bên thứ 3 bên ngoài trình quan sát magento tốt, nhưng khi tôi cố chạy nó bên trong trình quan sát đó, nó đã thất bại với thông báo lỗi ngẫu nhiên đó?


Lỗi này là điển hình của một mảng không được phân tích cú pháp foreach. Theo dõi ngăn xếp cho bạn thấy một sự kiện được gửi đi và người quan sát bị lỗi. Bạn có chắc chắn $order->getAllItems()đang trả thù array()? sử dụng : Zend_Debug::dump($order->getAllItems());. Tuy nhiên, nó có thể là một người quan sát khác với một số mã xấu?
tro

vấn đề là ở mã lõi Magento, không phải với đoạn trích của tôi ở đầu.
Zxurian

Câu trả lời:


33

Vấn đề là, bạn không được phép lưu sản phẩm từ frontend.

Điều này được thực hiện thông qua thực tế là khi bạn tải một sản phẩm ở lối vào, origDatatài sản không được điền:

public function setOrigData($key=null, $data=null)
{
    if (Mage::app()->getStore()->isAdmin()) {
        return parent::setOrigData($key, $data);
    }

    return $this;
}

Vì vậy, khi bạn cố gắng lưu sản phẩm, lỗi bạn mô tả được nêu ra.

Bạn có thể giải quyết vấn đề này khi bạn thay đổi cửa hàng hiện tại thành quản trị viên, ví dụ như với mã từ @magboy:

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

sử dụng tốt hơn Mage_Core_Model_App_Emulation

Và giải pháp ưa thích của tôi là mở rộng Mage_Catalog_Model_Productvà thay thế setOrigDataphương pháp

public function setOrigData($key = null, $data = null)
{
    if (is_null($key)) {
        $this->_origData = $this->_data;
    } else {
        $this->_origData[$key] = $data;
    }
    return $this;
}

Tôi KHÔNG nói về việc viết lại ở đây! Chỉ sử dụng mô hình của bạn trên một nơi này để cho phép tiết kiệm. Sau đó, bạn có tính năng bảo mật vẫn hoạt động ở mọi nơi khác.


7

Hãy thử thêm dòng mã này:

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

Tôi không chắc tại sao bạn phải làm điều này ngay bây giờ trong phiên bản hiện tại của Magento. Có lẽ ai đó có thể giải thích?


sau khi tôi đặt cửa hàng hiện tại thành Quản trị viên và lưu sản phẩm, tôi có phải đặt lại giá trị ban đầu không?
Giuseppe

1
@Giuseppe Nó phụ thuộc vào những gì bạn đang làm sau này với yêu cầu; nó sạch hơn và sẽ dẫn đến ít vấn đề hơn nếu bạn làm điều đó
simonthesorcerer
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.