주문 성공 페이지를 테스트하거나 스타일을 지정하는 방법은 무엇입니까?


114

checkout/onepage/success페이지를 새로 고침 하면 장바구니로 이동합니다.

따라서 주문 성공 페이지를 디버깅하거나 스타일을 지정할 때 항상 새로운 주문을해야합니다.

어떻게하면 더 효율적으로 할 수 있습니까?


2
이 질문은 모두 "승리"로 가득 찬 다양한 답변을 만들었습니다. 여기를 방문하는 사람은 모든 답변을 숙독해야합니다.
Chris K

답변:


149

개발하는 동안 일시적으로 코어를 해킹 할 수 있습니다 .

에서 /app/code/core/Mage/Checkout/controllers/OnepageController.php편집 successAction().

라인을 주석 처리하십시오 $session->clear();. 이제 하나의 주문을하고 원하는만큼 페이지를 새로 고칠 수 있습니다.

크로스 브라우저 테스트를 수행 할 때와 같이 각 브라우저에서 주문을하지 않으려는 경우 매번 세션을 초기화 할 수도 있습니다.

테이블에서 주문 ID와 견적 ID를 선택하십시오 sales_flat_order(필드 : entity_idquote_id). 예를 들어 :

SELECT entity_id as order_id, quote_id 
  FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;

그런 다음 기능의 시작을 다음과 같이 변경하십시오.

$session = $this->getOnepage()->getCheckout();

$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);

및 대체 INSERT_....ID입니다 함께.

이제 언제든지 전화 할 수 있습니다 checkout/onepage/success

당신이 그것을하는 동안, 당신은 failureAction()뿐만 아니라 테스트 할 수 있습니다

/app/code/core/Mage/Checkout/controllers/OnepageController.php

수정 된 조치는 다음과 같습니다.

public function failureAction()
    {
        $session = $this->getOnepage()->getCheckout();

        $session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
        $session->setLastQuoteId(INSERT_QUOTE_ID);
        $session->setLastOrderId(INSERT_ORDER_ID);

        $lastQuoteId = $this->getOnepage()->getCheckout()->getLastQuoteId();
        $lastOrderId = $this->getOnepage()->getCheckout()->getLastOrderId();

        if (!$lastQuoteId || !$lastOrderId) {
            $this->_redirect('checkout/cart');
            return;
        }

        $this->loadLayout();
        $this->renderLayout();
    }

이제 언제든지 전화 할 수 있습니다 checkout/onepage/failure


이 문제를 해결 하시겠습니까? 솔루션으로 표시하십시오.
Fabian Blechschmidt

3
Jisse Reitsma의 Yireo Checkout Tester와이 방법을 모두 테스트했습니다. 이 모듈이 가장 쉬운 방법이지만 테마 및 결제 모듈과 100 % 호환되지 않아 원래 succes 페이지와 스타일이 다릅니다. 그러나이 방법은 코어를 수정해야하지만 매력처럼 작동했습니다. 참고 : 답변에 편집해야 할 파일이 없습니다. /app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet

M2에서 동일한 작업을 수행하려는 사람들의 경우\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite

24

다음에서 successAction ()을 수정해야합니다.

/app/code/core/Mage/Checkout/controllers/OnepageController.php

수정 된 조치는 다음과 같습니다.

public function successAction()
    {
        /*
        $session = $this->getOnepage()->getCheckout();
        if (!$session->getLastSuccessQuoteId()) {
            $this->_redirect('checkout/cart');
            return;
        }

        $lastQuoteId = $session->getLastQuoteId();
        $lastOrderId = $session->getLastOrderId();
        $lastRecurringProfiles = $session->getLastRecurringProfileIds();
        if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) {
            $this->_redirect('checkout/cart');
            return;
        }

        $session->clear();
        */
        $this->loadLayout();
        $this->_initLayoutMessages('checkout/session');
        Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId)));
        $this->renderLayout();
    }

3
그러나 $lastOrderId통지로 이어지고 템플릿에 부작용을 일으킬 수있는 정의되지 않았습니다.
Alex

1
$ session-> clear ()를 주석 처리하여 성공했습니다. 내가 잃어버린 유일한 것은 관찰자를 통해 추가 된 TBT / 보상 통지 / 메시지와 같이 추가 된 통지 / 메시지입니다. .gitignored 인 재정의 모듈에 코드를 남겨두면 절대 배포되지 않습니다.
Barry Carlyon


