異なる属性を持つ複数のアイテムをプログラムでカートに追加する


15

カートに一括追加するシステムを作成しています。注意してください:私はそれがカスタムオプション付きのシンプルな製品で動作するようにしたい->カスタムオプションが色(赤、緑、青)またはサイズ(Xl、M、S)のような場合

人が以下のアイテムを注文したいとします:

  1. productA、redカラー、qty12
  2. ProductA、greenカラー、qty18
  3. ProductB XL、、数量3
  4. Product C、10個

したがって、これらの4つの項目をコード/プログラムで一度に追加します。これどうやってするの?クエリ文字列、またはそのためのコントローラまたは組み込み関数を介して可能ですか?参照ごとに1つのクエリまたは1つの関数呼び出しである必要はありません...


ええ正確にどのようにこれを行うことができます
-user1799722

どのタイプの製品を使用していますか?
アミットベラ

@AmitBera私はシンプルな製品を使用しています
user1799722

回答:


1

そのため、プログラムで商品をカートに追加するのは非常に簡単で、商品オブジェクトとカートセッションが必要です。

$quote = Mage::getSingleton('checkout/session')->getQuote();
$quote->addProduct($product, $qty);

$quote->collectTotals()->save();

これは、構成可能な製品やオプション付きの製品を追加するときはもう少し難しくなりますが、必要なのは製品オブジェクトに適切なオプションをロードすることだけです。

ここで必要なのは、配列の代わりに配列を渡すことです。$qtyこの配列は、追加する製品のタイプに応じて異なる方法でフォーマットする必要があります。

詳細については、次を参照してください。


私はちょうど属性PLSと単純なオブジェクトを追加したいのおかげで、私の質問再読
user1799722

1
@mourを使用すると、URLを介してカートに製品を追加できますが、複数の製品で機能するとは思わないので、複数の製品を追加するための回答のように独自のコントローラーを作成することをお勧めします。
デビッドマナーズ

1

しばらく前に使用した方法は次のとおりです。

// Products array
$productArray = array(
    // Simple product
    array(
        'product_id' => 1,
        'qty' => 1
    ),
    // Configurable product
    array(
        'product_id' => 4,
        'qty' => 1,
        'options' => array(
            'color' => 'Red'
        )
    )
);

// Prepare cart products
$cartProducts = array();
foreach ($productArray as $params) {
    if (isset($params['product_id'])) {
        // Load product
        $product = Mage::getModel('catalog/product')->load($params['product_id']);

        if ($product->getId()) {
            // If product is configurable and the param options were specified
            if ($product->getTypeId() == "configurable" && isset($params['options'])) {
                // Get configurable options
                $productAttributeOptions = $product->getTypeInstance(true)
                    ->getConfigurableAttributesAsArray($product);

                foreach ($productAttributeOptions as $productAttribute) {
                    $attributeCode = $productAttribute['attribute_code'];

                    if (isset($params['options'][$attributeCode])) {
                        $optionValue = $params['options'][$attributeCode];

                        foreach ($productAttribute['values'] as $attribute) {
                            if ($optionValue == $attribute['store_label']) {
                                $params['super_attribute'] = array(
                                    $productAttribute['attribute_id'] => $attribute['value_index']
                                );
                            }
                        }
                    }
                }
            }

            unset($params['options']);
            $cartProducts[] = array(
                'product'   => $product,
                'params'    => $params
            );

        }
    }
}

// Add to cart
$cart = Mage::getModel("checkout/cart");
if (!empty($cartProducts)) {
    try{
        foreach ($cartProducts as $cartProduct) {
            $cart->addProduct($cartProduct['product'], $cartProduct['params']);
        }

        Mage::getSingleton('customer/session')->setCartWasUpdated(true);
        $cart->save();
    } catch(Exception $e) {
        Mage::log($e->getMessage());
    }
}

とても簡単で、すぐに動作するようにテストされています。

私は2つの製品を含めました$productArray。1つはシンプルでもう1つは構成可能です。もちろん、さらに追加することができます。構成可能変数にsizecolorなどの2つのオプションがある場合は、オプション配列に追加するだけで済みます。


hiiおかげで私はカスタムオプションを使用してシンプルな製品で動作するようにしたいです
user1799722

したがって、「unset($ params ['options']);」という行をコメントアウトします その後、必ず製品が指定された製品のオプションを持って作る
Shaughn

1

カスタムオプションを備えたシンプルな製品を使用することは、Magentoで「サイズ」と「色」を使用する方法ではなく、次のようにカスタムオプションを備えた製品をカートに追加することができました。

/*
 * Assuming this is inside a method in a custom controller
 * that receives a $_POST
 */
$post = $this->getRequest()->getPost();

// load the product first
$product = Mage::getModel('catalog/product')->load($post['product_id']);
$options = $product->getOptions();

// this is the format for the $params-Array
$params = array(
    'product' => $product->getId(),
    'qty' => $post['qty'],
    'related_product' => null,
    'options' => array()
);
// loop through the options we get from $_POST
// and check if they are a product option, then add to $params
foreach( $post as $key => $value ) {
    if(isset($options[$key]) {
        $params['options'][$key] = $value; 
    }
}

// add the product and its options to the cart
$cart->addProduct($product, $params);

これはあなたが意味したものですか?複数の製品を追加する場合は、追加する製品ごとにこのプロセスを繰り返します。重要な要素は、常にproduct_id、qtyおよびオプションを指定すること$_POSTです。


1

次のようにCart Controllerを上書きすることにより、カスタムオプションを使用して複数のシンプルな製品を追加できます。

CartController.phpファイルをここに配置しました:https : //github.com/svlega/Multiple-Products-AddtoCart

        //Programatically Adding multiple products to cart
        $productArray = array(
            array(
                'product_id' => 7,
                'qty' => 2,
                'custom_options' => array(
                    'size' => 'XL'
                )
            ),
            array(
                'product_id' => 1,
                'qty' => 1,
                'custom_options' => array(
                    'color' => 'Red'
                )
            )   

        );

        // Prepare cart products
        foreach ($productArray as $params) {
            if (isset($params['product_id'])) {
                // Load product
                $product = Mage::getModel('catalog/product')->load($params['product_id']);

                if ($product->getId()) {
                    // If product is configurable and the param options were specified
                    if (isset($params['custom_options'])) {
                        // Get options                
                        $options = $product->getOptions();
                            foreach ($options as $option) {
                                /* @var $option Mage_Catalog_Model_Product_Option */                        
                                if ($option->getGroupByType() == Mage_Catalog_Model_Product_Option::OPTION_GROUP_SELECT) {                          

                                    $product_options[$option->getTitle()] = $option->getId();
                                    if(array_key_exists($option->getTitle(),$params['custom_options'])){
                                    $option_id =  $option->getId();                 
                                        echo '<br>Did'.$id = $option->getId().'Dlabe'.$option->getTitle();
                                    foreach ($option->getValues() as $value) {                          
                                        /* @var $value Mage_Catalog_Model_Product_Option_Value */                    
                                       if($value->getTitle()== $params['custom_options'][$option->getTitle()]){     
                                echo 'id'.$id = $value->getId().'labe'.$value->getTitle();
                                       $params['options'][$option->getId()]=$value->getId();
                                       }                                
                                    }
                                    }                          
                            }
                            }
                    }

                    try{
                    $cart = Mage::getModel('checkout/cart');
                    $cart->addProduct($product, $params);
                    $cart->save();
                    }catch(Exception $e) {
                    Mage::log($e->getMessage());
                    }

                }
            }
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.