无法在我的 Magento 客户控制器中加载订单
Unable to load an order inside my customer controller in Magento
我正致力于在 Magento 中创建一个新的支付集成,我需要在我的控制器中加载当前订单,这样我就无法获得名字、姓氏、电子邮件等详细信息,所以我可以制作 post 到支付网关的 API.
作为我的问题的一个例子,我有一个行动:
public function testAction() {
echo "<h1>" . Mage::getSingleton('checkout/session')->getLastRealOrderId() . "</h1>";
$_order = Mage::getModel('sales/order')->loadByIncrementId(Mage::getSingleton('checkout/session')->getLastRealOrderId());
foreach ($_order->_data as $key => $value) { echo "$key: $value<br />";}
}
检查我的 magento 系统在 foreach 上记录它的错误:
Notice: Trying to get property of non-object
如果我创建一个动作:
注意:正在尝试获取非对象属性
public function testAction() {
$this->loadLayout();
$block = $this->getLayout()->createBlock('Mage_Core_Block_Template',test, array('template' => 'test/test.phtml'));
$this->getLayout()->getBlock('content')->append($block);
$this->renderLayout();
}
然后创建 test.phtml 视图,其中的代码与控制器最初的代码相同:
echo "<h1>" . Mage::getSingleton('checkout/session')->getLastRealOrderId() . "</h1>";
$_order = Mage::getModel('sales/order')->loadByIncrementId(Mage::getSingleton('checkout/session')->getLastRealOrderId());
foreach ($_order->_data as $key => $value) { echo "$key: $value<br />";}
然后页面带回我的订单对象的属性,我可以从中获取我需要的信息。
我是 Magento 的新手,所以我确定我遗漏了一些非常明显的东西,但我将不胜感激任何有助于实现能够在控制器中加载订单对象的帮助。
作为附加信息,以防这对我的控制器扩展的问题有任何影响 Mage_Core_Controller_Front_Action。
更新
Mage::getSingleton('checkout/session')->getLastRealOrderId() 确实带回了正确的订单 ID。因为它在标签内回显。问题似乎是没有加载订单对象,只是创建了一个新实例。
如果客户从未完成订单,方法 getLastRealOrderId return 为空。
我认为您最好使用以下方式加载客户的订单:
$customer = Mage::getSingleton('customer/session')->getCustomer();
$customer_email = $customer->getEmail();
$_order = Mage::getModel('sales/order')->load($customer_email, 'customer_email');
看来我加载数据后需要使用getData()函数来打乱数据的顺序:
echo "<h1>" . Mage::getSingleton('checkout/session')->getLastRealOrderId() . "</h1>";
$_order = Mage::getModel('sales/order')->loadByIncrementId(Mage::getSingleton('checkout/session')->getLastRealOrderId());
$data = $order->getData();
foreach ($data as $key => $value) { echo "$key: $value<br />";}
我正致力于在 Magento 中创建一个新的支付集成,我需要在我的控制器中加载当前订单,这样我就无法获得名字、姓氏、电子邮件等详细信息,所以我可以制作 post 到支付网关的 API.
作为我的问题的一个例子,我有一个行动:
public function testAction() {
echo "<h1>" . Mage::getSingleton('checkout/session')->getLastRealOrderId() . "</h1>";
$_order = Mage::getModel('sales/order')->loadByIncrementId(Mage::getSingleton('checkout/session')->getLastRealOrderId());
foreach ($_order->_data as $key => $value) { echo "$key: $value<br />";}
}
检查我的 magento 系统在 foreach 上记录它的错误:
Notice: Trying to get property of non-object
如果我创建一个动作:
注意:正在尝试获取非对象属性
public function testAction() {
$this->loadLayout();
$block = $this->getLayout()->createBlock('Mage_Core_Block_Template',test, array('template' => 'test/test.phtml'));
$this->getLayout()->getBlock('content')->append($block);
$this->renderLayout();
}
然后创建 test.phtml 视图,其中的代码与控制器最初的代码相同:
echo "<h1>" . Mage::getSingleton('checkout/session')->getLastRealOrderId() . "</h1>";
$_order = Mage::getModel('sales/order')->loadByIncrementId(Mage::getSingleton('checkout/session')->getLastRealOrderId());
foreach ($_order->_data as $key => $value) { echo "$key: $value<br />";}
然后页面带回我的订单对象的属性,我可以从中获取我需要的信息。
我是 Magento 的新手,所以我确定我遗漏了一些非常明显的东西,但我将不胜感激任何有助于实现能够在控制器中加载订单对象的帮助。
作为附加信息,以防这对我的控制器扩展的问题有任何影响 Mage_Core_Controller_Front_Action。
更新
Mage::getSingleton('checkout/session')->getLastRealOrderId() 确实带回了正确的订单 ID。因为它在标签内回显。问题似乎是没有加载订单对象,只是创建了一个新实例。
如果客户从未完成订单,方法 getLastRealOrderId return 为空。
我认为您最好使用以下方式加载客户的订单:
$customer = Mage::getSingleton('customer/session')->getCustomer();
$customer_email = $customer->getEmail();
$_order = Mage::getModel('sales/order')->load($customer_email, 'customer_email');
看来我加载数据后需要使用getData()函数来打乱数据的顺序:
echo "<h1>" . Mage::getSingleton('checkout/session')->getLastRealOrderId() . "</h1>";
$_order = Mage::getModel('sales/order')->loadByIncrementId(Mage::getSingleton('checkout/session')->getLastRealOrderId());
$data = $order->getData();
foreach ($data as $key => $value) { echo "$key: $value<br />";}