我想知道是否有可能在可配置产品中获得所选项目的库存(即在下拉列表中)。
例如,如果你有一件衬衫,有多个代表尺码的简单。 当你选择小的时候,我想得到小衬衫的库存。 如果您随后将选择更改为中等,我想获得中号衬衫的库存。
请注意,没有页面刷新。
答案 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>
清除布局缓存,然后在选择其他产品尺寸时应该更改库存水平。