Wie überschreibe ich final_price.phtml in Magento 2?

7

Ich möchte final_price.phtml überschreiben. Ich habe versucht, in meinem Modul zu folgen, aber es funktioniert nicht. Ich habe app / code / MyVendor / MyModule / view / frontend / layout / catalog_product_prices.xml erstellt

<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="render.product.prices">
        <arguments>
            <argument name="default" xsi:type="array">
                <item name="prices" xsi:type="array">
                    <item name="final_price" xsi:type="array">
                        <!-- item name="render_class" xsi:type="string">Magento\Catalog\Pricing\Render\FinalPriceBox</item> -->
                        <item name="render_template" xsi:type="string">MyVendor_MyModule::product/price/final_price.phtml</item>
                    </item>
                </item>
            </argument>
        </arguments>
    </referenceBlock>
</layout> 

Außerdem habe ich auch eine Vorlagendatei erstellt. unter app / code / MyVendor / MyModule / view / frontend / templates / product / price / final_price.phtml Und in final_price.phtml habe ich meinen benutzerdefinierten Code geschrieben.

Aber es funktioniert nicht. Kann mir jemand sagen, was in diesem Code fehlt?

Dhaval Solanki
quelle
Haben Sie danach den Magento-Cache geleert?
Amit Bera
Ja, ich habe überprüft, ob der Cache deaktiviert ist.
Dhaval Solanki
Haben Sie jemals herausgefunden, wie das über Layouts geht? Weil die Plug-in-Lösung ein bisschen schrecklich ist ...
Pol Ravalitera
@pol Nein Ich weiß nicht, ob es mit Layout möglich ist oder nicht.
Dhaval Solanki
Überprüfen Sie das Fehlerprotokoll und kommentieren Sie es hier
Sameer Bhayani

Antworten:

12

Sie können eine alternative Methode zum Überschreiben der Vorlage verwenden. Verwenden Sie den folgenden Code. Es wird klappen.

app / code / MyVendor / MyModule / etc / di.xml

<type name="\Magento\Catalog\Pricing\Render\FinalPriceBox">
        <plugin name="MyVendor_MyModule_change_template" type="MyVendor\MyModule\Plugin\FinalPricePlugin" />
</type>

MyVendor \ MyModule \ Plugin \ FinalPricePlugin.php

<?php
namespace MyVendor\MyModule\Plugin;

class FinalPricePlugin
{
    public function beforeSetTemplate(\Magento\Catalog\Pricing\Render\FinalPriceBox $subject, $template)
    {
        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $enable=$objectManager->create('MyVendor\MyModule\Helper\Data')->chkIsModuleEnable();
        if ($enable) {
            if ($template == 'Magento_Catalog::product/price/final_price.phtml') {
                return ['MyVendor_MyModule::product/price/final_price.phtml'];
            } 
            else
            {
                return [$template];
            }
        } else {
            return[$template];
        }
    }
}

Hoffe es wird für dich funktionieren.

Kishan Patadia
quelle
Freut mich zu hören, dass es dir hilft.
Kishan Patadia
sehr hilfreich @kishan Patadia
Ramkishan Suthar
GENIAL-!
Pini
3
Die Verwendung des Plugins ist keine gute Lösung, denn wenn Sie mehrere Themen haben, wird immer eine Vorlage benötigt, die im Plugin erwähnt wird. Stellen Sie daher aus dem Layout-XML Ihre benutzerdefinierte Vorlage ein, die in meinem folgenden Beitrag erwähnt wird
Pradeep Kumar
Bitte posten Sie den vollständigen Inhalt der Datei di.xml. Ihr Code ist nur ein Teil davon und funktioniert nicht
zekia
2

Dafür muss kein Plugin geschrieben werden, wir müssen es auf XML-Ebene tun

Erstellen Sie eine Layout-XML

