你现在的位置:首页 > PHP网站建设知识库 > magento > 正文

magento购物车为空时显示不同的主题

当购物车的数量为空的时候,magentonotes.com/checkout/cart/index/ 页面默认显示的页面有点简单,我们可以通过编写简单的自定义模块,来实现判断购物车为空,显示不同的模板文件。

方法一:重写购物车的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缓存文件即可看到效果。