프로그래밍 방식으로 장바구니에 다른 속성을 가진 여러 항목 추가


15

장바구니 시스템에 대량 추가를하고 있습니다. 참고 : 사용자 정의 옵션이있는 간단한 제품에서 작동하기를 원합니다-> 사용자 정의 옵션이 색상 (빨강, 녹색, 파랑) 또는 크기 (Xl, M, S)와 같은 경우

한 사람이 아래 항목을 주문한다고 가정합니다.

  1. productA, red칼라, qty12
  2. ProductA, green칼라, qty18
  3. ProductB, XL수량 3
  4. Product C, 수량 10

그래서이 4 개의 항목을 코드 / 프로그래밍 방식으로 한 번에 추가하고 싶습니다. 어떻게해야합니까? 쿼리 문자열 또는 컨트롤러를 통해 가능합니까, 내장 함수입니까? 참조 당 하나의 쿼리 또는 하나의 함수 호출 일 필요는 없습니다 ...


그래 정확히 어떻게 내가 이것을 할 수
있습니까

어떤 유형의 제품을 사용하고 있습니까?
Amit Bera

@AmitBera 나는 간단한 제품을 사용하고 있습니다
user1799722

답변:


1

따라서 프로그래밍 방식으로 장바구니에 제품을 추가하는 것은 매우 간단합니다. 제품 객체와 장바구니 세션 만 있으면됩니다.

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

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

옵션이있는 구성 가능 제품 또는 제품을 추가 할 때 조금 더 어려우므로 필요한 옵션을 사용하여 제품 객체를로드하기 만하면됩니다.

이제 당신이해야 할 일은 대신 배열을 전달하는 것입니다. $qty이 배열은 추가하는 제품 유형에 따라 다른 방식으로 포맷되어야합니다.

자세한 내용은 다음을 참조하십시오.


고맙습니다 그냥 속성 pls와 함께 간단한 개체를 추가하고 싶습니다 내 질문을 다시 읽으십시오
user1799722

1
@mour를 사용하면 url을 통해 장바구니에 제품을 추가 할 수 있지만 여러 제품에서 작동한다고 생각하지 않으므로 여러 제품을 추가하는 내 대답과 같이 자체 컨트롤러를 구축하는 것이 좋습니다.
David Manners

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

그것은 꽤 직설적이며 지금 작동하도록 테스트되었습니다.

$productArray하나는 간단 하고 다른 하나 는 구성 가능한 두 개의 제품을 포함 하고 있습니다 . 분명히 더 많은 것을 추가 할 수 있고 구성 가능에 sizecolor 와 같은 2 개의 옵션이 있는 경우 options 배열에 추가 할 수 있습니다.


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.