Sipariş başarı sayfasını nasıl test edebilir veya stillendirebilirim?


114

checkout/onepage/successSayfayı 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?


2
Bu soru hepsi "kazan" dolu çeşitli cevaplar oluşturdu. Burayı ziyaret eden herkes tüm cevapları incelemelidir.
Chris K,

Yanıtlar:


149

Geliştirme aşamasında çekirdeği geçici olarak kesebilirsiniz :

In /app/code/core/Mage/Checkout/controllers/OnepageController.phpdü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_idve 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


Bu sorunu düzeltti mi? Lütfen çözümü olarak işaretleyin.
Fabian Blechschmidt

3
Hem Jisse Reitsma'nın Yireo Checkout Test Cihazını hem de bu yöntemi test ettim. Modülün en kolay yolu olmasına rağmen, tema ve ödeme modülümüzle% 100 uyumlu olmadığını ve orijinal başarı sayfasından farklı bir tasarımla sonuçlandığını gördüm. Çekirdeği değiştirmek gerekmekle birlikte, bu yöntem ancak bir cazibe gibi çalıştı. Not: Cevap, düzenlemek istediğiniz dosya eksik, /app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet

M2'de aynı şeyi yapmak isteyenler için, 19 - 22 arasındaki satırları yorumlayabilirsiniz\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite 13.03

24

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

3
Ancak daha sonra $lastOrderId, bir bildirime sızacak ve şablonda yan etkilere neden olabilecek şekilde tanımlanmamıştır.
Alex

1
Sadece $ session-> clear (); Kaybettiğim tek şey TBT / Ödül Bildirimleri / Gözlemci aracılığıyla eklenen Mesajlar gibi bildirimler / iletilerdir. Kodu bir geçersiz kılma modülünde bırakmak .gitignored, bu yüzden asla dağıtılmadı.
Barry Carlyon


4

Ben sadece $ session-> clear (); ve benim için çalıştı, ancak tüm eylemi yorumlayarak bana sözdizimi hataları verdi ürünleri ekleyin.


4

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.


3

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.


1

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

1

Magento 2

Başka bir cevabın not ettiği gibi, yönlendirmeyi Magento\Checkout\Controller\Onepage\Success::executeyorumlayabilir ve ödeme başarı sayfasını yüklemeye zorlayabilirsiniz. Ancak, blok olduğunda, Magento\Checkout\Block\Onepage\Successhiçbir sipariş verisi olmayacak çünkü Magento\Checkout\Model\Session::getLastRealOrdersipariş 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_actionetkinliği istediğin siparişle gönderme fırsatı da veriyor . Etkinlik gözlemcileri Magento\GoogleAdwords\Observer\SetConversionValueObserverve Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObservertest verilerinizi tetikleyecektir .

Aşağıdaki, yukarıda açıklanan önleyiciyi oluşturan oldukça temel bir modüldür orderve 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__
);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.