这个问题与优化有关。我正在使用1.7.0.2 CE。

我正在添加CSS <body> 有条件地到我的前端页面。我使用了XML rewrite 介绍我自己的逻辑:

File: app/code/local/Jongosi/Module/etc/config.xml
...
<global>
    <blocks>
        <page>
            <rewrite>
                <html>Jongosi_Module_Block_Page_Html</html>
            </rewrite>
        </page>
    </blocks>
</global>
...

在那堂课中,我重写了 getBodyClass 方法:

File: app/code/local/Jongosi/Module/Block/Page/Html.php

class Jongosi_Module_Block_Page_Html extends Mage_Page_Block_Html
{
    public function getBodyClass()
    {
        parent::getBodyClass();
        // my own logic here
        return $this;
    }
}

“问题”是该方法被称为每个页面加载多次(在主页上的默认安装中4次,产品页面上的8次)。我的自定义逻辑相当密集。

<body> 班级 必须 为每个页面加载重写。

但是,我不希望我的逻辑运行8次,因为它正在增加页面加载。我目前正在使用cookie,设置为3秒,但感觉很脏。我将cookie设置在第一次迭代中,然后将其读取剩余的7个循环。

我希望我想做的是清楚的。是否有一种方法可以缓存页面加载的结果,然后将其重新运行下一页加载的逻辑?我已经在核心上拖了,但是我发现的任何一项似乎都没有提供一个很好的解决方案。

谢谢你。

有帮助吗?

解决方案

您的问题不像我想要的那样丰富,因此,如果这个答案不在基础上,而不是您想要的内容,我深表歉意。

首先,您的方法正在返回 $this, ,这是不正确的。如果您看实际 getBodyClass 方法

public function getBodyClass()
{
    return $this->_getData('body_class');
}

您会看到它正在返回的内容 body_class 数据属性(设置为 setBodyClass, ,这是由 addBodyClass)。因此,您需要确保方法实际返回一个字符串,该字符串是 <body/> 元素。

在此答案的其余部分中,我将假设您想忽略Magento的逻辑来设置车身课程,并且您将自己完全替换为自己。

其次,您想要的缓存可以通过直PHP或Magento Setter/Getter实现。考虑您的方法

public function getBodyClass()
{
    $original_bodyclass = parent::getBodyClass();

    $my_custom_results = null;
    // my own logic here to populate $my_custom_results;

    return $my_custom_results;
}

而不是将其编写为上述,只需将其写成

public function getBodyClass()
{
    $original_bodyclass = parent::getBodyClass();

    if(!$this->getMyCustomResults())
    {
        $my_custom_results = null;
        // my own logic here to populate $my_custom_results;
        $this->setMyCustomResults($my_custom_results);
    }
    return $this->getMyCustomResults();
}

首次称为您的自定义逻辑将运行,并且存储在属性中的值。

第二次称为第一次存储的结果。

这是整个Magento代码库中使用的非常标准的模式。使用对象属性有效,因为 Mage_Page_Block_Html 仅实例化一次(即它总是相同的对象)。如果您要处理多个对象实例,但只希望您的代码运行一次,则将缓存的结果存储在静态属性中。

if(!self::$my_custom_results)
{
    //...populate local $my_custom_results
    self::$my_custom_results = $my_custom_results
}
return self::$my_custom_results;
许可以下: CC-BY-SA归因
scroll top