3

我在 local.xml 中添加了以下内容,以便在客户登录时添加额外的正文类:

<customer_logged_in>
<reference name="root">
  <action method="addBodyClass">
    <classname>logged-in</classname>
  </action>
</reference>
</customer_logged_in>

这可行,但是当我转到 onepage checkout 时,出现以下错误:

a:5:{i:0;s:98:"Invalid method Mage_Checkout_Block_Onepage_Progress::addBodyClass(Array
(
[0] => logged-in
)
)";i:1;s:1967:"#0 [internal function]: Varien_Object->__call('addBodyClass', Array)
#1 [internal function]: Mage_Checkout_Block_Onepage_Progress->addBodyClass('logged-in')
4

2 回答 2

5

您的布局更新假定所有“根”块都继承自Mage_Page_Block_Html具有该addBodyClass()方法的类。不幸的是,这种情况并非如此。我认为没有简单的解决方法。

您可以通过创建观察者并挂钩事件来完成您想要做的core_block_abstract_to_html_before事情。从那里您可以检查客户是否已登录,检索正在呈现的块,并addBodyClass()在检查它是否具有方法(或在 try 块内)后调用它。不过,这可能会非常昂贵,因为每次页面加载都会调用它很多次——每个块调用一次。

作为 hack,您可以覆盖Mage_Core_Block_Abstract该类并将addBodyClass()方法复制到它。这应该可行,但它被认为是不好的做法,因为它与任何其他尝试覆盖的模块冲突Mage_Core_Block_Abstract

于 2013-04-19T15:24:46.690 回答
5

Mage_Page_Block_HtmlCameron 本人对根块是继承的假设提出了一个很好的观点。我做了和你一样的假设,我的代码是一样的!我还发现这破坏了一些与结帐相关的逻辑(严格来说,它破坏了不用Mage_Page_Block_Html作根块的 AJAX 逻辑)。

但是,作为对卡梅隆自己答案的改进,实际上很容易通过观察者添加身体类而不用观察core_block_abstract_to_html_before。唯一的问题是您需要一个模块。因此,您要么需要为此目的制作一个,要么使用现有的有意义的。然后,最好是,我们想钩入一个在每次页面加载时触发一次的事件always

嗯,有这样的事件。benmarks为另一个问题提供了一个非常好的和简洁的答案,给了我们一些提示。从中可以看出,好的事件可能是controller_action_layout_generate_blocks_after.

因此,通过像往常一样观察事件:

<controller_action_layout_generate_blocks_after>
    <observers>
        <tghpcore_controller_action_layout_generate_blocks_after>
            <type>singleton</type>
            <class>yourmodule/observer</class>
            <method>addBodyClasses</method>
        </tghpcore_controller_action_layout_generate_blocks_after>
    </observers>
</controller_action_layout_generate_blocks_after>

您可以在观察者类中干净安全地实现相同的目的:

public function addBodyClasses($observer)
{
    /** @var $layout Mage_Core_Model_Layout */
    $layout = $observer->getEvent()->getLayout();
    // Retrieve the root block
    $root = $layout->getBlock('root');
    // Be 100% sure that there is a root block
    if($root) {
        // Check that the root block is a Magento page block that we can add body classes to
        if(is_a($root, 'Mage_Page_Block_Html')) {
            // Add logged in/out body classes
            if(Mage::helper('customer')->isLoggedIn()) {
                $root->addBodyClass('logged-in');
            } else {
                $root->addBodyClass('logged-out');
            }
            // You can even add more conditions and body classes for whatever you may want here
        }
    }
}

对我来说工作得很好。希望它也适合你!

于 2014-04-23T23:32:47.533 回答