Вам понадобится наблюдатель:
<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);
}
}
Простой пример, но он может помочь.
Связанные продукты могут быть сложными для понимания при работе с ним через код:
Вот пример изображения:
У каждого продукта в комплекте есть один ко многим параметрам, которые в конце будут ссылками на продукты, которые будут добавлены в пакет в Корзине.
Каждый вариант состоит из одного-многих вариантов, которые будут связаны между собой продуктами, которые окажутся в корзине покупок в рамках этого продукта. Один выбор, как правило, может быть установлен по умолчанию и уже будет выбран на странице продукта. По этой ссылке можно найти больше информации о том, как создавать и настраивать связанные продукты, потому что в этом документе мы обсудим только его программную часть.
Страница отображения продукта в комплекте будет выглядеть следующим образом:
Это может выглядеть следующим образом в корзине после нажатия «Добавить в корзину»:
Образец комплекта
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);
Теперь у нас есть коллекция опций, и у каждой опции будет коллекция опций. Теперь мы можем просмотреть варианты и посмотреть их выбор.
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
}
}
}
Этот код получает параметры из связанного продукта элемента цитаты, а затем получает параметры для этого продукта в коллекции, а затем находит «выбранный» вариант выбора.
НТН,
Shaun