1

現在、次の方法でカートに追加する際に、特定のオーダーラインにカスタム オプションを追加しようとしています。

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

数量を除いた上記の情報は、オーダーライン オブジェクトにまったく含まれておらず、ここからどこに移動すればよいかわかりません。

現時点では際限なくグーグルしているので、助けていただければ幸いです!!

これで製品モデル オブジェクトを 2 回インスタンス化していることは評価していますが、計画は、それを機能させてから最適化することです。:)

4

2 に答える 2

0

商品をカートに追加する前に、商品のカスタム オプションを設定する必要があります。

$product->setCustomOptions($options);

カスタムオプションのMage_Sales_Model_Quote::_addCatalogProduct()がカートアイテムに追加されます。

ここも参照してください: http://www.magentocommerce.com/boards/viewthread/49659/

ところで、foreach ループで製品を 2 回ロードしているため、コードがかなり遅くなる可能性があります。代わりに製品コレクションを使用して、リファクタリングを検討する必要があります。また、ここで変数に直接アクセスするのはちょっとハックに見え$_SESSIONます。そのためにチェックアウト セッションを使用することもできます ( Mage::getSingleton('checkout/session'))。

于 2013-10-11T10:13:42.070 に答える