Magento 2 Başarı sayfasında sipariş toplamını al?


13

Magento 2 başarı sayfasında sipariş toplam almaya çalışıyorum, bu kodu ekledim

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

Ama bir sipariş sonra başarı sayfasına ulaştığımda bir hata alıyorum, kod magento 1 için çalışıyor ama 2 değil sanırım. Magento 2 de nasıl çalışabilirim?


Merhaba @alexcr veri almak için magento 1 komutunu kullanın. Magneto 2'de başarı sayfasında sipariş verilerini almak için kodun altına koymanız yeterlidir. $ ObjectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ orderData = $ objectManager-> create ('Magento \ Sales \ Model \ Order') -> loadByIncrementId ($ block-> getOrderId ()); echo "<pre>"; print_r ($ orderData-> getData ());
Nikul

Bu bağlantıyı kontrol edin codextblog.com/code-snippet/…
Saravanan DS

Yanıtlar:


25

Magento 2.1

Aşağıda belirtilen blok şimdi Magento\Checkout\Block\Onepage\Success

Magento 2.0

Bu sayfada yerel olarak alabileceğiniz tek şey, getRealOrderId()içinde tanımlanan yöntemi kullanarak sipariş kimliğidir .Magento\Checkout\Block\Success

Böylece, sipariş kimliğini almak için şablonunuzda aşağıdakileri arayabilirsiniz:

$block->getRealOrderId();

Ancak, bunun tam olarak ihtiyacınız olan şey olmadığını anlıyorum.

Bu durumda, nesne yöneticisini doğrudan kullanabilseniz bile önerilmez. Bu blok için tercihleri ​​tanımlamak üzere özel bir modül kullanmalısınız .

İçinde app/code/Vendor/Module/etc/frontend/di.xmlaşağıdaki kodu gerekir:

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

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

Normali unutma 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>

Yanı sıra app/code/Vendor/Module/registration.php

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

İşiniz bittiğinde ve aşağıdaki komutları çalıştırdınız:

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

Şablonunuzda aşağıdakileri arayabilirsiniz:

$block->getGrandTotal();

Daha fazla yöntem ekleme

Block sınıfına izlerken faydalı olabilecek aşağıdakileri ekleyebilirsiniz:

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

Ardından, şablonunuzdan aşağıdakileri arayabilirsiniz:

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

Merhaba Raphel, cevabınızdan sadece referans aldım.
Rakesh Jesadiya

2
@Rakesh Cevabımı referans alarak sizinle sorunum yok, öğrenmek ve öğretmek için buradayız, indirilmiş cevabı basitçe kopyalamak / yapıştırmak adil değil çünkü aşağı indirildiniz. Orijinal poster orijinal cevabınızı kabul etti, yani cevabınız doğru ve onun için çalıştı. Ancak, cevabımda söylediğim ve David Manners'ın söylediği gibi, tavsiye edilmez ve mümkün olduğunda kaçınılmalıdır.
Raphael, Dijital Piyanizm'de

@ Rakesh iyi Ben upvotes ve downvotes sorumlu değilim. Ve başkalarının cevaplarını kopyalamak / yapıştırmak, oylanmanıza yardımcı olmaz. Yine cevabınız her kullanıcı için doğrudur, her yerde çalışır, ancak ObjectManager'ı doğrudan kullanmanız önerilmez. Öğrenmek için buradayız ve eminim ki ObjectManager'ı doğrudan gelecekteki cevaplarınızda kullanmaktan kaçınmaya çalışacaksınız.
Raphael at Digital Pianism

1
Merhaba Raphael, örneğiniz işe yaramazsa ve app / code / Vendor / Module / Block / Checkout / Success.php hiç oluşturulmamışsa (die () veya yasadışı php sözdizimi eklesem bile), bunun anlamı başka bir yere yazılıyor mu? Derlemeyi çalıştırıyorum ..
Claudiu Creanga

@ClaudiuCreanga olabilir. En son Magento 2.0'da olduğunu test ettiğimde son 2.1 sürümünde kodu denemedim. echo get_class($block);Geçersiz kılmanın işe yarayıp yaramadığını kontrol etmek için kullanabilirsiniz , ancak blok hiç işlenmiyorsa, muhtemelen işe yaramayacaktır
Digital Pianism'de Raphael

4

Sadece aç Magento_Checkout/frontend/templates/success.phtml

Ve aşağıdaki kodu Dosyaya koy

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

Yukarıdaki kodda tüm sipariş verilerini başarı sayfasında alacaksınız.

Teşekkürler


1
Resmi belgelere atıfta bulunarak: "Magento, bir sınıfın gerçek bağımlılıklarını gizlediğinden kodunuzda ObjectManager'ın doğrudan kullanımını yasaklar. Kullanım kurallarına bakın." devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin

2

Bildiğim kadarıyla, checkout_onepage_controller_success_actionCheckout bir sayfa başarıyla tamamlandıktan sonra tetiklenen bir etkinlik var .

satıcı / Magento / modül çıkış / Kontrol / 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;
}

Gördüğümüz gibi, sipariş kimliğini Observer kullanarak alabiliriz. Örneğin:

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

Daha fazla ayrıntı için google modüllerine göz atın:
vendor / magento / module-google-adwords
vendor / magento / module-google-analytics


Bir gözlemci kullanma fikrini seviyorum, ancak bunu yapma şekliniz işe yaramaz çünkü zaten bloktaki sipariş kimliğini almak için bir yöntem var (cevabıma bakın).
Raphael, Dijital Piyanizm'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.