将自定义选项添加到订单行


Adding custom option to order line

我目前正在尝试通过以下方式将自定义选项添加到购物车的特定订单行:

public function addToPackageQuote()
{
    $cart = Mage::getSingleton("checkout/cart");
    $quote = Mage::getSingleton("checkout/session")->getQuote();
    $packageId = Mage::getModel('MyTuxedo_OPP/Package')->checkPackageId();
    $products = $this->sortArray();
    foreach ($products as $productInfo) {
        try {
            $split = explode(",", $productInfo);
            $_product = Mage::getModel('catalog/product')->load($split[0]);
            if($_product->isConfigurable()) {
                $simpleId = $this->getConfigurableSimple($split[1],$split[3],$split[0]);
            } else {
                $simpleId = $split[0];
            }
            $product = Mage::getModel('catalog/product')->load($simpleId);
            $options = new Varien_Object(array(
                "qty" => 1,
                "custom_options" => array(
                    "package" => $packageId,
                    "packageName" => Mage::helper('MyTuxedo_OPP')->getPackageName()
                )
            ));
            $quote->addProduct($product, $options);
            $this->_getSession()->setCartWasUpdated(true);
            $quote->save();
        } catch (Exception $e) {
            echo $e->getMessage();
        }
        $this->addFreeItems();
    }
    $cart->save();
    unset($_SESSION['products']);
    unset($_SESSION['productId']);
    $cart->save();
    // Let's unset all the package sessions (apart from a few that are needed!).
    $this->kill();
}

此方法与通用添加到购物车处理程序完全分开,并且纯粹在包系统中使用,以便它专门添加简单产品(还分解可配置的超级属性以查找简单产品(。

这些简单的产品在Magento后端中没有附加自定义选项,也不是向产品本身添加自定义选项的目标。我想做的是将自定义选项附加到订单行,然后在购买时将其转移到订单中。如此有效地在添加到购物车方法中添加的数据,而不是其他地方!

添加到购物车方法按预期工作,只是不包括我尝试附加的自定义选项。我还尝试简单地定义选项对象:

$options = new Varien_Object(array(
"qty" => 1,
"package" => $packageId,
"packageName" => Mage::helper('MyTuxedo_OPP')->getPackageName()
 )

上述信息(不包括 qty(根本不在订单行对象中,我似乎无法弄清楚从这里继续前进。

目前无休止地谷歌搜索,所以一些帮助将不胜感激!!

我很感激我在这里实例化产品模型对象两次,但是计划只是让它工作然后优化! :)

在将产品添加到购物车之前,您必须为产品设置自定义选项。

$product->setCustomOptions($options);

Mage_Sales_Model_Quote::_addCatalogProduct()自定义选项将添加到购物车项目中。

另请参阅此处:http://www.magentocommerce.com/boards/viewthread/49659/

顺便说一句:您的代码可能很慢,因为您在 foreach 循环中加载产品两次。您应该考虑改用产品集合进行一些重构。在这里直接访问$_SESSION变量看起来有点黑客。您宁愿为此使用结帐会话(Mage::getSingleton('checkout/session')(。

经过很多头痛,我现在已经解决了这个问题。您可以将自定义选项添加到购物车,而不必实例化产品对象并保存自定义选项来执行此操作,这可以通过粘附到观察器上并拉取报价项来完成。

后跟踪:sales_quote_add_item

然后我使用了:

public function addCustomData($observer) {
$event = $observer->getEvent();
$quote_item = $event->getQuoteItem();
$quote = $session->getQuote();
$quote_item->addOption(array("product_id" => $quote_item->getProduct()->getId(),
                             "product" => $quote_item->getProduct(),
                             "code" => 'PackageId',
                             "value" => Mage::getModel('MyTuxedo_OPP/Package')->checkPackageId()
                       ));
$quote->save();
}

包含产品对象和 id 是最重要的,因为该函数由于某种原因不使用加载的对象。

然后,您可以通过以下方式获取对象:

$_item->getOptionByCode('PackageId')->getValue();

快速方便的信息,如果它在你面前转储堆栈跟踪,它找不到定义的选项,丢失getValue(((如果使用var_dump(函数以查看您是否获得空值,否则xdebug会给你大量的提示来绕过它。