0

我正在制作一个在产品视图页面上调用自定义 JS 文件的 Magento 扩展。此自定义 JS 文件将最后加载,需要覆盖 /js/varien/product.js 底部的 formatPrice() 函数。

原formatPrice函数如下:

formatPrice: function(price) {
return formatCurrency(price, this.priceFormat);
}

我想用以下内容替换/覆盖这个函数:

formatPrice: function(price) {
if (price % 1 == 0) { this.priceFormat.requiredPrecision = 0; }

return formatCurrency(price, this.priceFormat);
}

如何在我的自定义 JS 文件中编写 JS 代码,以便正确覆盖此函数?我对JS还不够熟悉。

4

2 回答 2

2

如果它是全局的,那么window.formatPrice = myNewFormatPrice;如果它是对象的成员,那么您可以这样做,那么您可以执行以下操作:anObject.formatPrice = myNewFormatPrice;

如果您需要编辑对象的原型,请使用:Product.OptionsPrice.prototype.formatPrice = myFormatPrice;

您还需要查看对requiredPrecision. 如果它是“私有的”或“受保护的”,那么您将无法访问它。

于 2013-01-22T17:39:04.410 回答
0

虽然从功能的角度来看@jholloman 的答案是正确的,但您可能会考虑以原型的方式执行此操作,而是继承Product.OptionsPrice并使用新类。这是来自app\design\frontend\base\default\template\catalog\product\view.phtml第 36 行(我认为您需要更改它):

原来的

<script type="text/javascript">
    var optionsPrice = new Product.OptionsPrice(<?php echo $this->getJsonConfig() ?>);
</script>

修改的

<script type="text/javascript">
    var MyOptionPrice = Class.create(Product.OptionsPrice, { // inherit from Product.OptionsPrice
        formatPrice: function($super, price) { // $super references the original method (see link below)
            if (price % 1 === 0) { 
                this.priceFormat.requiredPrecision = 0; 
            }
            return $super(price);
        }        
    });
    var optionsPrice = new MyOptionPrice(<?php echo $this->getJsonConfig() ?>); // use yours instead
</script>

使用wrap()(这样,您不必更改原始方法名称):

<script type="text/javascript">
    Product.OptionsPrice.prototype.formatPrice = Product.OptionsPrice.prototype.formatPrice.wrap(function(parent, price) {
        if (price % 1 === 0) { 
            this.priceFormat.requiredPrecision = 0; 
        }
        return parent(price);        
    });
    var optionsPrice = new Product.OptionsPrice(<?php echo $this->getJsonConfig() ?>);
</script>

请参阅有关 Prototype 的继承和$super var的链接。 同样,我看到了与 Magento 中使用的@jholloman 建议类似的代码,所以按照他的方式进行是没有问题的,但我想你可能想知道如何按照 Prototype 的方式进行操作。

于 2013-01-22T21:44:59.353 回答