2012-09-05 8 views
20

¿Cómo puedo obtener todos los productos simples asociados con un producto configurable? Encontré cómo hacer lo contrario (obtener un producto configurable a partir de un producto simple) pero eso no es lo que necesito.Obtener todo producto simple de un producto configurable en Magento Vista de producto

Quiero mostrar cuántas unidades tengo en stock para el producto seleccionado (atributo configurable). Mi idea inicial es imprimir todas las cantidades de stock y controlar la pantalla con jQuery. ¿Alguna idea?

Respuesta

9

utilizar el siguiente script en

app/design/frontend/default/[your theme]/template/catalog/product/view/type/options/configurable.phtml

Dentro de la secuencia de comandos:

spConfig.getIdOfSelectedProduct = function() { 
    var existingProducts = new Object(); 
    for (var i = this.settings.length - 1; i >= 0; i--) { 
     var selected = this.settings[i].options[this.settings[i].selectedIndex]; 
     if (selected.config) { 
      for (var iproducts = 0; iproducts < selected.config.products.length; iproducts++) { 
       var usedAsKey = selected.config.products[iproducts] + ""; 
       if (existingProducts[usedAsKey] == undefined) { 
        existingProducts[usedAsKey] = 1; 
       } else { 
        existingProducts[usedAsKey] = existingProducts[usedAsKey] + 1; 
       } 
      } 
     } 
    } 
    for (var keyValue in existingProducts) { 
     for (var keyValueInner in existingProducts) { 
      if (Number(existingProducts[keyValueInner]) < Number(existingProducts[keyValue])) { 
       delete existingProducts[keyValueInner]; 
      } 
     } 
    } 
    var sizeOfExistingProducts = 0; 
    var currentSimpleProductId = ""; 
    for (var keyValue in existingProducts) { 
     currentSimpleProductId = keyValue; 
     sizeOfExistingProducts = sizeOfExistingProducts + 1 
    } 
    if (sizeOfExistingProducts == 1) { 
     alert("Selected product is: " + currentSimpleProductId) 
    } 
} 

Ahora agregue onchange evento a su desplegable misma página:

onchange = "spConfig.getIdOfSelectedProduct()" 

Full description

+2

Trabajando correctamente ... gracias Hardik ... – Lawrance

+1

¡Solución impresionante Hardik! –

+4

Esto no es PHP. – Qix

52

utilizar este código a continuación código

para obtener la información del producto completo (donde 3 es el producto configurable Id)

$product = Mage::getModel('catalog/product')->load(3); 
$childProducts = Mage::getModel('catalog/product_type_configurable') 
        ->getUsedProducts(null,$product); 

foreach($childProducts as $child) { 
    print_r($child->getName()); // You can use any of the magic get functions on this object to get the value 
} 

Otro código para obtener los Niños ID de producto

$childProducts = Mage::getModel('catalog/product_type_configurable') 
        ->getChildrenIds(3); 

Espero que esto ayude !!

+1

Fatal error: Llamada a una función miembro getChildrenIds() en un no-objeto –

+1

'$ childProducts = Mago :: getModel ('Catálogo/product_type_configurable ') -> getChildrenIds (3); 'funcionó perfectamente para mí (sin el punto y coma adicional. Gracias! –

+1

El primer método me proporciona todos los productos secundarios, pero dice que todos los productos secundarios están habilitados, aunque la mayoría son en realidad ¿Por qué? –

5

Lo tengo. Gracias por las respuestas

<?php if($_product->getTypeId() == "configurable"): ?> 
    <?php $_configurable = $_product->getTypeInstance()->getUsedProductIds(); ?> 
    <?php foreach ($_configurable as $_config): ?> 
     <?php $_simpleproduct = Mage::getModel('catalog/product')->load($_config); ?> 
     <?php //Magic php with a $_simpleproduct. ?> 
    <?php endforeach; ?> 
<?php endif; ?> 
+12

no debe 'cargar()' dentro de un bucle – OSdave

+6

esto es un asesino de rendimiento ... nunca cargue productos en un bucle ! –

+0

alguna sugerencia? – lucasvm1980

17

Un producto configurable puede tener varios otros productos asociados.

Aquí está el código para buscar todos los productos secundarios que están asociados con un producto configurable.

Aquí va el código :)

