Magento 2 Ricevi il totale degli ordini nella pagina di successo?


13

Sto cercando di ottenere il totale dell'ordine nella pagina di successo su magento 2, ho aggiunto questo codice

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

Ma ricevo un errore quando raggiungo la pagina di successo dopo aver effettuato un ordine, immagino che il codice funzioni per Magento 1 ma non 2. Come posso farlo funzionare anche su Magento 2?


Ciao @alexcr, usi magento 1 per ottenere dati. Basta inserire il codice seguente per ottenere i dati dell'ordine nella pagina di successo in 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,

Risposte:


24

Magento 2.1

Il blocco di seguito indicato è ora Magento\Checkout\Block\Onepage\Success

Magento 2.0

L'unica cosa che puoi recuperare in modo nativo su questa pagina è l'id dell'ordine usando il getRealOrderId()metodo definito inMagento\Checkout\Block\Success

Pertanto, per ottenere l'ID ordine è possibile chiamare quanto segue nel modello:

$block->getRealOrderId();

Tuttavia, capisco che non è esattamente ciò di cui hai bisogno.

In tal caso, anche se è possibile utilizzare direttamente la gestione oggetti, non è consigliabile. È necessario utilizzare un modulo personalizzato per definire le prefenze per questo blocco .

In app/code/Vendor/Module/etc/frontend/di.xmlè necessario il seguente codice:

<?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>

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

Non dimenticare il solito 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>

Così come il app/code/Vendor/Module/registration.php

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

Una volta che hai finito e hai eseguito i seguenti comandi:

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

Dovresti essere in grado di chiamare quanto segue nel tuo modello:

$block->getGrandTotal();

Aggiunta di più metodi

È possibile aggiungere quanto segue che può essere utile durante il tracciamento alla classe di blocco:

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

Quindi sarai in grado di chiamare quanto segue dal tuo modello:

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

ciao Raphel, ho preso solo un riferimento dalla tua risposta.
Rakesh Jesadiya,

2
@Rakesh Non ho alcun problema a riferirti alla mia risposta, siamo qui per imparare e insegnare, semplicemente non è giusto copiare / incollare la risposta votata perché sei sottoposta a downgrade. Il poster originale ha accettato la tua risposta originale, il che significa che la tua risposta è corretta e ha funzionato per lui. Tuttavia, come ho detto nella mia risposta e come ha detto David Manners nel commento, non è raccomandato e dovrebbe essere evitato ogni volta che è possibile.
Raffaello al Pianismo digitale,

@Rakesh bene non sono responsabile per voti positivi e negativi. E copiare / incollare le risposte degli altri non ti aiuterà a ottenere il voto. Ancora una volta la tua risposta è corretta per tutti gli utenti, funzionerà ovunque ma è sconsigliato utilizzare direttamente l'ObjectManager. Siamo qui per imparare e sono sicuro che
proverai

1
Ciao Raffaele, se il tuo esempio non funziona e app / code / Vendor / Module / Block / Checkout / Success.php non viene visualizzato (anche se inserisco die () o sintassi php illegale), significa che viene sovrascritto altrove? Corro la compilazione ..
Claudiu Creanga,

@ClaudiuCreanga potrebbe essere. L'ultima volta che ho provato che era su Magento 2.0 non ho provato il codice sulle ultime versioni 2.1. Puoi usare echo get_class($block);per verificare se l'override funziona ma se il blocco non è reso per niente probabilmente non funzionerà
Raphael at Digital Pianism

4

Basta aprire Magento_Checkout/frontend/templates/success.phtml

E metti sotto il codice in File

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

Nel codice sopra otterrai tutti i dati dell'ordine nella pagina di successo.

Grazie


1
Citando la documentazione ufficiale: "Magento proibisce l'uso diretto dell'ObjectManager nel tuo codice perché nasconde le dipendenze reali di una classe. Vedi le regole di utilizzo." devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin

2

Per quanto ne so, c'è un evento - checkout_onepage_controller_success_actionche viene generato dopo che la pagina di checkout è stata eseguita correttamente.

vendor / Magento / module-out / 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;
}

Come possiamo vedere, possiamo ottenere l'id dell'ordine usando Observer. Per esempio:

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

Dai un'occhiata ai moduli di Google per maggiori dettagli:
fornitore / magento / modulo-google- fornitore adwords
/ magento / modulo-google-analytics


Mi piace l'idea di usare un osservatore, tuttavia il modo in cui lo fai è in qualche modo inutile perché c'è già un metodo per recuperare l'ID ordine nel blocco (vedi la mia risposta).
Raffaello al Pianismo digitale,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.