6

Mi cliente está solicitando que cada producto simple dentro de un producto empaquetado que venda (Parte superior e inferior de ropa) se agregue como una línea separada en el carro cada vez que el usuario lo agrega. ¿Alguien puede dirigirme en cómo lograr esto? Soy bastante bueno con MVC y Zend Framework, pero necesito un poco de ayuda para encontrar los archivos exactos que controlan agregar productos empaquetados al carro, o un método alternativo para obtener estos artículos por separado. Supongamos que el único tipo de producto posible para esta ropa es el tipo de producto incluido.Magento: Agregar productos simples de un paquete a líneas separadas en el carrito

+0

Actualicé mi respuesta para que sea más clara – ShaunOReilly

Respuesta

8

Tendrá un observador:

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

Después, realice el observador:

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

sólo una muestra simple, pero podría ayudar.

productos empaquetados pueden ser complicadas de entender, al trabajar con ella a través de código: Aquí está una imagen de muestra: enter image description here

Cada producto empaquetado, tiene de una a varias opciones, que al final va a ser enlaces a productos que se agregarán al paquete en el carrito de compras.

Cada opción consta de una a varias selecciones, que serán los productos vinculados que terminarán en el carrito de compras, en este producto empaquetado. Una selección, por lo general, se puede establecer como predeterminada y ya estará seleccionada en la página del producto. Se puede encontrar más información en este enlace sobre cómo crear y configurar productos agrupados, porque en este documento, solo discutiremos el lado de la programación. página de visualización del producto empaquetado, se verá así: enter image description here

Podría tener este aspecto en el carrito de la compra, una vez que ha hecho clic en “Añadir al carro”: Bundle Muestra

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

Al interrogar este producto a través de código, se carga como cualquier producto normal:

$oProduct->load($vProductId); 

una vez cargado, es necesario obtener una instancia de tipo de producto, por lo que puede cargar las opciones para este tipo de producto.

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

Ahora podemos obtener la lista de opciones de identificación de este producto de esta forma:

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

para interrogar a las selecciones, vamos a añadir la lista de opciones a una colección, a continuación, obtener las Opciones colección, así como sus respectivas selecciones:

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

Ahora tenemos un conjunto de opciones, y cada opción tiene una colección de Selecciones. Ahora podemos recorrer las opciones y ver sus Selctions.

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

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

      } 
} 

Para obtener una lista de los productos de selección necesarios para el producto empaquetado, puede utilizar el siguiente código:

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

A continuación, puede recorrer la matriz de identificaciones y cargar los productos por su Identificación para obtener más información sobre esos productos.

productos empaquetados en el carrito de la compra

Con el fin de bucle a través de las opciones seleccionadas de un producto incluido en la tarjeta de compra, se puede usar algo como esto:

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

Este código obtiene las Opciones del Producto incluido en el presupuesto, y luego obtiene las Opciones para ese producto en una colección, y luego encuentra la Selección de opción "Seleccionada".

HTH, Shaun

+0

Implementé el ejemplo anterior que me ha proporcionado, pero parece que recibo todas las opciones del producto incluido en el carrito, en lugar de solo los productos que el usuario seleccionado. ¿Algún consejo? Además, ¿tiene alguna información sobre simplemente duplicar el producto incluido y agregar una de las opciones seleccionadas por el usuario a cada producto incluido? Por ejemplo: el usuario selecciona una pequeña parte superior y una pequeña parte inferior; el carro mostraría un producto agrupado con una pequeña parte superior y luego otro producto agrupado con un pequeño fondo. – nnelson

+0

es $ this apuntando al producto actual que se agrega? – ShaunOReilly

+0

$ esto en el observador no está en el alcance. Cada vez que obtengo el producto en el observador, está recuperando el producto general en lugar del paquete configurado. Cuando obtengo Selections(), la función devuelve todas las selecciones posibles para esa opción en lugar de las selecciones elegidas por el usuario. – nnelson

1

Hice esto para resolver la petición del cliente para agregar el contenido haz como partidas separadas en el carro. Basta con sustituir

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

con

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

en el archivo cartController.

+0

solo una pequeña solucion para el usuario del mango Cantidad requerida para un paquete para ($ i = 0; $ i <$ cartCandidato-> getCartQty() * $ params ['qty']; $ i ++) { – user3803968

+0

¿Hay alguna manera de hacerlo? agregue el producto incluido, pero sin los productos secundarios, ya que ahora están en la cesta. – user2029763

+0

Estoy tratando de resolver su situación, pero basándome solo en su pregunta, es posible agregar un paquete basado en el niño actual en el carrito. Tenga en cuenta que necesita definir reglas para manejar que de lo contrario obtendrá un paquete por cada niño en el carrito – user3803968

Cuestiones relacionadas