마 젠토 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.