更新:我做了一些更多的研究后大大修改了这个答案。
为了记录在案,它看起来像getCanPrintOrder
是Magento的魔术方法获取对象的数据之一。您可以使用setCanPrintOrder
来设置它的值,如果您之前没有调用该值,getCanPrintOrder
将仅返回null
。您也可以拨打电话setData('can_print_order')
进行设置。
它看起来像是被设置在Onepage结账成功块,Mage_Checkout_Block_Onepage_Success
唯一的地方,在_prepareLastOrder
方法:
protected function _prepareLastOrder()
{
$orderId = Mage::getSingleton('checkout/session')->getLastOrderId();
if ($orderId) {
$order = Mage::getModel('sales/order')->load($orderId);
if ($order->getId()) {
$isVisible = !in_array($order->getState(),
Mage::getSingleton('sales/order_config')->getInvisibleOnFrontStates());
$this->addData(array(
'is_order_visible' => $isVisible,
'view_order_id' => $this->getUrl('sales/order/view/', array('order_id' => $orderId)),
'print_url' => $this->getUrl('sales/order/print', array('order_id'=> $orderId)),
'can_print_order' => $isVisible,
'can_view_order' => Mage::getSingleton('customer/session')->isLoggedIn() && $isVisible,
'order_id' => $order->getIncrementId(),
));
}
}
}
这是从_beforeToHtml
方法调用,它会被调用时页面被渲染。
拉弦远一点,我们看到,can_print_order
由$isVisible
变量决定的,而这本线设置:
$isVisible = !in_array($order->getState(),
Mage::getSingleton('sales/order_config')->getInvisibleOnFrontStates());
它检查如果订单状态是属于国家之一在前面可见。这些最终设置在核心Magento销售模块的3210文件中。
<config>
<global>
<sales>
<order>
<states>
<new translate="label">
<label>New</label>
<statuses>
<pending default="1"/>
</statuses>
<visible_on_front>1</visible_on_front>
</new>
...
</states>
</order>
</sales>
</global>
</config>
所有状态的默认visible_on_front,所以除非你已经改变了他们,或者说已经覆盖他们,这不应该是你的问题。我将通过在success.phtml中倾销getCanPrintOrder
的值来仔细检查此问题。
哈克解决办法将是压倒一切的模板文件并添加
$this->setCanPrintOrder(true);
$this->setCanViewOrder(true);
任何地方所if条件。或者完全删除检查。