Bagaimana cara menguji atau menata halaman keberhasilan pesanan?

114

Jika saya memuat ulang checkout/onepage/successhalaman, saya diarahkan ke troli.

Jadi, ketika debugging atau menata halaman keberhasilan pesanan, saya selalu harus membuat pesanan baru.

Bagaimana saya bisa melakukan ini dengan lebih efisien?

Alex
sumber
2
Pertanyaan ini menciptakan beragam jawaban yang semuanya penuh "menang". Siapa pun yang berkunjung ke sini harus membaca semua jawaban.
Chris K

Jawaban:

149

Anda dapat sementara hack inti saat Anda sedang mengembangkan:

Di /app/code/core/Mage/Checkout/controllers/OnepageController.phpedit successAction().

Berikan komentar $session->clear();. Sekarang Anda dapat membuat satu pesanan dan menyegarkan halaman sesering yang Anda suka.

Jika Anda bahkan tidak ingin melakukan pemesanan di setiap browser, misalnya saat melakukan pengujian lintas-browser, Anda juga dapat langsung menginisialisasi sesi setiap kali.

Pilih id pesanan dan id penawaran dari tabel sales_flat_order(bidang: entity_iddan quote_id). Misalnya via:

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

Kemudian ubah fungsi awal sebagai berikut:

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

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

dan ganti INSERT_....dengan ID.

Sekarang Anda selalu dapat menelepon checkout/onepage/success

Saat Anda melakukannya, Anda mungkin ingin menguji failureAction()juga, dalam

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

Tindakan yang dimodifikasi akan terlihat seperti ini

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

Sekarang Anda selalu dapat menelepon checkout/onepage/failure

Alex
sumber
Memperbaiki ini masalah Anda? Harap tandai sebagai solusi.
Fabian Blechschmidt
3
Saya sudah menguji Yireo Checkout Tester dari Jisse Reitsma dan metode ini. Meskipun modul ini adalah cara termudah, saya menemukan bahwa modul tersebut tidak 100% kompatibel dengan tema dan modul pembayaran kami, menghasilkan gaya yang berbeda dari halaman sukses sebelumnya. Meskipun perlu memodifikasi inti metode ini namun bekerja seperti pesona. Catatan: jawabannya tidak ada file yang perlu Anda edit, yaitu /app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet
Untuk orang-orang yang ingin melakukan hal yang sama dalam M2 Anda dapat mengomentari baris 19 hingga 22 di\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite
24

Anda perlu memodifikasi successAction () di

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

Tindakan yang dimodifikasi akan menyukai ini

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();
    }
blakcaps
sumber
3
Tetapi kemudian $lastOrderIdtidak didefinisikan yang akan bocor ke pemberitahuan dan dapat menyebabkan efek samping dalam template.
Alex
1
Saya telah sukses hanya dengan mengomentari $ session-> clear (); Satu-satunya hal yang saya kehilangan adalah pemberitahuan / pesan yang ditambahkan seperti TBT / Pemberitahuan Hadiah / Pesan yang ditambahkan melalui pengamat. Meninggalkan kode dalam modul override, yang .gitignored jadi tidak pernah digunakan.
Barry Carlyon
4

Saya pikir lebih baik komentar saja $ session-> clear (); dan menambahkan produk secara manual, yang bekerja untuk saya tetapi mengomentari seluruh tindakan memberi saya kesalahan sintaks.

Farzan Balkani
sumber
4

Untuk Magento 2:

Jika Anda ingin gaya atau menyesuaikan di halaman sukses setelah halaman kesuksesan pesanan dialihkan ke halaman keranjang.

Sekarang solusinya ada di sini:

Pergi Untuk vendor/magento/module-checkout/Controller/Onepage membuka Success.phpFile.

Dalam file ini, Anda melihat Kode Di Bawah Ini

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

Cukup komentari kode ini dan masalah Anda terpecahkan. Setelah berkomentar ini, Anda tidak mengarahkan ke halaman keranjang.

Nikul
sumber
3

Alih-alih mengirim email dari salinan lokal / pengembangan Anda dapat membuang konten email ke file dan kemudian hanya melihat secara lokal, yang menurut saya akan sangat berguna. Begini caranya. Pertama, semua email dikirim dari

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

Temukan itu, dan tambahkan baris berikut.

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

Setelah ini setelah Anda membuat pesanan apa pun, email.html akan dibuat di root dokumen Magento dan Anda dapat membukanya di browser untuk melihat hasilnya.

Selanjutnya, untuk mengirim / mengirim ulang email pesanan apa saja, Anda cukup masuk admin dan untuk setiap pesanan ada tombol Kirim Email yang akan memicu skrip ini dan Anda dapat melihat templat yang baru saja diubah ditulis dalam file yang sama. Saya pikir ini adalah salah satu cara terbaik untuk melihat pesanan atau email lainnya.

Harap dicatat untuk menghapus kode yang ditambahkan ketika Anda selesai.

Subesh Pokhrel
sumber
1

Anda harus memperbarui kode:

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

Perbarui fungsi:

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

Komentar saja:

//$session->clear();
Ravi Soni
sumber
1

Magento 2

Sebagai jawaban lain yang dicatat, Anda dapat mengomentari pengalihan Magento\Checkout\Controller\Onepage\Success::executedan memaksa halaman keberhasilan checkout dimuat. Tetapi ketika blok,, Magento\Checkout\Block\Onepage\Successmemuat tidak ada data pesanan akan hadir karena Magento\Checkout\Model\Session::getLastRealOrdertidak akan mengembalikan pesanan. Opsi yang lebih baik adalah pencegat setelah pada metode eksekusi kelas controller, di mana Anda dapat menetapkan nilai lastRealOrderIddalam sesi checkout.

Pendekatan ini juga memberikan kesempatan untuk mengirimkan checkout_onepage_controller_success_actionacara dengan pesanan yang Anda inginkan. Acara ini akan memicu pengamat Magento\GoogleAdwords\Observer\SetConversionValueObserverdan Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserverdengan data uji Anda.

Berikut ini adalah modul yang cukup mendasar untuk membuat interseptor yang dijelaskan di atas dan memungkinkan pengaturan pesanan dengan menambahkan orderparameter kueri dengan id kenaikan yang diinginkan ke url halaman sukses. Saat ini tidak akan berhasil dengan rute kesuksesan multishipping. Itu dapat diunduh di 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 Di bawah ini menambahkan opsi panel admin untuk mengaktifkan / menonaktifkan interseptor.

<?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__
);
Pclclain
sumber