4

나는 단지 $ session-> clear (); 나를 위해 일했지만 제품 전체를 주석 처리하면 구문 오류가 발생했습니다.


4

마 젠토 2의 경우 :

주문 성공 후 성공 페이지에서 스타일을 지정하거나 사용자 정의하려면 페이지가 카트 페이지로 리디렉션됩니다.

이제 해결책은 여기 있습니다.

파일 을 vendor/magento/module-checkout/Controller/Onepage 열려면 이동하십시오 Success.php.

이 파일에는 아래 코드가 있습니다.

 if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
     return $this->resultRedirectFactory->create()->setPath('checkout/cart');
 }

이 코드에 주석을 달면 문제가 해결됩니다. 주석 후에는 장바구니 페이지로 리디렉션되지 않습니다.


3

로컬 / 개발 복사본에서 전자 메일을 보내지 않고 전자 메일의 내용을 파일로 덤프 한 다음 로컬에서 볼 수 있습니다. 제 생각에는 정말 유용 할 것입니다. 이것이 달성 될 수있는 방법은 다음과 같습니다. 먼저 모든 이메일을 보낸 사람

Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())

그것을 찾아 다음 줄을 추가하십시오.

    $this->setUseAbsoluteLinks(true);
    $text = $this->getProcessedTemplate($variables, true);

    if($this->isPlain()) {
        $mail->setBodyText($text);
    } else {
        $mail->setBodyHTML($text);
    }
    // Added Code //
    $filePath = Mage::getBaseDir() .  DS . 'email.html';
    Mage::log($filePath);
    file_put_contents($filePath, $text);
    // Added Code Ends //

    $mail->setSubject('=?utf-8?B?' . base64_encode($this->getProcessedTemplateSubject($variables)) . '?=');
    $mail->setFrom($this->getSenderEmail(), $this->getSenderName());

주문을 생성 한 후 Magento 문서 루트에 email.html이 생성되고 브라우저에서 해당 파일을 열어 출력을 볼 수 있습니다.

다음으로 주문 이메일을 보내거나 다시 보내려면 관리자로 로그인하면 각 주문 마다이 스크립트를 트리거하는 이메일 보내기 버튼이 있으며 동일한 파일로 작성된 새로 변경된 템플릿을 볼 수 있습니다. 주문이나 다른 이메일을 보는 가장 좋은 방법 중 하나라고 생각합니다.

완료되면 추가 된 코드를 제거하십시오.


1

코드를 업데이트해야합니다.

/app/code/core/Mage/Checkout/controllers/OnepageController.php

업데이트 기능 :

public function successAction()
{
    $session = $this->getOnepage()->getCheckout();
    if (!$session->getLastSuccessQuoteId()) {
        $this->_redirect('checkout/cart');
        return;
    }

    $lastQuoteId = $session->getLastQuoteId();
    $lastOrderId = $session->getLastOrderId();
    $lastRecurringProfiles = $session->getLastRecurringProfileIds();
    if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) {
        $this->_redirect('checkout/cart');
        return;
    }

    //$session->clear();

    $this->loadLayout();
    $this->_initLayoutMessages('checkout/session');
    Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId)));
    $this->renderLayout();
}

그냥 의견 :

//$session->clear();

1

마 젠토 2

다른 답변에서 알 수 있듯이 리디렉션을 주석 처리 Magento\Checkout\Controller\Onepage\Success::execute하고 결제 성공 페이지를 강제로로드 할 수 있습니다. 그러나 블록이 Magento\Checkout\Block\Onepage\Success로드 Magento\Checkout\Model\Session::getLastRealOrder되면 주문을 반환하지 않기 때문에 주문 데이터가 표시되지 않습니다. 더 나은 옵션은 컨트롤러 클래스의 execute 메소드에서 after interceptor입니다. 여기서 lastRealOrderIdcheckout 세션에서 값을 설정할 수 있습니다 .

이 방법은 또한 checkout_onepage_controller_success_action원하는 순서로 이벤트 를 전달할 수있는 기회를 제공합니다 . 이 이벤트는 관찰자 Magento\GoogleAdwords\Observer\SetConversionValueObserverMagento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver테스트 데이터를 트리거합니다 .

