1

我想知道是否可以在可配置产品中获取所选项目的库存(即在下拉列表中)。

例如,如果您有一件衬衫,上面有多个代表尺寸的单字。当您选择小号时,我想获得小号衬衫的库存。如果您随后将选择更改为中号,我想获得中号衬衫的库存。

注意没有页面刷新。

4

1 回答 1

5

我做了类似的事情,我扩展了 Mage_Catalog_Block_Product_View_Type_Configurable,特别是 getJsonConfig() 方法,因为它为可配置产品的下拉菜单提供数据。

像这样的东西:

class Graphicalliance_Stockvalues_Block_Catalog_Product_View_Type_Configurable extends Mage_Catalog_Block_Product_View_Type_Configurable {

  public function getJsonConfig()
    {
        $config = parent::getJsonConfig();
        $config = Mage::helper('core')->jsonDecode($config);

        foreach ($config['attributes'] as $attid=>$attinfo) {
          foreach ($attinfo['options'] as $key=>$attoption) {
            // get stock value per product
            $stocks = array();
            foreach ($attoption['products'] as $prod) {
              $_product = Mage::getModel('catalog/product')->load($prod);
              $_qty = Mage::getModel('cataloginventory/stock_item')->loadByProduct($_product)->getQty();
              $stocks[$prod] = (int) $_qty;
            }
            $config['attributes'][$attid]['options'][$key]['stock'] = $stocks;
          }
        }

        return Mage::helper('core')->jsonEncode($config);
    }
}

这样可以确保您将库存价值传递到每个变体的前端,因此您不必刷新页面。然后,您需要修改 javascript 处理程序以在选择尺寸/颜色时更新库存显示。

在 js/varien.configurable.js 中向 Product prototpye 对象添加一个函数,如下所示:

reloadStock: function(){
        for(var i=this.settings.length-1;i>=0;i--){
            var selected = this.settings[i].options[this.settings[i].selectedIndex];
            if(selected.config){
                var allowedProducts = selected.config.allowedProducts;
                if (allowedProducts.length==1 && selected.config.stock) {
                  var productStock = parseInt(selected.config.stock[allowedProducts[0]]);
                  if (productStock==0) {
                    $('product-stock').innerHTML = 'out of stock';
                  } else if (productStock<=1) {
                    $('product-stock').innerHTML = productStock + ' in stock';
                  } else {
                    $('product-stock').innerHTML = '';
                  }
                }
            }
        }
    },

请注意,您需要一个 ID 为“product-stock”的元素,其中显示库存显示文本。

然后,您可以在必要时调用此函数,例如将其添加到同一文件中的 configureElement 函数中,如果我没记错的话,它会在页面加载时运行:

this.reloadStock();

查看调用 reloadPrice() 的位置,它可能应该在它的下方。

这些代码示例已经过一些编辑,以删除与您的问题无关的位,因此希望它们在语法上仍然正确。

很高兴能提供进一步的帮助,汉斯

于 2014-01-31T15:56:05.423 回答