Magento 2 Obtenez le total de la commande sur la page de réussite?

13

J'essaie d'obtenir le total de la commande sur la page de réussite sur magento 2, j'ai ajouté ce code

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

Mais je reçois une erreur lorsque j'atteins la page de réussite après avoir passé une commande, je suppose que le code fonctionne pour magento 1 mais pas 2. Comment puis-je faire en sorte que cela fonctionne également sur magento 2?

alexcr
la source
Salut @alexcr, vous utilisez la commande magento 1 pour obtenir des données. Il suffit de mettre le code ci-dessous pour obtenir les données de commande dans la page de réussite en magnéto 2. $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ orderData = $ objectManager-> create ('Magento \ Sales \ Model \ Order') -> loadByIncrementId ($ block-> getOrderId ()); echo "<pre>"; print_r ($ orderData-> getData ());
Nikul
Vérifiez ce lien codextblog.com/code-snippet/…
Saravanan DS

Réponses:

24

Magento 2.1

Le bloc mentionné ci-dessous est maintenant Magento\Checkout\Block\Onepage\Success

Magento 2.0

La seule chose que vous pouvez récupérer en mode natif sur cette page est l'ID de commande à l'aide de la getRealOrderId()méthode définie dansMagento\Checkout\Block\Success

Ainsi, pour obtenir l'ID de commande, vous pouvez appeler ce qui suit dans votre modèle:

$block->getRealOrderId();

Cependant, je comprends que ce n'est pas exactement ce dont vous avez besoin.

Dans ce cas, même si vous pouvez utiliser directement le gestionnaire d'objets, il n'est pas recommandé. Vous devez utiliser un module personnalisé pour définir les préférences de ce bloc .

En app/code/Vendor/Module/etc/frontend/di.xmlvous avez besoin le code suivant:

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

Puis dans 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'oubliez pas l'habituel 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>

Aussi bien que app/code/Vendor/Module/registration.php

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

Une fois que vous avez terminé et que vous avez exécuté les commandes suivantes:

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

Vous devriez pouvoir appeler les éléments suivants dans votre modèle:

$block->getGrandTotal();

Ajouter plus de méthodes

Vous pouvez ajouter les éléments suivants qui peuvent être utiles lors du suivi dans la classe de bloc:

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

Ensuite, vous pourrez appeler ce qui suit à partir de votre modèle:

$block->getSubtotal();
$block->getDiscountAmount();
Raphael chez Digital Pianism
la source
salut Raphel, je viens de prendre référence à votre réponse.
Rakesh Jesadiya
2
@Rakesh Je n'ai aucun problème avec vous référençant ma réponse, nous sommes ici pour apprendre et enseigner, il est tout simplement injuste de simplement copier / coller la réponse votée parce que vous avez voté contre. L'affiche originale a accepté votre réponse originale, ce qui signifie que votre réponse est correcte et a fonctionné pour lui. Cependant, comme je l'ai dit dans ma réponse et comme l'a dit David Manners dans le commentaire, ce n'est pas recommandé et devrait être évité chaque fois que cela est possible.
Raphael au Digital Pianism
@Rakesh et je ne suis pas responsable des votes positifs et négatifs. Et copier / coller les réponses des autres ne vous aidera pas à voter. Encore une fois, votre réponse est correcte pour tous les utilisateurs, cela fonctionnera partout mais il est déconseillé d'utiliser directement l'ObjectManager. Nous sommes ici pour apprendre et je suis sûr que vous essayerez d'éviter d'utiliser l'ObjectManager directement dans vos futures réponses
Raphael au Digital Pianism
1
Salut Raphael, si votre exemple ne fonctionne pas et que l'application / code / Vendor / Module / Block / Checkout / Success.php n'est pas rendu du tout (même si j'insère die () ou une syntaxe php illégale), cela signifie-t-il qu'il est écrasé ailleurs? Je lance la compilation ..
Claudiu Creanga
@ClaudiuCreanga ça pourrait être. La dernière fois que j'ai testé c'était au début de Magento 2.0, je n'ai pas essayé le code sur les dernières versions 2.1. Vous pouvez utiliser echo get_class($block);pour vérifier si le remplacement fonctionne mais si le bloc n'est pas rendu du tout, cela ne fonctionnera probablement pas
Raphael at Digital Pianism
4

Il suffit d'ouvrir Magento_Checkout/frontend/templates/success.phtml

Et mettez le code ci-dessous dans le fichier

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

Dans le code ci-dessus, vous obtiendrez toutes les données de commande sur la page de réussite.

Merci

Nikul
la source
1
Citant la documentation officielle: "Magento interdit l'utilisation directe de l'ObjectManager dans votre code car il cache les vraies dépendances d'une classe. Voir les règles d'utilisation." devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin
2

Autant que je sache, il y a un événement - checkout_onepage_controller_success_actionqui est déclenché après que Checkout une page a réussi.

fournisseur / 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;
}

Comme nous pouvons le voir, nous pouvons obtenir l'ID de commande en utilisant Observer. Par exemple:

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

Jetez un œil aux modules google pour plus de détails:
vendeur / magento / module-google-adwords
vendeur / magento / module-google-analytics

Khoa TruongDinh
la source
J'aime l'idée d'utiliser un observateur, mais la façon dont vous le faites est un peu inutile car il existe déjà une méthode pour récupérer l'ID de commande dans le bloc (voir ma réponse).
Raphael au Digital Pianism