checkout/onepage/success
Sayfayı yeniden yüklersem , sepete yönlendirilirim.
Bu nedenle, sipariş başarı sayfasını hata ayıklarken veya tasarım yaparken her zaman yeni bir sipariş vermem gerekir.
Bunu daha verimli nasıl yapabilirim?
checkout/onepage/success
Sayfayı yeniden yüklersem , sepete yönlendirilirim.
Bu nedenle, sipariş başarı sayfasını hata ayıklarken veya tasarım yaparken her zaman yeni bir sipariş vermem gerekir.
Bunu daha verimli nasıl yapabilirim?
Yanıtlar:
Geliştirme aşamasında çekirdeği geçici olarak kesebilirsiniz :
In /app/code/core/Mage/Checkout/controllers/OnepageController.php
düzenlemek successAction()
.
Çizgiyi yorumlayın $session->clear();
. Şimdi bir sipariş verebilir ve sayfayı istediğiniz sıklıkta yenileyebilirsiniz.
Her tarayıcıda bir sipariş vermek istemiyorsanız, örneğin çapraz tarayıcı testi yaparken bile, oturumu her seferinde başlatabilirsiniz.
Tablodan bir sipariş numarası ve bir teklif numarası seçin sales_flat_order
(alanlar: entity_id
ve quote_id
). Örneğin:
SELECT entity_id as order_id, quote_id
FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;
Ardından, fonksiyonun başlangıcını aşağıdaki gibi değiştirin:
$session = $this->getOnepage()->getCheckout();
$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);
ve INSERT_....
kimlikleriyle değiştirin .
Şimdi her zaman arayabilirsin checkout/onepage/success
Bu işteyken, failureAction()
aynı zamanda test etmek isteyebilirsiniz .
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Değiştirilen eylem böyle gözükürdü
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();
}
Şimdi her zaman arayabilirsin checkout/onepage/failure
\vendor\magento\module-checkout\Controller\Onepage\Success.php
İçindeki SuccessAction () öğesini değiştirmeniz gerekir.
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Değiştirilmiş işlem böyle ister
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
, bir bildirime sızacak ve şablonda yan etkilere neden olabilecek şekilde tanımlanmamıştır.
Umarım kendimi teşvik etmiyorum, ancak Magento'ya hızlı bir şekilde yüklenebilecek ücretsiz bir uzantı oluşturdum ve herhangi bir sipariş için sipariş başarı sayfasını önizlemenizi sağlar - yalnızca bir URL'ye erişerek: http: // www. yireo.com/software/magento-extensions/checkout-tester
Ben sadece $ session-> clear (); ve benim için çalıştı, ancak tüm eylemi yorumlayarak bana sözdizimi hataları verdi ürünleri ekleyin.
Magento 2 için:
Sipariş sonrasında başarı sayfasını stillendirmek veya özelleştirmek istiyorsanız, başarı sayfası sepet sayfasına yönlendirilir.
Şimdi çözüm burada:
Dosyayı vendor/magento/module-checkout/Controller/Onepage
açmak için gidin Success.php
.
Bu dosyada, aşağıdaki kodu görüyorsunuz
if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
Sadece bu kod hakkında yorum yapın ve sorununuz çözüldü. Bu yorumdan sonra sepete yönlendirilmezsiniz.
Yerel / geliştirme kopyasından e-posta göndermek yerine, e-postanın içeriğini bir dosyaya aktarabilir ve daha sonra yerel olarak görebilirsiniz; bence hangisi gerçekten kullanışlı olacaktır. İşte bu nasıl başarılabilir. Öncelikle tüm e-postalar gönderilir.
Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())
Bunu bulun ve aşağıdaki satırları ekleyin.
$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());
Bundan sonra herhangi bir sipariş oluşturduktan sonra Magento döküman kökünde bir email.html oluşturulacak ve çıktıyı görmek için tarayıcıda açabilirsiniz.
Daha sonra, herhangi bir sipariş e-postasını göndermek / yeniden göndermek için, yönetici olarak giriş yapabilirsiniz ve her sipariş için bu betiği tetikleyen E-posta Gönder düğmesi vardır ve aynı dosyada yazılmış yeni değiştirilmiş şablonu görebilirsiniz. Bence bu, sipariş veya diğer e-postaları görmenin en iyi yollarından biri.
Lütfen tamamladığınızda eklenen kodu kaldırmayı unutmayın.
Kodu güncellemelisin:
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Güncelleme fonksiyonu:
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();
}
Sadece yorum yap:
//$session->clear();
Başka bir cevabın not ettiği gibi, yönlendirmeyi Magento\Checkout\Controller\Onepage\Success::execute
yorumlayabilir ve ödeme başarı sayfasını yüklemeye zorlayabilirsiniz. Ancak, blok olduğunda, Magento\Checkout\Block\Onepage\Success
hiçbir sipariş verisi olmayacak çünkü Magento\Checkout\Model\Session::getLastRealOrder
sipariş vermeyecek. Daha iyi bir seçenek, denetçi sınıfının yürütme yönteminde, lastRealOrderId
ödeme oturumu için bir değer ayarlayabileceğiniz bir durdurucu olabilir .
Bu yaklaşım aynı zamanda checkout_onepage_controller_success_action
etkinliği istediğin siparişle gönderme fırsatı da veriyor . Etkinlik gözlemcileri Magento\GoogleAdwords\Observer\SetConversionValueObserver
ve Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
test verilerinizi tetikleyecektir .
Aşağıdaki, yukarıda açıklanan önleyiciyi oluşturan oldukça temel bir modüldür order
ve istenen sayfa numarası ile bir sorgu parametresi ekleyerek başarı sayfasının url'sine eklenerek sıranın ayarlanmasına izin verir . Şu anda multishipping başarı rotasını işe yaramaz. Github'dan indirilebilir: https://github.com/pmclain/magento2-successtest
Uygulamanın / kod / Pmclain / SuccessTest / etc / kullanıcı arayüzü / 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>
Uygulamanın / kod / Pmclain / SuccessTest / Eklenti / 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 Aşağıda, önleyiciyi etkinleştirmek / devre dışı bırakmak için yönetici paneli seçenekleri eklenmektedir.
<?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>
Uygulamanın / kod / 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>
Uygulamanın / kod / 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>
Uygulamanın / kod / Pmclain / SuccessTest / resgistration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Pmclain_SuccessTest',
__DIR__
);