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?


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 .


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.