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

6g8kf2rb  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(183)

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

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

上面的信息,不包括数量,根本不在orderline对象中,我似乎无法找到从这里继续前进的地方。
现在不停地在谷歌上搜索,所以一些帮助将是最感激的!!
我很感激我在这里两次示例化产品模型对象,但是计划只是让它工作,然后优化!:)

vh0rcniy

vh0rcniy1#

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

$product->setCustomOptions($options);

Mage_Sales_Model_Quote::_addCatalogProduct()中,自定义选项将添加到购物车项目中。
另请参阅此处:http://www.magentocommerce.com/boards/viewthread/49659/
顺便说一句:您的代码可能会很慢,因为您在foreach循环中加载了两次产品。您应该考虑使用产品集合进行一些重构。而且,直接访问$_SESSION变量看起来有点笨拙。您可以使用Checkout Session来实现(Mage::getSingleton('checkout/session'))。

bwleehnv

bwleehnv2#

我现在已经解决了这个问题,经过了很多头痛。你可以添加一个自定义选项到购物车,而不必示例化产品对象和保存一个自定义选项来做到这一点,它可以通过钉到一个观察者,并拉报价项目。
钉后:销售报价单添加物料
我接着用:

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会给予你一大堆提示来解决它。

相关问题