如何覆盖js / varien / product.js中的JS函数?

时间:2013-01-22 17:27:48

标签: javascript magento

我正在制作一个Magento扩展,在产品视图页面上调用自定义JS文件。这个自定义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不熟悉,不知道。

2 个答案:

答案 0 :(得分:2)

如果它是全局的那么你可以window.formatPrice = myNewFormatPrice;如果它是一个对象的成员那么你可以这样做:anObject.formatPrice = myNewFormatPrice;

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

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

答案 1 :(得分: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>

请参阅this link关于原型的继承和 $ super var。 我再次看到类似于@ jholloman在Magento中使用的建议的代码,所以没有问题,但我想你可能想知道如何做这个Prototype的方式。 / p>