app \ code \ MYNAME_SPACE \ MY_MODULE \ view \ base \ layout \ catalog_product_prices.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2013-2017 Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="render.product.prices">
        <arguments>
            <argument name="default" xsi:type="array">
                <item name="prices" xsi:type="array">
                    <item name="final_price" xsi:type="array">
                        <item name="render_template" xsi:type="string">MYNAME_SPACE_MY_MODULE::product/price/final_price.phtml</item>
                    </item>
                </item>
            </argument>
        </arguments>
    </referenceBlock>
</layout>

Die obige XML-Datei wirkt sich nur auf einfache Produkte aus, wenn Sie das Bundle-Produkt dann ändern müssen

<argument name="default" xsi:type="array">

sollte sein

<argument name="bundle" xsi:type="array">

oder im Falle eines konfigurierbaren Produkts

<argument name="configurable" xsi:type="array">

Erstellen Sie eine HTML-Datei

\ app \ code \ MYNAME_SPACE \ MY_MODULE \ view \ base \ templates \ product \ price \ final_price.phtml

Kopieren Sie final_price vom Kernmodul und ändern Sie es nach Bedarf

Um andere Preistypen zu ändern, können Sie sich darauf beziehen

Hersteller \ Magento \ Modul-Bundle \ Ansicht \ Basis \ Layout \ Katalog_Produkt_Preise.xml

Pradeep Kumar
quelle
Das hat bei mir nicht funktioniert. Verwenden von Magento 2.2.0.
JDhildeb
1

Ich konnte überschreiben, final_price.phtmlindem ich das Verzeichnis unter meinem Thema neu erstellte.

Originaldatei lebt

vendor/magento/module-catalog/view/base/templates/product/price/final_price.phtml

Neue Datei lebt hier

/app/design/frontend/NAMESPACE/MYTHEME/Magento_Catalog/templates/product/price/final_price.phtml
Carlos Altamirano
quelle
Das funktioniert nicht in Magento 2.3
Charly
0

Überprüfen Sie zuerst Ihre final_price.phtml auf Fehler.

Leeren und bereinigen Sie nun den Cache mit cli-Befehlen

bin / magento cache: sauber

Bin / Magento-Cache: Flush

Jetzt aktualisieren.

Pankaj Bhope
quelle
Keine final_price.phtml hat keinen Fehler, den ich überprüft habe. und Cache ist deaktiviert dann habe ich auch oben versucht, aber kein Glück.
Dhaval Solanki
0

Ich hatte das gleiche Problem, das ich nicht überschreiben konnte final_price.phml. Ich löste das Problem durch Zugabe sequencezu dem module.xmlmit Magento_Catalog (und dann setup:upgrade):

    <sequence>
        <module name="Magento_Catalog" />
    </sequence> 
Adrian Szulc
quelle
0
  1. Erstellen Sie app / code / Vendor / Module / view / base / layout / catalog_product_prices.xml:
    <?xml version="1.0"?>
    <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
        <referenceBlock name="render.product.prices">
            <arguments>
                <argument name="configurable" xsi:type="array">
                    <item name="prices" xsi:type="array">
                        <item name="final_price" xsi:type="array">
                            <item name="render_template" xsi:type="string">Cloudinfo_ChangesTheme::product/price/final_price.phtml</item>
                        </item>
                    </item>
                </argument>
            </arguments>
        </referenceBlock>
    </layout>
  1. Fügen Sie in module.xml hinzu:
       <sequence>
           <module name="Magento_Catalog" />
       </sequence>
  1. Erstellen Sie app / code / Vendor / Moduleview / base / templates / product / price / final_price.phtml

  2. bin / magento-Setup: Upgrade && bin / magento-Setup: di: kompilieren && bin / magento-Setup: statischer Inhalt: Bereitstellen && bin / magento c: c && bin / magento c: f

Carlossoratto
quelle
Funktioniert dieses Konzept für M2.3.4?
Nagaraju K