마 젠토 2 성공 페이지에서 주문을 받으시겠습니까?


13

magento 2의 성공 페이지에서 주문 총계를 얻으려고합니다.이 코드를 추가했습니다.

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

그러나 주문한 후 성공 페이지에 도달하면 오류가 발생합니다. 코드는 magento 1에서는 작동하지만 2에서는 작동하지 않는 것 같습니다. magento 2에서도 작동하도록하려면 어떻게해야합니까?


안녕 @ alexcr 당신은 데이터를 얻기 위해 magento 1 명령을 사용합니다. 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

이 링크를 확인하십시오 codextblog.com/code-snippet/…
— Saravanan DS

답변:


25

마 젠토 2.1

아래 언급 된 블록은 이제 Magento\Checkout\Block\Onepage\Success

마 젠토 2.0

이 페이지에서 기본적으로 검색 할 수있는 유일한 것은에 getRealOrderId()정의 된 메소드를 사용하는 주문 ID 입니다.Magento\Checkout\Block\Success

따라서 주문 ID를 얻으려면 템플릿에서 다음을 호출하면됩니다.

$block->getRealOrderId();

그러나 나는 그것이 당신이 필요로하는 것이 아니라는 것을 이해합니다.

이 경우 객체 관리자를 직접 사용할 수 있지만 권장되지 않습니다. 이 블록의 우선 순위를 정의하려면 사용자 지정 모듈을 사용해야합니다 .

에서 app/code/Vendor/Module/etc/frontend/di.xml다음과 같은 코드가 필요합니다 :

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

그런 다음 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();
    }
}

평소 잊지 마세요 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>

뿐만 아니라 app/code/Vendor/Module/registration.php

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

완료되면 다음 명령을 실행했습니다.

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

템플릿에서 다음을 호출 할 수 있어야합니다.

$block->getGrandTotal();

더 많은 메소드 추가

블록 클래스를 추적 할 때 유용한 다음을 추가 할 수 있습니다.

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

그런 다음 템플릿에서 다음을 호출 할 수 있습니다.

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

안녕하세요 라펠, 나는 당신의 대답에서 단지 참고를 얻었습니다.
— Rakesh Jesadiya

2
@Rakesh 나는 당신이 내 대답을 참조하는 데 아무런 문제가 없습니다. 우리는 배우고 가르치기 위해 여기 있으며, 당신이 downvoted했기 때문에 단순히 upvoted 답변을 복사 / 붙여 넣는 것은 공평하지 않습니다. 원래 포스터는 귀하의 원래 답변을 받아들였으며, 이는 귀하의 답변이 정확하고 그를 위해 일했음을 의미합니다. 그러나 내 대답과 David Manners가 의견에서 말했듯이 권장되지 않으며 가능할 때마다 피해야합니다.
— 디지털 피아니즘의 라파엘

@Rakesh 잘 나는 upvotes와 downvotes에 대한 책임을지지 않습니다. 그리고 다른 사람의 답변을 복사 / 붙여 넣기해도 도움이되지 않습니다. 다시 한 번, 모든 사용자에게 답이 맞습니다. 모든 곳에서 작동하지만 ObjectManager를 직접 사용하지 않는 것이 좋습니다. 우리는 배우기 위해
— 왔으며

1
안녕 Raphael, 귀하의 예제가 작동하지 않고 app / code / Vendor / Module / Block / Checkout / Success.php가 전혀 렌더링되지 않으면 (die () 또는 잘못된 PHP 구문을 삽입하더라도) 다른 곳을 덮어 씁니까? 컴파일을 실행합니다.
— Claudiu Creanga

@ClaudiuCreanga 될 수 있습니다. 마지막으로 Magento 2.0 초기 버전에서 테스트 한 결과 최신 2.1 릴리스에서는이 코드를 시도하지 않았습니다. 당신이 사용할 수있는 echo get_class($block);재정이 작동하지만 블록이 전혀 렌더링되지 않은 경우 그 아마 거 작업이 아니라면 확인
— 라파엘을 디지털 Pianism에서

4

그냥 열어 Magento_Checkout/frontend/templates/success.phtml

그리고 아래 코드를 File에 넣으십시오.

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

위의 코드에서는 모든 주문 데이터를 성공 페이지로 가져옵니다.

감사


1
공식 문서 인용 : "Magento는 클래스의 실제 종속성을 숨기므로 코드에서 ObjectManager를 직접 사용하는 것을 금지합니다. 사용 규칙을 참조하십시오." devdocs.magento.com/guides/v2.1/extension-dev-guide/…
— c.norin

2

내가 아는 한, checkout_onepage_controller_success_actionCheckout 한 페이지가 성공적으로 완료 되면 이벤트 가 발생합니다.

공급 업체 / 마 젠토 / 모듈-체크 아웃 / 컨트롤러 / 한 페이지 /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;
}

보시다시피, Observer를 사용하여 주문 ID를 얻을 수 있습니다. 예를 들면 다음과 같습니다.

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

자세한 내용은 Google 모듈을 참조하십시오.
vendor / magento / module-google-adwords
vendor / magento / module-google-analytics


나는 옵저버를 사용하는 아이디어를 좋아하지만, 블록에서 주문 ID를 검색하는 방법이 이미 있기 때문에 당신이 그것을하는 방식은 쓸모가 없습니다 (내 답변 참조).
— 디지털 Pianism에서 라파엘
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.