옵저버를 사용하여 카트에 제품을 추가하기 위해 사용자 정의 옵션 및 상품 만들기


15

관찰자가 checkoutCartProductAddAfter 이벤트를 관찰하고 제품이 장바구니에 추가 된 후 발생하는 관찰자를 사용하여 인용 항목에 사용자 정의 옵션을 추가하고 싶습니다.

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

관찰자가 작동하지만 추가 된 제품에 사용자 지정 옵션을 추가 할 수 없습니다. 추가 된 제품에 옵저버를 사용하여 사용자 정의 옵션을 추가하는 데 도움을주십시오.


또한 옵저버에서 제품의 사용자 지정 가격을 변경할 수 있도록합니다. 맞춤 가격을 0에 추가하고 싶습니다. 미리 감사드립니다
Keyur Patel

답변:


19

@Tim은 주말에이 문제에 대해 이야기했습니다 : https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

원하는 것은 방법 2 : Config.xml에 다음 이벤트 추가

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

Observer.php에서 다음 메소드를 추가하십시오.

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

이 주제에 대한 자세한 내용은 다음과 같습니다.

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

그리고 더:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266


1
첫째 : 새로운 답변 대신 의견을 사용하십시오. 그런 다음 루프에 제품 검사를 삽입하여 원하는 제품 만 옵션을 사용할 수 있습니다.
Fabian Blechschmidt 2016 년

1
다시이 위대한 디버깅 응답과 코멘트에 봐주십시오 magento.stackexchange.com/a/429/217
파비안 Blechschmidt

1
위에서 설명한 단계를 통해 가능합니다
Fabian Blechschmidt

2
제안 해 주셔서 감사합니다. 장바구니에 담을 때 구성 가능한 제품을 사용하고 있기 때문에 두 개의 품목을 받았으며 마지막 견적 항목을 업데이트하여 문제를 해결했습니다.
Milople Inc

1
나도 아니지만 링크를 업데이트했습니다. 감사!
Fabian Blechschmidt

3

사용자 정의 옵션을 즉시 추가하기위한 적절한 이벤트는 catalog_product_type_prepare_full_options입니다.이 옵션은 사용자 정의 옵션이있는 제품이 견적 항목으로 변환되기 직전에 트리거됩니다.

자체 buyRequest 데이터가 제품 속성 또는 옵션에 영향을 미치는 경우 이벤트 관찰자 catalog_product_type_prepare_{$processMode}_options 가 올바른 선택입니다. 여기서 $processMode유효성 검사 모드는 "전체"또는 "라이트"일 수 있습니다. "전체"모드는 제품이 카트에 정기적으로 추가 될 때 사용되며 필요한 모든 옵션이 설정되어 있고 전체 구성이 유효한지 확인합니다. "lite"모드에서는 요청에 포함 된 옵션 만 확인되며, 위시리스트에 제품을 추가 할 때 사용되지만 백엔드에서 주문을 생성 할 때도 사용할 수 있습니다. 어떤 경우 든 데이터를 처리하기 위해 두 이벤트 모두에 대해 관찰자를 등록 할 수 있습니다. 검증이 있으면 물론 이벤트를 차별화해야합니다.

이벤트는 Mage_Catalog_Model_Product_Type_Abstract :: _ prepareOptions ()에서 트리거되며 다음 매개 변수를 사용할 수 있습니다.

  • transport: 모든 사용자 정의 옵션 (예 : 번들 옵션과 같은 다른 옵션은 없음)의 전송 객체이므로 관찰자에서 변경할 수 있습니다. transport-> options는 option_id => option_value 형식의 배열입니다. 주의, 전송 자체는 예상대로 Varien_Object의 인스턴스가 아닌 stdClass 객체입니다. 따라서 전송-> 옵션에 대한 getter 및 setter 메소드가 없습니다.
  • buy_request: buyRequest 객체는 여기에서 읽고 수정할 수 있습니다.
  • product: 나중에 견적 항목으로 변환 될 제품입니다. 여기서 속성을 조작하거나 동적으로 추가 할 수 있습니다. 그러나 변환 과정에서 여전히 고려해야합니다. 이 이벤트에 사용 된 이벤트 sales_quote_product_add_after는 나중에 만 트리거됩니다.

출처: Magento buyRequest 객체 – 참조

따라서 관찰자는 다음과 같이 보일 수 있습니다.

public function addCustomOption(Varien_Event_Observer $observer)
{
    $transport = $observer->getTransport();
    if (this_item_should_be_free()) { // implement your condition here
        $transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
    }
}

동적으로 추가 된이 사용자 정의 옵션에 대한 가격을 설정할 수는 없지만 다음 catalog_product_get_final_price과 같이 두 번째 관찰자를 사용하여 견적 항목의 가격을 변경할 수 있습니다 .

public function adjustFinalPrice($observer) {

    $product = $observer->getProduct();
    // Set price to "0" if custom option "Free Gift" has been set
    if ($product->getCustomOption('Free Gift')) {
        $product->setFinalPrice(0);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.