답변:
개발하는 동안 일시적으로 코어를 해킹 할 수 있습니다 .
에서 /app/code/core/Mage/Checkout/controllers/OnepageController.php
편집 successAction()
.
라인을 주석 처리하십시오 $session->clear();
. 이제 하나의 주문을하고 원하는만큼 페이지를 새로 고칠 수 있습니다.
크로스 브라우저 테스트를 수행 할 때와 같이 각 브라우저에서 주문을하지 않으려는 경우 매번 세션을 초기화 할 수도 있습니다.
테이블에서 주문 ID와 견적 ID를 선택하십시오 sales_flat_order
(필드 : entity_id
및 quote_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
\vendor\magento\module-checkout\Controller\Onepage\Success.php
다음에서 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();
}
$lastOrderId
통지로 이어지고 템플릿에 부작용을 일으킬 수있는 정의되지 않았습니다.
나는 스스로 홍보하지는 않지만 Magento에 빠르게 설치할 수있는 무료 확장 프로그램을 만들었으므로 URL에 액세스하여 주문에 대한 주문 성공 페이지를 미리 볼 수 있습니다 : http : // www. yireo.com/software/magento-extensions/checkout-tester
마 젠토 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');
}
이 코드에 주석을 달면 문제가 해결됩니다. 주석 후에는 장바구니 페이지로 리디렉션되지 않습니다.
로컬 / 개발 복사본에서 전자 메일을 보내지 않고 전자 메일의 내용을 파일로 덤프 한 다음 로컬에서 볼 수 있습니다. 제 생각에는 정말 유용 할 것입니다. 이것이 달성 될 수있는 방법은 다음과 같습니다. 먼저 모든 이메일을 보낸 사람
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이 생성되고 브라우저에서 해당 파일을 열어 출력을 볼 수 있습니다.
다음으로 주문 이메일을 보내거나 다시 보내려면 관리자로 로그인하면 각 주문 마다이 스크립트를 트리거하는 이메일 보내기 버튼이 있으며 동일한 파일로 작성된 새로 변경된 템플릿을 볼 수 있습니다. 주문이나 다른 이메일을 보는 가장 좋은 방법 중 하나라고 생각합니다.
완료되면 추가 된 코드를 제거하십시오.
코드를 업데이트해야합니다.
/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();
다른 답변에서 알 수 있듯이 리디렉션을 주석 처리 Magento\Checkout\Controller\Onepage\Success::execute
하고 결제 성공 페이지를 강제로로드 할 수 있습니다. 그러나 블록이 Magento\Checkout\Block\Onepage\Success
로드 Magento\Checkout\Model\Session::getLastRealOrder
되면 주문을 반환하지 않기 때문에 주문 데이터가 표시되지 않습니다. 더 나은 옵션은 컨트롤러 클래스의 execute 메소드에서 after interceptor입니다. 여기서 lastRealOrderId
checkout 세션에서 값을 설정할 수 있습니다 .
이 방법은 또한 checkout_onepage_controller_success_action
원하는 순서로 이벤트 를 전달할 수있는 기회를 제공합니다 . 이 이벤트는 관찰자 Magento\GoogleAdwords\Observer\SetConversionValueObserver
와 Magento\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__
);