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回実行したくありません。私は現在、3秒の生涯に設定されたCookieを使用していますが、汚い感じがします。最初のイテレーションでCookieを設定し、残りの7つのループのために読み取ります。
私がやろうとしていることが明確であることを願っています。ページのロードのみの結果をキャッシュしてから、次のページのロードでロジックを再実行する方法はありますか?私はコアをトロールしましたが、私が見つけたものは何も良い解決策を提供しているようです。
ありがとうございました。
解決
あなたの質問は私が望むほど豊かな文脈に豊富ではないので、この答えがあなたが探しているものではなく、ベースから外れている場合、私の謝罪。
まず、あなたの方法が戻ってきています $this
, 、これは間違っています。実際のものを見ると getBodyClass
方法
public function getBodyClass()
{
return $this->_getData('body_class');
}
あなたはそれがの内容を返していることがわかります body_class
データプロパティ(で設定されています setBodyClass
, 、それによって呼ばれます addBodyClass
)。そのため、メソッドが実際にクラス名である文字列を返すようにする必要があります。 <body/>
エレメント。
この答えの残りの部分では、Magentoのロジックを無視してボディクラスを設定したいと思います。
第二に、あなたが望むキャッシュは、ストレートPHPまたはMagentoセッター/ゲッターで達成できます。あなたの方法を考慮してください
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();
}
これが初めてカスタムロジックと呼ばれるのは、プロパティに保存されている値が実行されます。
これが2回目の結果と呼ばれるのは、最初に保存された結果が返されます。
これは、Magento Codebase全体で使用されるかなり標準的なパターンです。オブジェクトプロパティを使用すると動作します Mage_Page_Block_Html
一度のみインスタンス化されます(つまり、常に同じオブジェクトです)。複数のオブジェクトインスタンスを扱っていたが、コードを1回だけ実行したい場合は、キャッシュ結果を静的プロパティに保存します。
if(!self::$my_custom_results)
{
//...populate local $my_custom_results
self::$my_custom_results = $my_custom_results
}
return self::$my_custom_results;