Im working on module that bypasses checkout if user is logged in and grand total is 0,00€.
Everything is working fine except for one thing. On success page I don't see the order number.
It seems that in success.phtml $this->getOrderId() dosn't return anything.
I'm sure that I'm doing something wrong in my Observer.php:
class Myproject_Bypasscheckout_Model_Observer extends Varien_Object
{
public function beforeCheckout(Varien_Event_Observer $observer)
{
// Get cart grand total
$onepage = Mage::getSingleton('checkout/type_onepage');
$quote = $onepage->getQuote();
$quoteData = $quote->getData();
// Bypass only if grand total is 0€ and user is logged in
if ($quoteData['grand_total'] == 0 && Mage::getSingleton('customer/session')->isLoggedIn()) {
$onepage->initCheckout();
// Assign Customer To Sales Order Quote
$customer = Mage::getSingleton('customer/session')->getCustomer();
$quote->assignCustomer($customer);
// Configure Notification
$quote->setSendCconfirmation(true);
// Set Sales Order Shipping Address
$billingAddressData = Mage::getModel('customer/address')->load($customer->default_billing)->toArray();
$billingAddress = $quote->getBillingAddress()->addData($billingAddressData);
$shippingAddressData = Mage::getModel('customer/address')->load($customer->default_shipping)->toArray();
$shippingAddress = $quote->getShippingAddress()->addData($shippingAddressData);
// Collect Rates and Set Shipping & Payment Method
$shippingAddress->setCollectShippingRates(true)
->collectShippingRates()
->setShippingMethod('freeshipping_freeshipping')
->setPaymentMethod('checkmo');
// Set Sales Order Payment
$quote->getPayment()->importData(array('method' => 'checkmo'));
// Collect Totals & Save Quote
$quote->collectTotals()->save();
// Create Order From Quote
$service = Mage::getModel('sales/service_quote', $quote);
$service->submitAll();
$incrementId = $service->getOrder()->getIncrementId();
$checkout = $onepage->getCheckout();
$checkout->setLastQuoteId($quote->getId());
$checkout->setLastSuccessQuoteId($quote->getId());
$checkout->setLastOrderId($incrementId);
$checkout->setLastRealOrderId($incrementId);
Mage::app()->getResponse()->setRedirect(Mage::getBaseUrl() . 'checkout/onepage/success')->sendResponse();
}
}
}
Solved! Go to Solution.
I'll add the try catch.
EDIT:
The event is controller_action_predispatch_checkout_onepage_index.
IncrementId does have value in it.
EDIT:
Just figured out what was wrong. Here is how it should be.
$orderId = $service->getOrder()->getId(); // Added this line $incrementId = $service->getOrder()->getIncrementId(); $checkout = $onepage->getCheckout(); $checkout->setLastQuoteId($quote->getId()); $checkout->setLastSuccessQuoteId($quote->getId()); $checkout->setLastOrderId($orderId); // Not incrementId!! $checkout->setLastRealOrderId($incrementId);
I don't see anything wrong so far, except you should wrap the order creating section with try .. catch ..., which is not related to your problem.
Did you check if $incrementId has value in the observer? which event this observer listen to?
I'll add the try catch.
EDIT:
The event is controller_action_predispatch_checkout_onepage_index.
IncrementId does have value in it.
EDIT:
Just figured out what was wrong. Here is how it should be.
$orderId = $service->getOrder()->getId(); // Added this line $incrementId = $service->getOrder()->getIncrementId(); $checkout = $onepage->getCheckout(); $checkout->setLastQuoteId($quote->getId()); $checkout->setLastSuccessQuoteId($quote->getId()); $checkout->setLastOrderId($orderId); // Not incrementId!! $checkout->setLastRealOrderId($incrementId);