Magento 2 Obtenga el total del pedido en la página de éxito?

13

Estoy tratando de obtener el total del pedido en la página de éxito en magento 2, he agregado este código

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

Pero recibo un error cuando llego a la página de éxito después de realizar un pedido, supongo que el código funciona para magento 1 pero no 2. ¿Cómo puedo hacer que esto funcione también en magento 2?

alexcr
fuente
Hola @alexcr, usa el comando magento 1 para obtener datos. Simplemente ponga el código a continuación para obtener los datos del pedido en la página de éxito en magneto 2. $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ orderData = $ objectManager-> create ('Magento \ Sales \ Model \ Order') -> loadByIncrementId ($ block-> getOrderId ()); echo "<pre>"; print_r ($ orderData-> getData ());
Nikul
Consulte este enlace codextblog.com/code-snippet/…
Saravanan DS

Respuestas:

24

Magento 2.1

El bloque mencionado a continuación es ahora Magento\Checkout\Block\Onepage\Success

Magento 2.0

Lo único que puede recuperar de forma nativa en esta página es la identificación del pedido utilizando el getRealOrderId()método definido enMagento\Checkout\Block\Success

Por lo tanto, para obtener la identificación del pedido, puede llamar a lo siguiente en su plantilla:

$block->getRealOrderId();

Sin embargo, entiendo que eso no es exactamente lo que necesitas.

En ese caso, aunque podría usar el administrador de objetos directamente, no se recomienda. Debe usar un módulo personalizado para definir las preferencias para este bloque .

En app/code/Vendor/Module/etc/frontend/di.xmlnecesita el siguiente 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>

Luego en 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();
    }
}

No olvides lo usual 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>

Así como el app/code/Vendor/Module/registration.php

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

Una vez que haya terminado y haya ejecutado los siguientes comandos:

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

Debería poder llamar a lo siguiente en su plantilla:

$block->getGrandTotal();

Agregar más métodos

Puede agregar lo siguiente que puede ser útil al realizar un seguimiento a la clase de bloque:

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();
}

Entonces podrá llamar a lo siguiente desde su plantilla:

$block->getSubtotal();
$block->getDiscountAmount();
Raphael en Digital Pianism
fuente
hola Raphel, acabo de tomar referencia de tu respuesta.
Rakesh Jesadiya
2
@Rakesh No tengo ningún problema con que hagas referencia a mi respuesta, estamos aquí para aprender y enseñar, simplemente no es justo simplemente copiar / pegar la respuesta votada porque has votado negativamente. El póster original aceptó su respuesta original, lo que significa que su respuesta es correcta y funcionó para él. Sin embargo, como dije en mi respuesta y como dijo David Manners en el comentario, no se recomienda y debe evitarse siempre que sea posible.
Raphael en Digital Pianism
@Rakesh, bueno, no soy responsable de los votos a favor y en contra. Y copiar / pegar las respuestas de otros no te ayudará a ser votado. Una vez más, su respuesta es correcta para todos los usuarios, funcionará en todas partes, pero no se recomienda utilizar ObjectManager directamente. Estamos aquí para aprender y estoy seguro de que tratará de evitar el uso del ObjectManager directamente en sus futuras respuestas
Raphael en Digital Pianism
1
Hola Raphael, si tu ejemplo no funciona y la aplicación / código / Proveedor / Módulo / Bloque / Pago / Éxito.php no se procesa (incluso si inserto die () o sintaxis php ilegal), ¿significa que se sobrescribe en otro lugar?
Ejecuto
@ClaudiuCreanga podría ser. La última vez que probé eso fue en Magento 2.0 temprano, no he probado el código en las últimas versiones 2.1. Puede usar echo get_class($block);para verificar si la anulación funciona, pero si el bloque no se procesa, eso probablemente no funcionará
Raphael en Digital Pianism
4

Solo abre Magento_Checkout/frontend/templates/success.phtml

Y poner el siguiente código en el archivo

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

En el código anterior obtendrá todos los datos del pedido en la página de éxito.

Gracias

Nikul
fuente
1
Citando la documentación oficial: "Magento prohíbe el uso directo del ObjectManager en su código porque oculta las dependencias reales de una clase. Consulte las reglas de uso". devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin
2

Hasta donde yo sé, hay un evento, checkout_onepage_controller_success_actionque se dispara después de que la página Checkout one se realice correctamente.

vendor / magento / module-checkout / 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 obtener la identificación del pedido usando Observer. Por ejemplo:

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);
    }
}

Eche un vistazo a los módulos de google para obtener más detalles:
vendor / magento / module-google-adwords
vendor / magento / module-google-analytics

Khoa TruongDinh
fuente
Me gusta la idea de usar un observador, sin embargo, la forma en que lo estás haciendo es inútil porque ya hay un método para recuperar la identificación del pedido en el bloque (ver mi respuesta).
Raphael en Digital Pianism