【问题标题】:Adding custom option to order line将自定义选项添加到订单行
【发布时间】:2013-10-11 09:55:42
【问题描述】:

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

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 根本不在 orderline 对象中,我似乎无法从这里继续前进。

目前无休止地在谷歌上搜索,因此非常感谢您的帮助!

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

【问题讨论】:

    标签: php magento options cart


    【解决方案1】:

    您必须先为产品设置自定义选项,然后再将其添加到购物车。

    $product->setCustomOptions($options);
    

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

    参见此处:http://www.magentocommerce.com/boards/viewthread/49659/

    顺便说一句:您的代码可能很慢,因为您在 foreach 循环中加载了两次产品。您应该考虑改用产品集合进行一些重构。此外,在这里直接访问$_SESSION 变量看起来有点骇人听闻。您最好使用 Checkout Session (Mage::getSingleton('checkout/session'))。

    【讨论】:

    • 我担心你会说,包系统是一个完全独立于前端的实体,设置自定义选项我相信需要前端在添加时定义自定义选项到购物车。有没有其他方法可以将自定义数据附加到报价项目而不触及产品对象中的任何内容?至于速度慢,是的,我确实在问题的底部提到了它,目前它只是在本地开发环境中,我将进行优化! :)
    【解决方案2】:

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

    加入后: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 会给你很多提示来解决它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2021-02-22
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多