사용자 정의 옵션을 즉시 추가하기위한 적절한 이벤트는 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);
}
}