Оптимальный способ добавления к методу 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 на первую итерацию, а затем прочитал его для оставшихся 7 петель.
Я надеюсь, что то, что я пытаюсь сделать, ясно. Есть ли способ кэшировать результат только для загрузки страницы, а затем повторно запустить логику при загрузке следующей страницы? Я прошел через ядро, но ничто из того, что я нашел, не дает хорошего решения.
Спасибо.
Решение
Ваш вопрос не так богат контекст, как я бы хотел, поэтому мои извинения, если этот ответ не является базовым, а не то, что вы ищете.
Во -первых, ваш метод возвращается $this
, что неверно. Если вы посмотрите на настоящий getBodyClass
метод
public function getBodyClass()
{
return $this->_getData('body_class');
}
Вы увидите, что он возвращает содержимое body_class
свойство данных (которое установлено с setBodyClass
, который называется addBodyClass
) Итак, вы захотите убедиться, что ваш метод фактически возвращает строку, которая является именем класса для <body/>
элемент.
В оставшуюся часть этого ответа я предполагаю, что вы хотите игнорировать логику Magento, чтобы установить класс тела, и вы полностью заменяете это своим собственным.
Во -вторых, кэширование, которое вы хотите, можно достичь через прямой PHP или с помощью сеттера/Getter 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();
}
В первый раз это называется вашей пользовательской логикой, и значение, хранящееся в свойстве.
Второй раз, когда это называется результаты, которые хранились в первый раз, будут возвращены.
Это довольно стандартный шаблон, используемый по всей кодовой базе 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;