У меня есть функция, которая связана с наблюдателем событий
Одно из требований заключается в том, что при циклическом просмотре данных позиции заказа, если определенный атрибут продукта пуст, он отправляет запрос на получение конкретных данных через отдельную модель (работает нормально).
код проблемы в основном сводится к этому
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();
}
Однако Magento бросает исключение
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}
Почему я мог бы использовать идентичный код в стороннем скрипте вне наблюдателя magento просто отлично, но когда я пытаюсь запустить его внутри этого наблюдателя, происходит сбой с этим случайным сообщением об ошибке?
foreach
. Трассировка стека показывает, что событие отправлено, а наблюдатель неисправен. Вы уверены, что$order->getAllItems()
перенастраиваетarray()
? использовать:Zend_Debug::dump($order->getAllItems());
. Тем не менее, это может быть другой наблюдатель с плохим кодом?Ответы:
Проблема в том, что вам не разрешено сохранять продукты с внешнего интерфейса.
Это достигается за счет того, что при загрузке продукта в веб-интерфейсе
origData
свойство не заполняется:Поэтому, когда вы пытаетесь сохранить продукт, возникает ошибка, которую вы описываете.
Вы можете решить эту проблему, либо изменив текущее хранилище на admin, например, с помощью кода @magboy:
лучше использовать
Mage_Core_Model_App_Emulation
И мое предпочтительное решение состоит в том, чтобы расширить
Mage_Catalog_Model_Product
и заменитьsetOrigData
методЯ НЕ говорю о переписывании здесь! Используйте эту модель только в одном месте, чтобы включить сохранение. Тогда у вас есть функция безопасности, все еще активная везде.
источник
Попробуйте добавить эту строку кода:
Я не уверен, почему вы должны сделать это сейчас в текущей версии Magento. Может быть, кто-то еще может объяснить?
источник