オーバーライドなしで成功ページでカスタムphtmlを呼び出す


7

Magento 2でphtml、ブロックを上書きせずに、カスタムファイル注文の成功ページを呼び出します。これを達成する方法はありますか?

success.phtmlモジュールを作成しているときにMagentoを編集したくありません。

どんな助けでも感謝します

ありがとう。

回答:


12

モジュールでMagentoのレイアウトファイルを使用して、カスタムブロックを挿入できます。あなたのケースcheckout_onepage_success.xmlでは、顧客が注文成功ページにいるときにアクティブになるカスタムモジュールでレイアウトファイルを使用する必要があります。レイアウトファイルで、referenceContainerまたはを使用して、カスタムテンプレートを追加する場所を指定する必要がありますreferenceBlock

あなたのために私は簡単なモジュールを作成し、それがうまく機能することをテストしました。

registration.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>

指定beforeまたはafterあなたが前か後に、テンプレートを追加したい場所を指定し、タグorder.success.additional.infoのコンテナ。ここでafter="-"order.success.additional.info、同じセクションにある他のすべてのコンテナの後に、テンプレートをコンテナに追加します。

view / frontend / templates / order / success.phtml

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

私はmagento success.phtmlを編集したくありません。拡張機能を作成しているので、これをxmlまたはイベントで実現したいと思います。
Smith

@Smithの回答がコメントに従って更新されました。
amitshree 2016

これは大いに役立ちました。+1 :)
Shoaib Munir

3

元の注文成功ブロック/テンプレートを上書きせずに、block / htmlファイル内の現在の$ orderオブジェクトを利用/アクセスしたい場合。ここに完全なソリューションがあります:

registration.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(); ?>

2

新しいモジュールを作成したくない場合は、テーマで作成することもできます。以下の手順に従ってください:

1. checkout_onepage_success.xmlテーマを作成します。例えば:

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

ファイルの内容は次のとおりです。

<?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.次に、テンプレートファイルを作成する必要があります:

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

テンプレートには任意のコンテンツを追加できます。例えば:

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

キャッシュをクリアすれば完了です。


これは大いに役立ちました。+1 :)
Shoaib Munir

0

checkout_onepage_success.xmlで:

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

以前に私のコードを逃しました、今私の答えをチェックできますか?

fschmengler


Magento SEへようこそ。それを使用する方法についてもう少し情報を追加できますか?現状では、答えはあまり役に立ちません。
Fabian Schmengler、2016

-1

referenceContainerまたはreferenceBlockを使用して、成功ページにphtmlファイルを追加できます。

<referenceBlock name="checkout.success">
      <block class="[Company]\[Vendor]\Block\[Yourblock]" template="Company_Vendor::yourfile.phtml" name="[Yourblock Name]"/>
</referenceBlock>

1
それを使用する方法についてもう少し情報を追加できますか?現状では、答えはあまり役に立ちません。
Fabian Schmengler、2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.