Я делаю расширение Magento, которое вызывает пользовательский файл JS на странице просмотра продукта. Этот пользовательский файл JS будет загружаться последним, и ему необходимо переопределить функцию formatPrice (), расположенную в нижней части /js/varien/product.js.

Исходная функция 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 достаточно, чтобы знать.

0
Chrysippus 22 Янв 2013 в 21:27

2 ответа

Лучший ответ

Если он глобальный, то вы можете просто сделать window.formatPrice = myNewFormatPrice;, если он является членом объекта, тогда вы бы сделали что-то вроде: anObject.formatPrice = myNewFormatPrice;

Если вам нужно отредактировать прототип объекта, используйте: Product.OptionsPrice.prototype.formatPrice = myFormatPrice;

Также вам нужно изучить доступ к requiredPrecision. Если он «частный» или «защищенный», вы не сможете получить к нему доступ.

2
jholloman 22 Янв 2013 в 18:15

Хотя ответ @ 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.
Опять же, я увидел код, похожий на предложение @ jholloman, используемый в Magento, так что нет проблем с его продвижением, но я подумал, что вы, возможно, захотите узнать, как сделать этот прототип.

0
nevvermind 22 Янв 2013 в 22:03