다음은 위에서 설명한 인터셉터를 작성하는 상당히 기본적인 모듈이며 order원하는 증분 ID가 있는 조회 매개 변수를 성공 페이지 url 에 추가하여 순서를 설정할 수 있습니다 . 현재 다중 배송 성공 경로가 작동하지 않습니다. github에서 다운로드 할 수 있습니다 : https://github.com/pmclain/magento2-successtest

app / code / Pmclain / SuccessTest / 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">
  <type name="Magento\Checkout\Controller\Onepage\Success">
    <plugin name="pmclain_successtest_checkout_controller_onepage_success"
            type="Pmclain\SuccessTest\Plugin\Success"
            sortOrder="10" />
  </type>
</config>

app / code / Pmclain / SuccessTest / Plugin / Success.php

<?php
namespace Pmclain\SuccessTest\Plugin;

use Magento\Framework\Event\ManagerInterface;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Store\Model\ScopeInterface;
use Magento\Checkout\Model\Session;
use Magento\Sales\Model\OrderFactory;
use Magento\Sales\Model\Order;

class Success
{
  /** @var ManagerInterface */
  protected $_eventManager;

  /** @var PageFactory */
  protected $_resultPageFactory;

  /** @var ScopeConfigInterface */
  protected $_scopeConfig;

  /** @var OrderFactory */
  protected $_orderFactory;

  /** @var Order */
  protected $_order;

  /** @var Session */
  protected $_checkoutSession;

  /**
   * Success constructor.
   * @param ManagerInterface $eventManager
   * @param PageFactory $resultPageFactory
   * @param ScopeConfigInterface $scopeConfig
   * @param OrderFactory $orderFactory
   * @param Session $session
   */
  public function __construct(
    ManagerInterface $eventManager,
    PageFactory $resultPageFactory,
    ScopeConfigInterface $scopeConfig,
    OrderFactory $orderFactory,
    Session $session
  ) {
    $this->_eventManager = $eventManager;
    $this->_resultPageFactory = $resultPageFactory;
    $this->_scopeConfig = $scopeConfig;
    $this->_orderFactory = $orderFactory;
    $this->_checkoutSession = $session;
  }

  /**
   * @param \Magento\Checkout\Controller\Onepage\Success $subject
   * @param $result
   * @return \Magento\Framework\View\Result\Page
   */
  public function afterExecute(\Magento\Checkout\Controller\Onepage\Success $subject, $result)
  {
    if (!$this->_isEnabled()) {
      return $result;
    }

    $order = $this->_getTestOrder($subject->getRequest()->getParam('order'));

    if (!$order->getId()) {
      return $result;
    }

    $this->_checkoutSession->setLastRealOrderId($order->getIncrementId());

    $resultPage = $this->_resultPageFactory->create();

    $this->_eventManager->dispatch(
      'checkout_onepage_controller_success_action',
      ['order_ids' => [$order->getId()]]
    );

    return $resultPage;
  }

  /**
   * @return bool
   */
  protected function _isEnabled()
  {
    if ($this->_scopeConfig->getValue('dev/debug/success_test', ScopeInterface::SCOPE_STORE)) {
      return true;
    }

    return false;
  }

  /**
   * @param $incrementId string|bool
   * @return Order
   */
  protected function _getTestOrder($incrementId)
  {
    /** @var Order $order */
    $order = $this->_orderFactory->create();

    $order->loadByIncrementId($incrementId);

    return $order;
  }
}

app / code / Pmclain / SuccessTest / etc / adminhtml / system.xml 아래에는 인터셉터를 활성화 / 비활성화하는 관리자 패널 옵션이 추가되어 있습니다.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
  <system>
    <section id="dev">
      <group id="debug">
        <field id="success_test" translate="label" type="select" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="0">
          <label>Enable Checkout Success Page Testing</label>
          <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
        </field>
      </group>
    </section>
  </system>
</config>

app / code / Pmclain / SuccessTest / etc / config.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
  <default>
    <dev>
      <debug>
        <success_test>0</success_test>
      </debug>
    </dev>
  </default>
</config>

app / code / Pmclain / SuccessTest / 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="Pmclain_SuccessTest" setup_version="0.0.1">
    <sequence>
      <module name="Magento_Backend" />
      <module name="Magento_Checkout" />
    </sequence>
  </module>
</config>

app / code / Pmclain / SuccessTest / resgistration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
  \Magento\Framework\Component\ComponentRegistrar::MODULE,
  'Pmclain_SuccessTest',
  __DIR__
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.