6

sepete ayrı satırlara eklemek İstemcim, sattıkları bir ürünün içindeki her bir basit ürünün (Giyim Üst ve Alt), her seferinde sepette ayrı bir satır öğesi olarak eklenmesini istemektedir. kullanıcı ekler. Bunu nasıl başaracağımı bana kim yönlendirebilir? MVC ve Zend Framework ile oldukça iyiyim, ancak sepete paketlenmiş ürünlerin eklenmesini kontrol eden tam dosyaları bulmaya veya bu öğeleri ayrı ayrı eklemek için alternatif bir yönteme ihtiyacım var. Lütfen bu kıyafet için mümkün olan tek ürün tipinin Paketlenmiş ürün tipi olduğunu varsayalım. Bir gözlemci gerekecektirMagento: Bir paketten basit ürünleri sepette

+0

Cevabınız daha net olmak için güncellendi – ShaunOReilly

cevap

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> 

Sonra gözlemci yapın:

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

Sadece basit örnek, ama yardımcı olabilir.

Birlikte ürünler anlamak için karmaşık olabilir kod aracılığı ile çalışırken: sonunda bağlantılar olacak olan pek çok seçeneğe birine sahip enter image description here

Her Birlikte ürün: Burada örnek bir resimdir Alışveriş sepetindeki pakete eklenecek ürünler.

Her Seçenek, bir araya getirilmiş üründe, Alışveriş sepetinde sona erecek bağlantılı ürünler olacak bire bir Seçimlerden oluşur. Bir Seçim, genellikle varsayılan olarak ayarlanabilir ve zaten ürün sayfasında seçilecektir. Bu bağlantıda, paketlenmiş ürünlerin nasıl oluşturulacağı ve yapılandırılacağı hakkında daha fazla bilgi bulunabilir, çünkü bu belgede, yalnızca programlama tarafını tartışacağız. birlikte ürünün ekranı sayfası, bu gibi görünecektir: enter image description here

siz “Sepete Ekle” tıkladım kez O, alışveriş sepetinde gibi görünebilir

:

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

sorguya zaman Paketi Numune kod aracılığıyla bu ürün, herhangi normal bir ürün gibi yüklemek: Bu yüklendikten sonra yüklemek böylece

$oProduct->load($vProductId); 

, sen bir ürün tipi örneğini almak gerekir Bu ürün tipi için seçenekler.

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

Şimdi bu şekilde bu ürün için opsiyon kimliği yılların listesini alabilirsiniz:

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

Seçimlerini sorgulamak için, ardından Seçenekler olsun, bir koleksiyona seçeneklerin listesini katacak toplama, hem de kendi Seçimleri:

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

Şimdi Seçenekleri Koleksiyon sahiptir ve her Opsiyon Selections bir koleksiyona sahip olacak. Şimdi seçenekler arasında dolaşabilir ve onların Seçimlerine bakabiliriz.

foreach ($bundleOptions as $bundleOption) { 
      if ($bundleOption->getSelections()) { 
       $bundleSelections = $bundleOption->getSelections(); 

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

      } 
} 

Birlikte ürün için Gerekli Seçim Ürünleri listesini almak için aşağıdaki kodu kullanabilirsiniz: Daha sonra kimlikleri dizisi döngü ve ürünlerini yükleyebilirsiniz

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

onların Bu ürünlerle ilgili daha fazla bilgi almak için ID'ler.

/** 
* @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 
     } 
    } 
} 

Bu kod Seçenek alır: alışveriş kartında Grup halindeki ürünün seçilen seçenekleri arasında döngü için alışveriş sepeti

yılında

Birlikte ürünler, böyle bir şey kullanabilirsiniz Alıntı Öğe Ürünü Paketinden ve daha sonra bu ürün için Seçeneklerini bir koleksiyonda alır ve ardından “Seçilen” Seçenek Seçimini bulur.

hth, Shaun

+0

Bana verdiğiniz yukarıdaki örneği uyguladım, ancak yalnızca ürünlere değil, pakete eklenen ürünle ilgili her seçeneği alıyorum. kullanıcı seçildi. Herhangi bir tavsiye? Ayrıca, yalnızca birlikte verilen ürünü kopyalamak ve kullanıcı tarafından seçilen her bir ürüne seçeneklerden birini eklemekle ilgili bilgileriniz var mı? Örneğin: kullanıcı küçük bir üst ve küçük alt seçer; Sepet, küçük bir üst ve daha sonra küçük bir alt ile birlikte başka bir ürün ile birlikte bir ürün gösterecektir. – nnelson

+0

, eklenen mevcut ürüne işaret eden $? Gözlemde – ShaunOReilly

+0

$ bu kapsamda değildir. Ürünü gözlemciye aldığımda, yapılandırılmış paket yerine genel ürünü alıyor. BenSelections() aldığımda, işlev, kullanıcı tarafından seçilen seçimler yerine, o seçenek için olası tüm seçimleri döndürür. – nnelson

1

ben sepetinde ayrı öğeler olarak paket içerik eklemek için müşteri talebini çözmek için bunu yaptı. Sadece dosyanın cartController yılında

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

ile

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

değiştirin.

+0

sadece bir tutam düzeltme için kullanıcı için bir paket için gerekli ($ i = 0; $ i <$ cartCandidate-> getCartQty() * $ params ['qty']; $ i ++) { – user3803968

+0

O zaman bir yolu var mı Paketlenmiş ürünü, ancak çocuk ürünleri olmadan, şu anda sepetin içinde oldukları gibi ekleyin. – user2029763

+0

Senaryonuza bakmaya çalışıyorum ama sadece sorunuza dayanarak, mevcut çocuk arabasına dayalı bir Bundle eklemenin mümkün olduğunu düşünüyorum. Başlamak için kuralları tanımlamanız gerektiğine dikkat edin aksi halde – user3803968