Wie kann ich das PriceCurrencyInterface in Magento 2 überschreiben?

7

In \magento\framework\Pricing\PriceCurrencyInterfacemöchte ich die Konstante in dieser phpSchnittstellendatei folgendermaßen ändern :

/**
 * Default precision
 */
const DEFAULT_PRECISION = 2;

dazu:

/**
 * Default precision
 */
const DEFAULT_PRECISION = 0;

Was sind die besten Methoden, um diese PHP-Schnittstelle aus den Magento-Core-Dateien zu überschreiben?

Wingski
quelle
Möchten Sie die Währungsgenauigkeit auf 0 statt 2 Dezimalstellen überspringen?
Rakesh Jesadiya
Ja. Es passiert überall in den Modulen, in einigen Teilen der Seiten passieren immer noch die Dezimalstellen im Preis. Anstatt die einzelnen Dateien in den jeweiligen Modulen, in denen PriceCurrencyInterface verwendet wurde, zu überschreiben oder zu erweitern, halte ich es für eine bessere Lösung, die PHP-Schnittstelle zu überschreiben, die die Konstante deklariert.
Wingski

Antworten:

7

Grundsätzlich müssen Sie die Abhängigkeitsdatei der priceCurrency-Schnittstelle wie folgt überschreiben, um die Preisgenauigkeit zu ändern.

Sie können die Preisgenauigkeit wie folgt einstellen:

Sie müssen lediglich ein einfaches Modul dafür erstellen.

Erstellen Sie das Rbj / PriceCurrency- Modul unter dem App / Code-Ordner Magento.

Erstellen registration.php Datei,

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Rbj_PriceCurrency',
    __DIR__
);

Ordner etc erstellen ,

app/code/Rbj/PriceCurrency/etc/module.xml
<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Rbj_PriceCurrency" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Backend"/>
            <module name="Magento_Directory"/>
        </sequence>
    </module>
</config>

app / code / Rbj / PriceCurrency / etc / di.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Directory\Model\Currency" type="Rbj\PriceCurrency\Model\Directory\Currency" />
</config>

app / code / Rbj / PriceCurrency / etc / frontend / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\Locale\Format">
        <plugin name="format-price" type="Rbj\PriceCurrency\Plugin\FormatPrice" sortOrder="10" />
    </type>
</config>

Erstellen Sie eine Modelldatei, die wir in der Datei di.xml dekaliert haben.

app / code / Rbj / PriceCurrency / Model / Directory / Currency.php

<?php
namespace Rbj\PriceCurrency\Model\Directory;

class Currency extends \Magento\Directory\Model\Currency
{
    /*
    * You can set precision from here in $options array
    */
    public function formatTxt($price, $options = [])
    {
        if (!is_numeric($price)) {
            $price = $this->_localeFormat->getNumber($price);
        }
        $price = sprintf("%F", $price);

        $options['precision'] = 0;

        return $this->_localeCurrency->getCurrency($this->getCode())->toCurrency($price, $options);
    }
}

Erstellen Sie app / code / Rbj / PriceCurrency / Plugin / FormatPrice.php

<?php
namespace Rbj\PriceCurrency\Plugin;

class FormatPrice
{
    /*
    * Returns an array with price formatting info
    *
    * \Magento\Framework\Locale\Format $subject
    */
    public function aroundGetPriceFormat(\Magento\Framework\Locale\Format $subject, callable $proceed, $localeCode = null, $currencyCode = null)
    {
        $returnValue = $proceed($localeCode, $currencyCode);

        $returnValue['requiredPrecision'] = 0;

        return $returnValue;
    }
}

php bin/magento setup:upgradeBefehl ausführen .

Rakesh Jesadiya
quelle
In REST-Aufrufen wird der Dezimalteil immer noch angezeigt ... "base_discount_amount": -48749.61, "base_grand_total": 76249.39, ...
Dmitry Dubovitsky
Nicht nur das, sondern die Gesamtsumme des Wagens wird auch auf ungerundeten Werten berechnet.
Nicoleolias
Ich ende mit einem ziemlich ordentlichen Modul github.com/karliuka/m2.Price, das all diese Probleme (und einige andere)
durchgemacht hat
4

Zunächst werde ich Ihre Frage beantworten

Was sind die besten Methoden, um diese PHP-Schnittstelle aus den Magento-Core-Dateien zu überschreiben?

Nach dem Grundwissen können wir eine Schnittstelle nicht überschreiben. In Magento wäre es dasselbe.

Zweitens werfen Sie einen Blick auf vendor/magento/module-catalog/etc/di.xml

<preference for="Magento\Framework\Pricing\PriceCurrencyInterface" 
           type="Magento\Directory\Model\PriceCurrency" />

Wie wir die eigentliche Klasse sehen können, die wir außer Kraft setzen müssen , ist Magento\Directory\Model\PriceCurrency.

Drittens kann dieses Modul Ihr Bedarf sein: https://github.com/Magento-Japan/m2-jplocalize/tree/master/price

Khoa TruongDinh
quelle