6

कार्ट में अलग-अलग लाइनों के लिए एक बंडल से सरल उत्पादों को जोड़ना मेरा ग्राहक अनुरोध कर रहा है कि वे एक बंडल उत्पाद के भीतर प्रत्येक साधारण उत्पाद को बेच रहे हों (कपड़ों के ऊपर और नीचे) कार्ट में एक अलग लाइन आइटम के रूप में जोड़े जाए उपयोगकर्ता इसे जोड़ता है। क्या कोई मुझे यह पूरा करने के लिए निर्देशित कर सकता है? मैं एमवीसी और ज़ेंड फ्रेमवर्क के साथ काफी अच्छा हूं, लेकिन मुझे सटीक फ़ाइलों को खोजने में मदद की ज़रूरत है जो कार्ट में बंडल किए गए उत्पादों को जोड़ने, या इन वस्तुओं को अलग से जोड़ने के लिए वैकल्पिक विधि को नियंत्रित करने में मदद करते हैं। कृपया मान लें कि इस कपड़ों के लिए एकमात्र संभावित उत्पाद प्रकार बंडल उत्पाद प्रकार है।Magento: कार्ट में

+0

आपके लिए मेरे उत्तर को और अधिक स्पष्ट होने के लिए अपडेट किया गया – ShaunOReilly

उत्तर

8

आप एक पर्यवेक्षक की आवश्यकता होगी:

<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); 
     } 
    } 

बस एक सरल नमूना है, लेकिन यह मदद कर सकता है।

बंडल उत्पादों को समझने के लिए जटिल हो सकता है, जब कोड के माध्यम से इसके साथ काम: enter image description here

प्रत्येक बंडल उत्पाद, अंत में करने के लिए लिंक हो जाएगा, जो कई विकल्पों के लिए एक है: यहाँ एक नमूना चित्र है शॉपिंग कार्ट में बंडल में उत्पादों को जोड़ा जाना चाहिए।

प्रत्येक विकल्प में कई चयनों में से एक होता है, जो इस बंडल उत्पाद के तहत शॉपिंग कार्ट में समाप्त होने वाले लिंक किए गए उत्पाद होंगे। एक चयन, आमतौर पर डिफ़ॉल्ट के रूप में सेट किया जा सकता है, और पहले से ही उत्पाद पृष्ठ पर चुना जाएगा। बंडल उत्पादों को बनाने और कॉन्फ़िगर करने के तरीके के बारे में अधिक जानकारी इस लिंक पर मिल सकती है, क्योंकि इस दस्तावेज़ में, हम केवल इसके प्रोग्रामिंग पक्ष पर चर्चा करेंगे। बंडल उत्पाद के प्रदर्शन पेज, इस तरह दिखेगा: enter image description here

यह खरीदारी की टोकरी में ऐसा दिखाई दे सकता है, एक बार आप "कार्ट में जोड़ें" पर क्लिक किया: बंडल नमूना

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 
     } 
    } 
} 

इस कोड को विकल्प हो जाता है:

खरीदारी की टोकरी

आदेश में शॉपिंग कार्ड में किसी बंडल उत्पाद की चयनित विकल्पों के माध्यम से लूप करने के बंडल उत्पादों, आप कुछ इस तरह उपयोग कर सकते हैं उद्धरण आइटम बंडल उत्पाद से, और उसके बाद उस उत्पाद के संग्रह में विकल्प प्राप्त होते हैं, और फिर "चयनित" विकल्प चयन पाता है।

hth, शॉन

+0

मैंने उपर्युक्त उदाहरण को लागू किया है जो आपने मुझे दिया है, लेकिन मुझे लगता है कि केवल उन उत्पादों के विपरीत, कार्ट में जोड़े गए बंडल उत्पाद से हर विकल्प प्राप्त हो रहा है, उपयोगकर्ता चुना गया। कोई सलाह? साथ ही, क्या आपके पास बंडल किए गए उत्पाद को डुप्लिकेट करने और उपयोगकर्ता द्वारा चुने गए विकल्पों में से प्रत्येक को प्रत्येक बंडल उत्पाद में जोड़ने के बारे में कोई जानकारी है? उदाहरण के लिए: उपयोगकर्ता एक छोटे से ऊपर और छोटे नीचे का चयन करता है; गाड़ी एक छोटे से शीर्ष के साथ एक बंडल उत्पाद दिखाएगी, और फिर एक छोटा सा तल वाला एक और बंडल उत्पाद दिखाएगा। – nnelson

+0

$ यह वर्तमान उत्पाद जोड़ने के लिए इंगित कर रहा है? पर्यवेक्षक में – ShaunOReilly

+0

$ यह दायरे में नहीं है। जब भी मैं पर्यवेक्षक में उत्पाद प्राप्त करता हूं, यह कॉन्फ़िगर किए गए बंडल के बजाय सामान्य उत्पाद को पुनर्प्राप्त कर रहा है। जब मुझे चयन() मिलता है, तो फ़ंक्शन उपयोगकर्ता द्वारा चुने गए चयनों के बजाय उस विकल्प के लिए सभी संभावित चयन देता है। – nnelson

1

मैं ऐसा किया गाड़ी में अलग आइटम के रूप में बंडल सामग्री जोड़ने के लिए ग्राहक के अनुरोध को हल करने के। बस फ़ाइल cartController में

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); 
} 

साथ

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

बदलें।

+0

उपयोगकर्ता क्यूटी को संभालने के लिए केवल एक लीटल फिक्स ($ i = 0; $ i <$ कार्ट कैंडीडेट-> getCartQty() * $ params ['qty']; $ i ++) { – user3803968

+0

क्या कोई तरीका है बंडल उत्पाद को खुद ही जोड़ें लेकिन बाल उत्पादों के बिना - क्योंकि वे अब टोकरी में हैं? – user2029763

+0

मैं आपके परिदृश्य को समझने की कोशिश कर रहा हूं लेकिन केवल आपके प्रश्न पर आधारित यह संभव है कि कार्ट पर वर्तमान बच्चे के आधार पर एक बंडल जोड़ें। ध्यान रखें कि आपको नियमों को संभालने के लिए नियमों को परिभाषित करने की आवश्यकता है अन्यथा आपको कार्ट – user3803968