Rufen Sie auf der Erfolgsseite benutzerdefiniertes HTML ohne Überschreiben auf

7

In Magento 2 möchte ich meine phtmlErfolgsseite für benutzerdefinierte Dateiaufträge aufrufen, ohne jedoch den Block zu überschreiben. Gibt es eine Möglichkeit, dies zu erreichen?

Ich möchte Magento nicht bearbeiten, success.phtmlwährend ich ein Modul erstelle.

Jede Hilfe wird geschätzt

Vielen Dank.

Schmied
quelle

Antworten:

12

Sie können eine beliebige Layoutdatei von Magento in Ihrem Modul verwenden, um Ihren benutzerdefinierten Block einzufügen. In Ihrem Fall müssen Sie eine checkout_onepage_success.xmlLayoutdatei in Ihrem benutzerdefinierten Modul verwenden, die aktiv ist, wenn sich ein Kunde auf der Seite mit dem Erfolg der Bestellung befindet. In der Layoutdatei müssen Sie angeben, wo Sie Ihre benutzerdefinierte Vorlage mit referenceContaineroder hinzufügen möchten referenceBlock.

Für Sie habe ich ein einfaches Modul erstellt und es getestet, das gut funktioniert.

Registrierung.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Amit_Orderpage',
    __DIR__
);

composer.json

{
  "name": "amit/orderpage-module",
  "description": "Simple Magento 2 module that adds a new template on order success page.",
  "type": "magento2-module",
  "version": "1.0.0",
  "license": [
    "OSL-3.0",
    "AFL-3.0"
  ],
  "require": {
    "php": "~5.5.0|~5.6.0|~7.0.0",
    "magento/framework": "~100.0"
  },
  "autoload": {
    "files": [ "registration.php" ],
    "psr-4": {
      "Amit\\Orderpage\\": ""
    }
  }
}

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="Amit_Orderpage" setup_version="2.0.0"/>
</config>

Block / Success.php

<?php
namespace Amit\Orderpage\Block;
class Success  extends \Magento\Framework\View\Element\Template
{
    public function getSomething()
    {
        return 'returned something from custom block.';
    }
}

view / frontend / layout / checkout_onepage_success.xml

<?xml version="1.0"?>
<body>
    <referenceContainer name="order.success.additional.info">
        <block class="Amit\Orderpage\Block\Success"
               name="amit.order.success"
               template="Amit_Orderpage::order/success.phtml"
               after="-">
        </block>
    </referenceContainer>
</body>

Geben Sie an beforeoder aftermarkieren Sie, um anzugeben, wo Sie Ihre Vorlage vor oder nach dem order.success.additional.infoContainer hinzufügen möchten . Hier after="-"fügen Sie Ihre Vorlage dem order.success.additional.infoContainer hinzu, nachdem alle anderen Container im selben Abschnitt vorhanden sind.

view / frontend / templates / order / success.phtml

<?php /* @var $block \Amit\Orderpage\Block\Success */?>
<?php echo __('Custom template file content.'); ?>
<?php echo $block->getSomething(); ?>
amitshree
quelle
Ich möchte magento success.phtml nicht bearbeiten, ich möchte dies durch XML oder Ereignis erreichen, während ich eine Erweiterung erstelle.
Smith
@ Smith Antwort gemäß Ihrem Kommentar aktualisiert.
Amitshree
Das hat sehr geholfen. +1 :)
Shoaib Munir
3

Wenn Sie das aktuelle $ order-Objekt in Ihrer Block- / HTML-Datei verwenden / darauf zugreifen möchten, ohne den ursprünglichen Block / die Vorlage für den Erfolg der Bestellung zu überschreiben. Hier ist die Komplettlösung:

Registrierung.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'MageAj_OrderSuccess',
    __DIR__
);

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="MageAj_OrderSuccess" setup_version="2.0.0" />
</config>

app / code / MageAj / OrderSuccess / view / frontend / layout / checkout_onepage_success.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="order.success.additional.info">
            <block class="Magento\Framework\View\Element\Template" name="mageaj.success" template="MageAj_OrderSuccess::checkout/onepage/success.phtml" cacheable="false">
                <arguments>
                    <argument name="view_model" xsi:type="object">MageAj\OrderSuccess\ViewModel\Checkout\Onepage\Success</argument>
                </arguments>
            </block>
        </referenceContainer>        
    </body>    
</page>

app / code / MageAj / OrderSuccess / ViewModel / Checkout / Onepage / Success.php

<?php

namespace MageAj\OrderSuccess\ViewModel\Checkout\Onepage;

class Success implements \Magento\Framework\View\Element\Block\ArgumentInterface
{
    protected $_checkoutSession;
    public function __construct(
        \Magento\Checkout\Model\Session $checkoutSession        
    ) {        
        $this->_checkoutSession = $checkoutSession;       
    }

    public function getOrder()
    {
        return $this->_checkoutSession->getLastRealOrder();
    }
}

app / code / MageAj / OrderSuccess / view / frontend / templates / order / success.phtml

<?php $order = $block->getViewModel()->getOrder(); ?>
Ajay Gehlod
quelle
2

Wenn Sie kein neues Modul erstellen möchten, können Sie dies auch in Ihrem Thema tun. Befolgen Sie die folgenden Schritte:

1.Erstellen Sie checkout_onepage_success.xmlin Ihrem Thema. Zum Beispiel:

app / design / frontend /// Magento_Checkout / layout / checkout_onepage_success.xml.

Der Inhalt der Datei ist:

<?xml version="1.0"?>
<body>
    <referenceContainer name="order.success.additional.info">
        <block class="Magento\Checkout\Block\Onepage\Success"
               name="custom_info.order.success"
               template="Magento_Checkout::order/success/custom_info.phtml"
               after="-">
        </block>
    </referenceContainer>
</body>

2. Dann müssen Sie die Vorlagendatei erstellen:

app / design / frontend /// Magento_Checkout / templates / order / success / custom_info.phtml

Sie können der Vorlage beliebigen Inhalt hinzufügen. Zum Beispiel:

<?php /* @var $block \Magento\Checkout\Block\Onepage\Success */?>
<?php echo __('Custom template file content.'); ?>
<?php echo $block->getSomething(); ?>

Leeren Sie den Cache und Sie sind fertig.

Arvind07
quelle
Das hat sehr geholfen. +1 :)
Shoaib Munir
0

In checkout_onepage_success.xml: -

<block class="Magento\Framework\View\Element\Template" name="test_file" template="Magento_Theme::test.phtml"/>

Ich habe meinen Code schon einmal verpasst. Kannst du meine Antwort jetzt überprüfen?

fschmengler

Sivabupathy VR
quelle
Willkommen bei Magento SE. Können Sie ein bisschen mehr Informationen hinzufügen, wie man es benutzt? Derzeit ist die Antwort nicht sehr nützlich.
Fabian Schmengler
-1

Sie können referenceContainer oder referenceBlock verwenden, um Ihre HTML-Datei in der Reihenfolge des Erfolgs hinzuzufügen.

<referenceBlock name="checkout.success">
      <block class="[Company]\[Vendor]\Block\[Yourblock]" template="Company_Vendor::yourfile.phtml" name="[Yourblock Name]"/>
</referenceBlock>
Dhiren Vasoya
quelle
1
Können Sie ein bisschen mehr Informationen hinzufügen, wie man es benutzt? Derzeit ist die Antwort nicht sehr nützlich.
Fabian Schmengler