問題描述
我的客戶要求在用戶添加時(shí),將他們銷售的捆綁產(chǎn)品中的每個(gè)簡單產(chǎn)品(上衣和下衣)作為單獨(dú)的行項(xiàng)目添加到購物車中.誰能指導(dǎo)我如何做到這一點(diǎn)?我對(duì) MVC 和 Zend 框架相當(dāng)擅長,但我需要一些幫助來找到控制將捆綁產(chǎn)品添加到購物車的確切文件,或者另一種方法來單獨(dú)添加這些項(xiàng)目.請(qǐng)假設(shè)此服裝唯一可能的產(chǎn)品類型是捆綁產(chǎn)品類型.
My client is requesting that each simple product within a bundled product they are selling (Clothing Top and Bottom) be added as a separate line item in the cart whenever a user adds it. Can anyone direct me in how to accomplish this? I am fairly good with MVC and the Zend Framework, but I need a bit of help finding the exact files that control adding bundled products to the cart, or an alternate method for getting these items added separately. Please assume that the only possible product type for this clothing is the Bundled product type.
推薦答案
你需要一個(gè)觀察者:
<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);
}
}
只是一個(gè)簡單的示例,但可能會(huì)有所幫助.
Just a simple sample, but it might help.
捆綁產(chǎn)品在通過代碼使用時(shí)可能會(huì)很復(fù)雜,難以理解:這是一個(gè)示例圖像:
Bundled products can be complicated to understand, when working with it via code: Here is a sample image:
每個(gè)捆綁產(chǎn)品都有一對(duì)多的選項(xiàng),最終將是要添加到購物車中捆綁產(chǎn)品的鏈接.
Each Bundled product, have one to many options, which in the end will be links to products to be added to the bundle in the Shopping Cart.
每個(gè)選項(xiàng)由一對(duì)多的選擇組成,這些選擇將是最終出現(xiàn)在購物車中的鏈接產(chǎn)品,位于此捆綁產(chǎn)品下.一個(gè)選擇,通常可以設(shè)置為默認(rèn)值,并且已經(jīng)在產(chǎn)品頁面上被選中.可以在此鏈接中找到有關(guān)如何創(chuàng)建和配置捆綁產(chǎn)品的更多信息,因?yàn)樵诒疚臋n中,我們將只討論它的編程方面.捆綁產(chǎn)品的顯示頁面將如下所示:
Each Option consists of one to many Selections, which will be the linked products that will end up in the Shopping cart, under this bundled product. One Selection, can typically be set as the default, and will already be selected on the product page. More information can be found at this link on how to create and configure bundled products, because in this document, we will only discuss the programming side of it. The bundled product’s display page, will look like this:
點(diǎn)擊添加到購物車"后,它在購物車中可能看起來像這樣:捆綁樣品
It could look like this in the shopping cart, once you clicked on "Add to Cart": Bundle Sample
Sample Shampoo
1 x Moisturiser-125ml $29.95
Default Conditioner
1 x Moisturiser-60g $99.95
當(dāng)通過代碼查詢這個(gè)產(chǎn)品時(shí),你像任何普通產(chǎn)品一樣加載它:
When interrogating this product through code, you load it like any normal product:
$oProduct->load($vProductId);
一旦加載完畢,您需要獲取一個(gè)產(chǎn)品類型實(shí)例,以便您可以加載該產(chǎn)品類型的選項(xiàng).
Once it is loaded, you need to get a product type instance, so that you can load the options for this product type.
$oTypeInstance = $oProduct->getTypeInstance(true);
現(xiàn)在我們可以通過這種方式獲取此產(chǎn)品的選項(xiàng) ID 列表:
Now we can get the list of option ID’s for this product in this manner:
$oTypeInstance = $oProduct->getTypeInstance(true);
為了查詢選擇,我們將選項(xiàng)列表添加到集合中,然后獲取選項(xiàng)集合,以及它們各自的選擇:
To interrogate the Selections, we will add the list of options to a collection, then get the Options collection, as well as their respective Selections:
$aSelections = $oTypeInstance->getSelectionsCollection($aOptionIds, $oProduct );
$aOptions = $oTypeInstance->getOptionsByIds($aOptionIds, $oProduct);
$bundleOptions = $aOptions->appendSelections($aSelections, true);
現(xiàn)在我們有一個(gè)選項(xiàng)集合,每個(gè)選項(xiàng)都有一個(gè)選擇集合.我們現(xiàn)在可以遍歷選項(xiàng),并查看它們的選擇.
Now we have a Collection of Options, and each Option will have a collection of Selections. We can now loop through the options, and look at their Selctions.
foreach ($bundleOptions as $bundleOption) {
if ($bundleOption->getSelections()) {
$bundleSelections = $bundleOption->getSelections();
foreach ($bundleSelections as $bundleSelection) {
// get some data here
$vName = $bundleOption->getTitle();
}
}
}
要獲取捆綁產(chǎn)品的必選產(chǎn)品列表,您可以使用以下代碼:
To get a list of the Required Selection Products for the Bundled product, you can use the following code:
$requiredChildren = $this->getChildrenIds($product->getId(),$required=true);
然后,您可以遍歷 ID 數(shù)組并按 ID 加載產(chǎn)品,以獲取有關(guān)這些產(chǎn)品的更多信息.
You can then loop through the array of ID’s and load the products by their ID’s to get more information regarding those products.
購物車中的捆綁產(chǎn)品
為了循環(huán)瀏覽購物卡中捆綁產(chǎn)品的選定選項(xiàng),您可以使用以下內(nèi)容:
In order to loop through the selected options of a Bundled product in the shopping card, you can use something like this:
/**
* @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
}
}
}
此代碼從 Quote Item Bundled Product 中獲取 Options,然后在一個(gè)集合中獲取該產(chǎn)品的 Options,然后找到Selected"Option Selection.
This code gets the Options from the Quote Item Bundled Product, and then gets the Options for that product in a collection, and then finds the "Selected" Option Selection.
嗯,肖恩
這篇關(guān)于Magento:將捆綁中的簡單產(chǎn)品添加到購物車中的單獨(dú)行的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!