जब दृश्यपटल पर घटना पर्यवेक्षक के अंदर उत्पाद को बचाने की कोशिश करते समय मैगेंटो विफल हो जाता है?


15

मेरे पास एक फ़ंक्शन है जो एक घटना पर्यवेक्षक से जुड़ा हुआ है

आवश्यकताओं में से एक यह है कि जब यह ऑर्डर आइटम डेटा के माध्यम से लूप करता है, अगर एक निश्चित उत्पाद विशेषता खाली है तो यह एक अलग मॉडल (ठीक काम) के माध्यम से विशिष्ट डेटा प्राप्त करने के लिए अनुरोध जारी करता है।

समस्या कोड मूल रूप से इसको उबालता है

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 के पर्यवेक्षक के बाहर एक 3 पार्टी स्क्रिप्ट में समान कोड का उपयोग करने में सक्षम क्यों होगा, लेकिन जब मैं इसे उस पर्यवेक्षक के अंदर चलाने की कोशिश करता हूं, तो यह उस यादृच्छिक त्रुटि संदेश के साथ विफल हो जाता है?


यह त्रुटि गैर-सरणी में पार्स किए जाने के लिए विशिष्ट है foreach। स्टैक ट्रेस आपको दिखाता है कि कोई ईवेंट भेजा गया है और पर्यवेक्षक दोषपूर्ण है। क्या आप सुनिश्चित हैं $order->getAllItems()कि रिटेनिंग ए है array()? का उपयोग करें: Zend_Debug::dump($order->getAllItems());। हालाँकि, यह कुछ बुरे कोड के साथ एक और पर्यवेक्षक हो सकता है?
राख

समस्या Magento के कोर कोड के साथ है, शीर्ष पर मेरे स्निपेट के साथ नहीं।
Zxurian

जवाबों:


33

समस्या यह है, कि आपको उत्पादों को फ़्रंट से बचाने की अनुमति नहीं है।

यह इस तथ्य के माध्यम से किया जाता है, कि जब आप किसी उत्पाद को फ्रंटएंड में लोड करते origDataहैं , तो संपत्ति भरी नहीं जाती है:

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

    return $this;
}

इसलिए जब आप उत्पाद को बचाने की कोशिश करते हैं, तो आपके द्वारा वर्णित त्रुटि को उठाया जाता है।

आप इस समस्या को तब हल कर सकते हैं जब आप वर्तमान स्टोर को व्यवस्थापन में बदलते हैं, जैसे @magboy के कोड के साथ:

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

बेहतर उपयोग Mage_Core_Model_App_Emulation

और मेरा पसंदीदा समाधान विधि का विस्तार Mage_Catalog_Model_Productऔर प्रतिस्थापित करना setOrigDataहै

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

मैं यहाँ फिर से लिखने की बात नहीं कर रहा हूँ ! बचत को सक्षम करने के लिए केवल इस एक जगह पर अपने मॉडल का उपयोग करें। फिर आपके पास सुरक्षा-सुविधा अभी भी हर जगह सक्रिय है।


7

इस कोड को जोड़ने की कोशिश करें:

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

मुझे यकीन नहीं है कि अब आपको Magento के वर्तमान संस्करण में ऐसा क्यों करना है। शायद कोई और समझा सकता है?


के बाद मैं व्यवस्थापक को मौजूदा दुकान सेट और उत्पाद को बचाया, क्या मुझे इसे मूल मूल्य पर वापस सेट करना है?
ग्यूसेप

1
@Giuseppe यह निर्भर करता है कि आप अनुरोध के साथ बाद में क्या कर रहे हैं; यह क्लीनर है और कम मुद्दों को जन्म देगा यदि आप इसे करते हैं
simonthesorcerer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.