添加到GetBodyClass方法的最佳方法
-
16-10-2019 - |
题
这个问题与优化有关。我正在使用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;