无法通过布局更新更改checkout/cart.phtml

Ank*_* P. 1 checkout magento

我试图通过我的模块的布局文件即mymodule.xml中的布局更新来更改checkout/cart.phtml

<layout>
    <checkout_cart_index>
        <reference name="checkout.cart">
            <action method="setCartTemplate"><value>mymodule/checkout/cart.phtml</value></action>
        </reference>
    </checkout_cart_index>
</layout>
Run Code Online (Sandbox Code Playgroud)

但它不起作用.有线索吗?

dan*_*lan 5

Ankita,我要写的是获得你想要的东西的实际方法.虽然John Hickling的正式答案可行,但Magento并不打算如何修改主车模板.

Magento故意选择使用不同的方法设置购物车模板,即setCartTemplatesetEmptyTemplate.他们可以在Magento自己看到app/design/frontend/base/default/layout/checkout.xml.这样做是为了管理两个模板,每个模板都可以处理自己的条件.第一个条件是带有物品的购物车,而第二个条件是没有物品的购物车.通过使用常用setTemplate方法,这种区别将会丢失:带有物品的购物车和没有物品的购物车都会显示相同的模板.这不好.

你是如此亲密.你试图使用这个setCartTemplate方法是正确的.这就是你应该使用的.但是,您缺少一个允许Magento甚至考虑使用它的基本方法调用:您忘记包含chooseTemplate方法调用.注意Magento自己的checkout.xml文件:

<block type="checkout/cart" name="checkout.cart">
    <action method="setCartTemplate"><value>checkout/cart.phtml</value></action>
    <action method="setEmptyTemplate"><value>checkout/cart/noItems.phtml</value></action>
    <action method="chooseTemplate"/>
Run Code Online (Sandbox Code Playgroud)

看看最后一个方法调用,chooseTemplate.如果您查看,app/code/core/Mage/Checkout/Block/Cart.php您会看到以下方法,在这些方法中,熟悉的方法setCartTemplatesetEmptyTemplate方法被调用,但由于它们是魔术方法,因此在Magento的源代码中无法轻松搜索,这对很多人来说都是有问题的:

public function chooseTemplate()
{
    $itemsCount = $this->getItemsCount() ? $this->getItemsCount() : $this->getQuote()->getItemsCount();
    if ($itemsCount) {
        $this->setTemplate($this->getCartTemplate());
    } else {
        $this->setTemplate($this->getEmptyTemplate());
    }
}
Run Code Online (Sandbox Code Playgroud)

你错过了那个chooseTemplate方法调用.这是您自己的布局XML文件应如下所示:

<checkout_cart_index>
    <reference name="checkout.cart">
        <action method="setCartTemplate"><value>mymodule/checkout/cart.phtml</value></action>
        <action method="setEmptyTemplate"><value>mymodule/checkout/noItems.phtml</value></action>
        <action method="chooseTemplate"/>
    </reference>
</checkout_cart_index>
Run Code Online (Sandbox Code Playgroud)

如果仍在您的控制范围内,我建议您更新代码.这就是Magento打算更新购物车模板的方式.常见的setTemplate方法对此任务来说太具破坏性了.粒度是Magento的意图,所以更新应该保持这种粒度.我还建议您将此标记为正确答案.