【问题标题】:Error in checkout - AddBodyClass结帐时出错 - AddBodyClass
【发布时间】:2013-04-12 21:43:39
【问题描述】:

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

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

这可行,但是当我去单页结帐时,我收到以下错误:

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')

【问题讨论】:

    标签: xml magento layout checkout


    【解决方案1】:

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

    但是,作为对 cameronhimself 回答的改进,实际上很容易通过观察者添加 body 类,而无需观察 core_block_abstract_to_html_before。唯一的问题是您需要一个模块。因此,您要么需要为此目的制作一个,要么使用现有的有意义的。然后,最好是,我们希望挂钩到每个页面加载触发一次的事件总是

    嗯,有这样的事件。 benmarks 提供了一个非常简洁的answer to another question,它给了我们一些提示。由此可见,好的事件可能是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
            }
        }
    }
    

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

    【讨论】:

    • 谢谢!使用您的示例创建了我自己的模块,现在可以完美运行。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的解释,设法通过使用您的逻辑创建我自己的模块来修复它(以及下面的示例)
    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 2017-02-06
    • 2017-03-21
    • 2016-05-09
    • 1970-01-01
    • 2015-02-03
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多