Magento 2 Obter total do pedido na página de sucesso?


13

Estou tentando obter o total do pedido na página de sucesso do magento 2, adicionei este código

<?php
$order = Mage::getModel('sales/order')->loadByIncrementId($this->getOrderId());
$totall = $order->getGrandTotal();
?>

Mas estou recebendo um erro quando chego à página de sucesso depois de fazer um pedido, acho que o código funciona para o magento 1, mas não para 2. Como posso fazer isso funcionar também no magento 2?


Oi @alexcr, você usa o comando magento 1 para obter dados. Basta colocar o código abaixo para obter os dados do pedido na página de sucesso no magneto 2. $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ orderData = $ objectManager-> create ('Magento \ Vendas \ Modelo \ Pedido') -> loadByIncrementId ($ block-> getOrderId ()); echo "<pre>"; print_r ($ orderData-> getData ());
Nikul

Respostas:


24

Magento 2.1

O bloco mencionado abaixo está agora Magento\Checkout\Block\Onepage\Success

Magento 2.0

A única coisa que você pode recuperar nativamente nesta página é o ID do pedido usando o getRealOrderId()método definido emMagento\Checkout\Block\Success

Portanto, para obter o ID do pedido, você pode chamar o seguinte em seu modelo:

$block->getRealOrderId();

No entanto, entendo que não é exatamente o que você precisa.

Nesse caso, mesmo que você possa usar o gerenciador de objetos diretamente, isso não é recomendado. Você deve usar um módulo personalizado para definir preferências para este bloco .

Em app/code/Vendor/Module/etc/frontend/di.xmlque você precisa o seguinte código:

<?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\Checkout\Block\Success"
                type="Vendor\Module\Block\Checkout\Success"/>
</config>

Então em app/code/Vendor/Module/Block/Checkout/Success.php:

<?php
namespace Vendor\Module\Block\Checkout;

class Success extends \Magento\Checkout\Block\Success
{
    /**
     * @return int
     */
    public function getGrandTotal()
    {
        /** @var \Magento\Sales\Model\Order $order */
        $order = $this->_orderFactory->create()->load($this->getLastOrderId());
        return $order->getGrandTotal();
    }
}

Não esqueça o habitual app/code/Vendor/Module/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="Vendor_Module" setup_version="0.0.1" />
</config>

Assim como o app/code/Vendor/Module/registration.php

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

Depois de concluir e executar os seguintes comandos:

php bin/magento module:enable Vendor_Module
php bin/magento setup:upgrade

Você deve chamar o seguinte no seu modelo:

$block->getGrandTotal();

Adicionando mais métodos

Você pode adicionar o seguinte que pode ser útil ao rastrear a classe de bloco:

public function getSubtotal()
{
    /** @var \Magento\Sales\Model\Order $order */
    $order = $this->_orderFactory->create()->load($this->getLastOrderId());
    return $order->getSubtotal();
}

public function getDiscountAmount()
{
    /** @var \Magento\Sales\Model\Order $order */
    $order = $this->_orderFactory->create()->load($this->getLastOrderId());
    return $order->getDiscountAmount();
}

Em seguida, você poderá chamar o seguinte no seu modelo:

$block->getSubtotal();
$block->getDiscountAmount();

oi Raphel, tomo apenas referência da sua resposta.
Rakesh Jesadiya

2
@ Rakesh Não tenho nenhum problema em você fazer referência à minha resposta, estamos aqui para aprender e ensinar, não é justo simplesmente copiar / colar a resposta votada porque você está com voto negativo. O pôster original aceitou sua resposta original, o que significa que sua resposta está correta e funcionou para ele. No entanto, como eu disse na minha resposta e como David Manners disse no comentário, isso não é recomendado e deve ser evitado sempre que possível.
Raphael no Digital Pianism

@ Rakesh bem, eu não sou responsável por upvotes e downvotes. E copiar / colar as respostas de outras pessoas não o ajudará a ser votado. Mais uma vez, sua resposta está correta para todos os usuários; ela funcionará em qualquer lugar, mas não é recomendável usar o ObjectManager diretamente. Estamos aqui para aprender e eu tenho certeza que você vai tentar evitar o uso do ObjectManager diretamente em seus futuros respostas
Raphael em Digital pianismo

1
Oi Raphael, se o seu exemplo não funcionar e app / code / Vendor / Module / Block / Checkout / Success.php não for renderizado (mesmo que eu insira die () ou sintaxe php ilegal), isso significa que ele é substituído em outro lugar? Eu corro a compilação ..
Claudiu Creanga

@ClaudiuCreanga poderia ser. Na última vez que testei no Magento 2.0, não tentei o código nas versões 2.1 mais recentes. Você pode usar echo get_class($block);para verificar se a substituição funciona, mas se o bloco não é processado em tudo isso não é provavelmente vai funcionar
Raphael em Digital pianismo

4

Só abrir Magento_Checkout/frontend/templates/success.phtml

E coloque o código abaixo no arquivo

    $objectManager =  \Magento\Framework\App\ObjectManager::getInstance();
              $orderData = $objectManager->create('Magento\Sales\Model\Order')->loadByIncrementId($block->getOrderId());
echo "<pre>";print_r($orderData->getData());

No código acima, você obterá todos os dados do pedido na página de sucesso.

obrigado


1
Citando a documentação oficial: "O Magento proíbe o uso direto do ObjectManager no seu código porque oculta as dependências reais de uma classe. Veja as regras de uso." devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin

2

Até onde eu sei, há um evento - checkout_onepage_controller_success_actionque é disparado após uma página do Google Checkout ser concluída com êxito.

fornecedor / magento / check-out do módulo / Controller / Onepage / Success.php

public function execute()
{
    $session = $this->getOnepage()->getCheckout();
    if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
        return $this->resultRedirectFactory->create()->setPath('checkout/cart');
    }
    $session->clearQuote();
    //@todo: Refactor it to match CQRS
    $resultPage = $this->resultPageFactory->create();
    $this->_eventManager->dispatch(
        'checkout_onepage_controller_success_action',
        ['order_ids' => [$session->getLastOrderId()]]
    );
    return $resultPage;
}

Como podemos ver, podemos obter o ID do pedido usando o Observer. Por exemplo:

public function execute(\Magento\Framework\Event\Observer $observer)
{

    $orderIds = $observer->getEvent()->getOrderIds();
    if (empty($orderIds) || !is_array($orderIds)) {
        return $this;
    }

    //.......

    $block = $this->_layout->getBlock('your_block_here');
    if ($block) {
        $block->setOrderIds($orderIds);
    }
}

Dê uma olhada nos módulos do Google para obter mais detalhes:
vendor / magento / module-google-adwords
vendor / magento / module-google-analytics


Eu gosto da idéia de usar um observador, no entanto, a maneira como você faz isso é meio inútil, porque já existe um método para recuperar o ID do pedido no bloco (veja minha resposta).
Raphael no Digital Pianism
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.