向订单行添加自定义选项

时间:2013-10-11 09:55:42

标签: php magento options cart

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

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后端没有附加自定义选项,也不是为产品本身添加自定义选项的目标。我想要做的是将自定义选项附加到订单行,然后在购买时转移到订单。这样有效的数据是在add to cart方法中添加的,而不是其他地方!

“添加到购物车”方法按预期工作,它不包括我尝试附加的自定义选项。我也尝试过简单地定义options对象:

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

以上信息,不包括qty根本不在订单行对象中,我似乎无法找到从这里继续前进的地方。

此刻谷歌无穷无尽,所以一些帮助将是最受赞赏的!

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

2 个答案:

答案 0 :(得分:0)

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

$product->setCustomOptions($options);

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

另见:http://www.magentocommerce.com/boards/viewthread/49659/

顺便说一下:你的代码可能很慢,因为你在foreach循环中加载产品两次。您应该考虑使用产品集合进行一些重构。此外,直接访问$_SESSION变量看起来有些迟钝。您可以使用Checkout会话(Mage::getSingleton('checkout/session'))。

答案 1 :(得分:0)

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

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

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

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

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

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