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