Magento: добавление простых продуктов из пакета в отдельные строки в корзине

Мой клиент просит, чтобы каждый простой продукт в комплекте продукта, который они продавали (одежда Top и Bottom), добавлялся в отдельную позицию в корзине всякий раз, когда пользователь ее добавлял. Может ли кто-нибудь направить меня на то, как это сделать? Я неплохо разбираюсь в MVC и Zend Framework, но мне нужна помощь в поиске точных файлов, которые управляют добавлением в корзину пакетов, или альтернативным методом для добавления этих элементов отдельно. Предположим, что единственным возможным типом продукта для этой одежды является тип продукта Bundled.

Solutions Collecting From Web of "Magento: добавление простых продуктов из пакета в отдельные строки в корзине"

Вам понадобится наблюдатель:

<checkout_cart_product_add_after> <observers> <reporting> <type>singleton</type> <class>Yourcompany_yourmodelname_Model_Observer</class> <method>onCartProductAdd</method> </reporting> </observers> </checkout_cart_product_add_after> 

Затем наблюдатель:

 class ourcompany_yourmodelname_Model_Observer extends Mage_Core_Model_Abstract { /** * Binds to the checkout_cart_product_add_after Event and passes control to the helper function to process the quote * * @param Varien_Event_Observer $observer * @return void */ public function onCartProductAdd($observer){ $product = $observer->getProduct(); $isProductBundle = ($product->getTypeId() == 'bundle'); $items_to_add = array(); $oTypeInstance = $oProduct->getTypeInstance(true); $aSelections = $oTypeInstance->getSelectionsCollection($aOptionIds, $product ); $aOptions = $oTypeInstance->getOptionsByIds($aOptionIds, $product); $bundleOptions = $aOptions->appendSelections($aSelections, true); foreach ($bundleOptions as $bundleOption) { if ($bundleOption->getSelections()) { $bundleSelections = $bundleOption->getSelections(); foreach ($bundleSelections as $bundleSelection) { $items_to_add[] = $bundleSelection.getID(); } } } insertExtractedProducts($items_to_add); } /** * Add extracted products into quote * * @param array $items_to_add */ public function insertExtractedProducts($items_to_add){ /**@var $cart Mage_Checkout_Model_Cart**/ $cart = Mage::helper('checkout/cart')->getCart(); $ids_to_add = array(); foreach($items_to_add as $item_to_be_added){ $ids_to_add[] = $item_to_be_added->getProductId(); } $cart->addProductsByIDs($ids_to_add); $cart->save(); Mage::getSingleton('checkout/session')->setCartWasUpdated(true); } } 

Просто простой образец, но он может помочь.

Связанные продукты могут быть сложными для понимания при работе с ним через код: Вот пример изображения: введите описание изображения здесь

Каждый продукт Bundled имеет один-много вариантов, который, в конце концов, будет ссылками на продукты, которые будут добавлены в комплект поставки в корзине покупок.

Каждый вариант состоит из одного-нескольких вариантов, которые будут связанными продуктами, которые попадут в корзину покупок, под этот комплектный продукт. Один выбор, как правило, может быть установлен по умолчанию и уже выбран на странице продукта. Более подробную информацию можно найти по этой ссылке о том, как создавать и настраивать связанные продукты, потому что в этом документе мы обсудим только ее сторону программирования. Отображаемая страница в комплекте продукта будет выглядеть так: введите описание изображения здесь

Он может выглядеть так в корзине покупок, как только вы нажмете «Добавить в корзину»: Образец связки

 Sample Shampoo 1 x Moisturiser-125ml $29.95 Default Conditioner 1 x Moisturiser-60g $99.95 

При опросе этого продукта с помощью кода вы загружаете его, как любой обычный продукт:

 $oProduct->load($vProductId); 

После его загрузки вам нужно получить экземпляр типа продукта, чтобы вы могли загрузить параметры этого типа продукта.

 $oTypeInstance = $oProduct->getTypeInstance(true); 

Теперь мы можем получить список идентификаторов параметров для этого продукта таким образом:

 $oTypeInstance = $oProduct->getTypeInstance(true); 

Чтобы опросить выборки, мы добавим список опций в коллекцию, затем получим коллекцию опций, а также их соответствующие выборки:

 $aSelections = $oTypeInstance->getSelectionsCollection($aOptionIds, $oProduct ); $aOptions = $oTypeInstance->getOptionsByIds($aOptionIds, $oProduct); $bundleOptions = $aOptions->appendSelections($aSelections, true); 

Теперь у нас есть коллекция опций, и каждый вариант будет иметь набор Selections. Теперь мы можем перебирать варианты и просматривать их Selctions.

 foreach ($bundleOptions as $bundleOption) { if ($bundleOption->getSelections()) { $bundleSelections = $bundleOption->getSelections(); foreach ($bundleSelections as $bundleSelection) { // get some data here $vName = $bundleOption->getTitle(); } } } 

Чтобы получить список требуемых продуктов выбора для поставляемого продукта, вы можете использовать следующий код:

 $requiredChildren = $this->getChildrenIds($product->getId(),$required=true); 

Затем вы можете прокрутить массив идентификаторов и загрузить продукты по их идентификаторам, чтобы получить дополнительную информацию об этих продуктах.

Связанные продукты в корзине покупок

Чтобы перебрать выбранные параметры связанного продукта в карточке покупок, вы можете использовать что-то вроде этого:

 /** * @var Mage_Bundle_Model_Product_Type */ $typeInstance = $this->getProduct()->getTypeInstance(true); // get bundle options $optionsQuoteItemOption = $this->getItem()->getOptionByCode('bundle_option_ids'); $bundleOptionsIds = unserialize($optionsQuoteItemOption->getValue()); if ($bundleOptionsIds) { /** * @var Mage_Bundle_Model_Mysql4_Option_Collection */ $optionsCollection = $typeInstance->getOptionsByIds($bundleOptionsIds, $this->getProduct()); // get and add bundle selections collection $selectionsQuoteItemOption = $this->getItem()->getOptionByCode('bundle_selection_ids'); $selectionsCollection = $typeInstance->getSelectionsByIds( unserialize($selectionsQuoteItemOption->getValue()), $this->getProduct() ); $bundleOptions = $optionsCollection->appendSelections($selectionsCollection, true); foreach ($bundleOptions as $bundleOption) { if ($bundleOption->getSelections()) { $label = $bundleOption->getTitle() $bundleSelections = $bundleOption->getSelections(); foreach ($bundleSelections as $bundleSelection) { $sName = $bundleSelection->getName(); } // some more code here to do stuff } } } 

Этот код получает параметры из связанного с цитатой компонента, а затем получает параметры для этого продукта в коллекции, а затем находит опцию «Выбранный вариант».

hth, Shaun

Я сделал это, чтобы решить запрос клиента, чтобы добавить содержимое пакета в виде отдельных элементов в корзине. Просто замените

 $cart->addProduct($product, $params) 

с

 if ($product->getTypeId() == 'bundle') { $request = new Varien_Object($params); $cartCandidates = $product->getTypeInstance(true)->prepareForCartAdvanced($request, $product, Mage_Catalog_Model_Product_Type_Abstract::PROCESS_MODE_FULL); $idstoadd = array(); foreach ($cartCandidates as $cartCandidate) { if ($cartCandidate->getTypeId() == 'simple') { for ($i = 0; $i < $cartCandidate->getCartQty(); $i++) { $idstoadd[] = $cartCandidate->getId(); } } } $cart->addProductsByIds($idstoadd); } else { $cart->addProduct($product, $params); } 

в файле cartController .