Magento, ön uçtaki olay gözlemcisinin içine ürün kaydetmeye çalışırken başarısız oluyor mu?


15

Bir olay gözlemcisine bağlı bir fonksiyonum var

Gereksinimlerden biri, sipariş kalemi verileri arasında dolaştığında, belirli bir ürün özelliği boşsa, ayrı bir model (belirli para cezası) aracılığıyla belirli verileri almak için bir istek yayınlamasıdır.

problem kodu temelde buna dayanır

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

ancak 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}

Neden magento gözlemci dışında bir üçüncü taraf komut dosyasında aynı kodu kullanabilmek için iyi, ama bu gözlemci içinde çalıştırmaya çalıştığınızda, bu rastgele hata iletisi ile başarısız?


Bu hata, ayrıştırılmamış bir dizi olmayan tipiktir foreach. Yığın izlemesi size bir olayın gönderildiğini ve gözlemcinin hatalı olduğunu gösterir. $order->getAllItems()Bir tekrar ayarladığınızdan emin misiniz array()? kullanın: Zend_Debug::dump($order->getAllItems());. Ancak, kötü kodlu başka bir gözlemci olabilir mi?
kül

sorun Magento çekirdek kodunda, üstteki snippet'imde değil.
Zxurian

Yanıtlar:


33

Sorun, ürünleri ön uçtan kaydetmenize izin verilmemesidir.

Bu, ön uçta bir ürün yüklediğinizde, origDatamülkün doldurulmaması gerçeğiyle gerçekleştirilir :

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

    return $this;
}

Dolayısıyla ürünü kaydetmeye çalıştığınızda, açıkladığınız hata ortaya çıkar.

Bu sorunu, geçerli depoyu admin olarak değiştirdiğinizde, örneğin @magboy koduyla çözebilirsiniz:

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

daha iyi kullanmak Mage_Core_Model_App_Emulation

Ve benim tercih ettiğim çözüm yöntemi genişletmek Mage_Catalog_Model_Productve değiştirmeksetOrigData

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

Ben değilim DEĞİL burada Yeniden yazma bahsediyor! Tasarrufu sağlamak için modelinizi yalnızca bu yerde kullanın. Sonra güvenlik özelliği hala her yerde aktif.


7

Bu kod satırını eklemeyi deneyin:

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

Bunu şimdi Magento'nun şu anki sürümünde yapmak zorunda olduğunuzdan emin değilim. Belki başka biri açıklayabilir?


akım deposunu Yönetici olarak ayarlayıp ürünü kaydettikten sonra, orijinal değerine geri ayarlamam gerekir mi?
Giuseppe

1
@Giuseppe Daha sonra istekle ne yaptığınıza bağlıdır; daha temiz ve bunu yaparsanız daha az sorunlara yol açar
simonthesorcerer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.