当购物车的数量为空的时候,magentonotes.com/checkout/cart/index/ 页面默认显示的页面有点简单,我们可以通过编写简单的自定义模块,
来实现判断购物车为空,显示不同的模板文件。
首先,我们需要知道如何创建个自定义模块,基本的Magento自定义模型可以参考 Magento 官方文档 和 Magento开发教程 ,
英文不好的,也可以看看国人的翻译版本,这里不做过多的介绍,这个只介绍几个触发Magento切换模板页面的方法
方法一:重写购物车的Index执行控制器(action controller) 和 更新布局(Layout)文件
在调用renderLayout方法之前,添加如下代码到自定义控制类,自定义控制类的添加方法可以参考如何重写Magento代码或者参考Magento Wiki
require_once 'Mage/Checkout/controllers/CartController.php'; class Mynamespace_Myextension_Checkout_CartController extends Mage_Checkout_CartController { public function indexAction() { ... $helper = Mage::helper('checkout/cart'); if (!$helper->getItemsCount()) { $this->loadLayout() ->getLayout() ->getBlock('root') ->setTemplate('page/2columns-left.phtml'); } $this->renderLayout(); .... } .... }
但是当重写Magento类时候,如何还有其他模块也重写了相同的block、model、controller等资源,它也许不会工作,所以我推荐用的Magento事件方法。
方法二:用Magento事件(Event)更新布局(Layout)
通过controller_action_layout_render_before_checkout_cart_index事件,为checkout/cart/index 执行控制器更新布局文件,添加如下代码到自定义模块的config.xml
<?xml version="1.0"?> <config> ... <global> ... <models> <myextension> <class>Mynamespace_Myextension_Model</class> </myextension> </models> ... </global> ... <frontend> ... <events> <controller_action_layout_render_before_checkout_cart_index> <observers> <myextension_observer> <class>myextension/observer</class> <method>setRootTemplate</method> </myextension_observer> </observers> </controller_action_layout_render_before_checkout_cart_index> </events> ... </frontend> ... </config>
继续更新observer class类
class Mynamespace_Myextension_Model_Observer { public function setRootTemplate() { $cartHelper = Mage::helper('checkout/cart'); $layout = Mage::getSingleton('core/layout'); if (!$cartHelper->getItemsCount()) { $layout->getBlock('root')->setTemplate('page/2columns-left.phtml'); } } }
其中
$layout->getBlock('root')->setTemplate('page/2columns-left.phtml');
是用来更换模板
推荐用这个方法来更新模板
方法三:通过Magento事件(Event)添加自定义布局操作(Layout Handle)
这个方法是其实是通过使用controller_action_layout_load_before事件,去更新模板文件
将以下xml代码添加到config.xml
... <frontend> ... <events> ... <controller_action_layout_load_before> <observers> <customcheckout_observer> <class>customcheckout/observer</class> <method>setCustomLayoutHandle</method> </customcheckout_observer> </observers> </controller_action_layout_load_before> ... </events> ... </frontend> ...
同时更新observer model
public function setCustomLayoutHandle($observer) { $cartHelper = Mage::helper('checkout/cart'); $layout = $observer->getEvent()->getLayout(); $update = $layout->getUpdate(); if (!$cartHelper->getItemsCount() && in_array('checkout_cart_index', $update->getHandles())) { $layout->getUpdate() ->removeHandle('checkout_cart_index') ->addHandle('checkout_cart_index_empty'); } }
最后再添加如下代码到主题的checkout.xml中
... <checkout_cart_index_empty translate="label"> ... customize the content of checkout_cart_index handle ... </checkout_cart_index_empty> ...
加入以上代码之后,只要更清除Magento缓存文件即可看到效果。
Comments on this entry are closed.