/** 
* Load product by product id 
*/ 
$product = Mage::getModel('catalog/product')->load(YOUR_PRODUCT_ID); 

/** 
* Get child products id and such (only ids) 
*/ 
$childIds = Mage::getModel('catalog/product_type_configurable')->getChildrenIds($product->getId()); 

/** 
* Get children products (all associated children products data) 
*/ 
$childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null,$product); 

Fuente: http://blog.chapagain.com.np/magento-how-to-get-all-associated-children-product-of-a-configurable-product/

+3

Tenga en cuenta que simplemente puede d o esto en lugar de cargar manualmente el modelo 'product_type_configurable':' $ product-> getTypeInstance() -> getChildrenIds() 'o' $ product-> getTypeInstance() -> getUsedProducts() '. – ScottSB

+0

@ScottSB, mejor código, más corto, mejor. –

1

para cualquiera que quiera hacer esto, y mostrar los resultados voy a compartir lo que hice para acabar con él

Añadir a la script segmento de: app/design/frontend/default/[your_theme] /template/catalog/product/view/type/options/configurable.phtml

id = {}; 
<?php 
foreach ($_product->getTypeInstance(true)->getUsedProducts (null, $_product) as $simple) { 
    $stock = Mage::getModel('cataloginventory/stock_item')->loadByProduct($simple)->getQty(); 
    echo " id[" . $simple->getId() . "] = $stock;\n\r"; 
} 
?> 

    spConfig.getIdOfSelectedProduct = function() { 
     var existingProducts = new Object(); 
     for (var i = this.settings.length - 1; i >= 0; i--) { 
      var selected = this.settings[i].options[this.settings[i].selectedIndex]; 
      if (selected.config) { 
       for (var iproducts = 0; iproducts < selected.config.products.length; iproducts++) { 
        var usedAsKey = selected.config.products[iproducts] + ""; 
        if (existingProducts[usedAsKey] == undefined) { 
         existingProducts[usedAsKey] = 1; 
        } else { 
         existingProducts[usedAsKey] = existingProducts[usedAsKey] + 1; 
        } 
       } 
      } 
     } 
     for (var keyValue in existingProducts) { 
      for (var keyValueInner in existingProducts) { 
       if (Number(existingProducts[keyValueInner]) < Number(existingProducts[keyValue])) { 
        delete existingProducts[keyValueInner]; 
       } 
      } 
     } 
     var sizeOfExistingProducts = 0; 
     var currentSimpleProductId = ""; 
     for (var keyValue in existingProducts) { 
      currentSimpleProductId = keyValue; 
      sizeOfExistingProducts = sizeOfExistingProducts + 1 
     } 
     if (sizeOfExistingProducts == 1) { 
      var qtyLeft = id[currentSimpleProductId]; 
      if(qtyLeft >= 1) { 
       jQuery('.availability-only').html('Only ' + qtyLeft + ' available.'); 
       jQuery('p.out-of-stock').removeClass('out-of-stock').addClass('in-stock'); 
       jQuery('p.in-stock > span').html('In stock'); 
      } else { 
       jQuery('.availability-only').html('Sorry, there are none available in this size.'); 
       jQuery('p.in-stock').removeClass('in-stock').addClass('out-of-stock'); 
       jQuery('p.out-of-stock > span').html('Out of stock'); 
      } 
     } 
    } 

en el select de la misma página complemento:

onchange = "spConfig.getIdOfSelectedProduct()" 

dude en para corregir lo que las impresiones de los estados, pero esto debe llegar hasta allí.También da cuenta de 0 existencias disponibles, cambiándolo a Out of stock en css y el texto

Cuestiones relacionadas