2012-09-05 88 views
20

如何获得与可配置产品相​​关的所有简单产品?我发现如何做相反的事情(从简单的产品获得产品配置),但这不是我需要的。从Magento中的可配置产品中获取所有简单产品产品视图

我想显示我有多少单位的股票对于选定的产品(可配置属性)。我最初的想法是打印所有数量的库存并用jQuery控制显示。任何想法?

回答

9

使用下面的脚本在

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

里面的脚本:

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

现在增加onchange事件在同一页面的下拉菜单:

onchange = "spConfig.getIdOfSelectedProduct()" 

Full description

+2

正常工作....谢谢你Hardik ... – Lawrance

+1

真棒解决方案Hardik! –

+4

虽然这不是PHP。 – Qix

52

使用此代码如下

代码来获取完整的产品信息(这里的3是可配置的产品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 
} 

另一个代码来获取儿童产品ID

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

希望这有助于!

+1

致命错误:调用一个非对象的成员函数getChildrenIds() –

+1

'$ childProducts = Mage :: getModel('catalog/product_type_configurable ') - > getChildrenIds(3);'为我完全工作(减去额外的分号。)谢谢! –

+1

第一种方法给我所有的儿童产品,但它说所有的儿童产品都启用了,尽管大多数都是实际的为什么是这样? –

5

我明白了。感谢您的回复。

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

你不应该'加载()'在一个循环内 – OSdave

+6

这是一个性能杀手....永远不会加载循环中的产品! –

+0

有什么建议吗? – lucasvm1980

17

一个可配置产品可以有多个其他产品与之相关联。

以下是获取与可配置产品关联的所有儿童产品的代码。

这里去的代码:)

/** 
* 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); 

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

+3

请注意,您可以简单地将d而不是手动加载'product_type_configurable'模型:'$ product-> getTypeInstance() - > getChildrenIds()'或'$ product-> getTypeInstance() - > getUsedProducts()'。 – ScottSB

+0

@ScottSB不错,代码越短越好。 –

1

对于任何人要做到这一点,并显示结果我将分享我做了什么来完成它

添加到script的段:应用程序/设计/前端/默认/ [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'); 
      } 
     } 
    } 

在同一页面中添加的select

onchange = "spConfig.getIdOfSelectedProduct()" 

随意编辑什么语句打印,但这应该让你那里。它也占库存0手,将其更改为Out of stock在css和文本

相关问题