在magento中获得选定的简单库存

时间:2014-01-31 14:44:32

标签: magento stock configurable-product

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

例如,如果你有一件衬衫,有多个代表尺码的简单。 当你选择小的时候,我想得到小衬衫的库存。 如果您随后将选择更改为中等,我想获得中号衬衫的库存。

请注意,没有页面刷新。

2 个答案:

答案 0 :(得分: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()的位置,它应该在它下面。

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

乐意进一步提供帮助, 汉斯

答案 1 :(得分:0)

user3180937的答案很好。为了避免编辑核心js / varien.configurable.js文件,您可以执行类似的操作。在skin_js目录下创建一个js文件,并添加以下内容(请注意,这是假设下拉菜单中的“数量”选项,并根据需要进行修改):

if (typeof Product !== 'undefined') {
Product.Config.addMethods({
    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) {
                        // do what is best for you business rules
                    } else if (productStock >= 1) {
                        var optionValues = '<select class="styled-select__select" name="qty" id="qty">';
                        for (j = 1; j <= productStock; j++) {
                            optionValues += '<option value="' + j + '">' + j + '</option>';
                        }
                        $('qty').innerHTML = optionValues + '</select>';
                    } else {
                        $('product-stock').innerHTML = '';
                    }
                }
            }
        }
    }
});

Product.Config.prototype.configureElement = Product.Config.prototype.configureElement.wrap(function (parentMethod, element) {
    this.reloadStock();
    return parentMethod(element);
});

}

然后,您需要在设计布局的page.xml或local.xml中添加对此文件的引用。因此,请在<reference name="head">中添加:

<action method="addItem"> <type>skin_js</type> <path>js/lib/companyname.configurablestock.js</path> </action>

清除布局缓存,然后在选择其他产品尺寸时应该更改库存水平。