Как переопределить файл визуализации цены каталога


Я хочу внести изменения в цену, указанную на странице просмотра каталога, поэтому мне нужно изменить _toHtml() в module-catalog\pricing\render.php Я не уверен, что это лучший способ сделать это.

Например, для страницы со списком я использовал плагин для функции aftergetProductPrice() catalog\Product\ListProduct.php

Author: Rama Chandran M, 2017-07-22

1 answers

Если вы просто хотите переписать цену страницы с объявлением, в данном случае это нормально. Но в большинстве случаев мы хотим переписать всю цену на всей странице.

В этих случаях вам следует переписать метод формат класса \Magento\Каталог\Модель\Цена.

P/s: вы можете использовать либо предисловия, либо плагин

Отредактировано: Если вы также хотите изменить цену на странице просмотра товара, странице оформления заказа, странице корзины (эти страницы используют knockoutjs для отображения формата цены).

Перепишите метод Формат цены() в Magento_Catalog/web/js/price-utils

Для себя я добавил конфигурацию в панель администратора. А затем я добавляю эти строки кода в метод formatPrice():

 if (typeof window.precision !== 'undefined') {
            precision = window.precision;
        }

Это отредактированный метод:

 /**
 * Formatter for price amount
 * @param  {Number}  amount
 * @param  {Object}  format
 * @param  {Boolean} isShowSign
 * @return {String}  Formatted value
 */
function formatPrice(amount, format, isShowSign) {
    format = _.extend(globalPriceFormat, format);

    // copied from price-option.js | Could be refactored with varien/js.js

    var precision = isNaN(format.requiredPrecision = Math.abs(format.requiredPrecision)) ? 2 : format.requiredPrecision,
        integerRequired = isNaN(format.integerRequired = Math.abs(format.integerRequired)) ? 1 : format.integerRequired,
        decimalSymbol = format.decimalSymbol === undefined ? ',' : format.decimalSymbol,
        groupSymbol = format.groupSymbol === undefined ? '.' : format.groupSymbol,
        groupLength = format.groupLength === undefined ? 3 : format.groupLength,
        pattern = format.pattern || '%s',
        s = '',
        i, pad,
        j, re, r, am;

    if (typeof window.precision !== 'undefined') {
        precision = window.precision;
    }


    if (isShowSign === undefined || isShowSign === true) {
        s = amount < 0 ? '-' : (isShowSign ? '+' : '');
    } else if (isShowSign === false) {
        s = '';
    }
    pattern = pattern.indexOf('{sign}') < 0 ? s + pattern : pattern.replace('{sign}', s);

    // we're avoiding the usage of to fixed, and using round instead with the e representation to address
    // numbers like 1.005 = 1.01. Using ToFixed to only provide trailig zeroes in case we have a whole number
    i = parseInt(amount = Number(Math.round(Math.abs(+amount || 0) + 'e+' + precision) + ('e-' + precision)) , 10) + '';
    pad = (i.length < integerRequired) ? (integerRequired - i.length) : 0;

    i = stringPad('0', pad) + i;

    j = i.length > groupLength ? i.length % groupLength : 0;
    re = new RegExp('(\\d{' + groupLength + '})(?=\\d)', 'g');

    // replace(/-/, 0) is only for fixing Safari bug which appears
    // when Math.abs(0).toFixed() executed on '0' number.
    // Result is '0.-0' :(


    am = Number(Math.round(Math.abs(amount - i) + 'e+' + precision) + ('e-' + precision));
    r = (j ? i.substr(0, j) + groupSymbol : '') +
        i.substr(j).replace(re, '$1' + groupSymbol) +
        (precision ? decimalSymbol + am.toFixed(2).replace(/-/, 0).slice(2) : '');

    return pattern.replace('%s', r).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

Примечание: window.precision - это глобальная переменная, которой я присвоил значение при загрузке страницы.

 1
Author: Toan Tam, 2017-07-23 06:10:00