Chame phtml personalizado na página de sucesso sem substituir

7

No Magento 2, desejo chamar minha phtmlpágina de sucesso de pedido de arquivo personalizado , mas sem substituir o bloco. Existe alguma maneira de conseguir isso?

Não quero editar o Magento success.phtmlenquanto estou criando o módulo.

Qualquer ajuda será apreciada

Obrigado.

Smith
fonte

Respostas:

12

Você pode usar qualquer arquivo de layout do Magento no seu módulo para inserir seu bloco personalizado. No seu caso, você precisa usar o checkout_onepage_success.xmlarquivo de layout em seu módulo personalizado, que estará ativo quando um cliente estiver na página de êxito do pedido. No arquivo de layout, você precisa especificar onde deseja adicionar seu modelo personalizado usando referenceContainerou referenceBlock.

Para você, criei um módulo simples e testei o que funciona bem.

registration.php

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

compositer.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.';
    }
}

visualizar / 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>

Especifique beforeou aftermarque para especificar onde você deseja adicionar seu modelo antes ou depois do order.success.additional.infocontêiner. Aqui, after="-"você adicionará seu modelo ao order.success.additional.infocontainer, depois de todos os outros containers presentes na mesma seção.

view / frontend / templates / order / success.phtml

<?php /* @var $block \Amit\Orderpage\Block\Success */?>
<?php echo __('Custom template file content.'); ?>
<?php echo $block->getSomething(); ?>
amitshree
fonte
Não quero editar o magento success.phtml, quero conseguir isso por xml ou event enquanto estou criando uma extensão.
Smith
Resposta do @Smith atualizada de acordo com seu comentário.
amitshree
Isso ajudou muito. +1 :)
Shoaib Munir
3

Se você deseja utilizar / acessar o objeto $ order atual em seu arquivo block / html, sem substituir o bloco / modelo de sucesso do pedido original. Aqui está a solução completa:

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(); ?>
Ajay Gehlod
fonte
2

Se você não deseja criar um novo módulo, também pode fazê-lo no seu tema. Siga as etapas abaixo:

1. Crie checkout_onepage_success.xmlno seu tema. Por exemplo:

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

O conteúdo do arquivo é:

<?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.Então você precisa criar o arquivo de modelo:

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

Você pode adicionar qualquer conteúdo no modelo. Por exemplo:

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

Limpe o cache e pronto.

Arvind07
fonte
Isso ajudou muito. +1 :)
Shoaib Munir
0

Em checkout_onepage_success.xml: -

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

Perdeu meu código antes, você pode verificar minha resposta agora.

fschmengler

Sivabupathy VR
fonte
Bem-vindo ao Magento SE. Você pode adicionar um pouco mais de informações sobre como usá-lo? Tal como está, a resposta não é muito útil.
Fabian Schmengler
-1

você pode usar referenceContainer ou referenceBlock para adicionar seu arquivo phtml na página de sucesso dos pedidos.

<referenceBlock name="checkout.success">
      <block class="[Company]\[Vendor]\Block\[Yourblock]" template="Company_Vendor::yourfile.phtml" name="[Yourblock Name]"/>
</referenceBlock>
Dhiren Vasoya
fonte
1
Você pode adicionar um pouco mais de informações sobre como usá-lo? Tal como está, a resposta não é muito útil.
Fabian Schmengler