Оптимальный Способ Добавления В Метод getBodyClass
Этот вопрос относится к оптимизации. Я использую 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 циклов.
Я надеюсь, что то, что я пытаюсь сделать, понятно. Есть ли способ кэшировать результат только для загрузки страницы, а затем повторно запустить логику при следующей загрузке страницы? Я тралил через ядро, но ничего из того, что я нашел, похоже, не дает хорошего решения.
Спасибо.
1 answers
Ваш вопрос не так богат контекстом, как мне бы хотелось, поэтому приношу свои извинения, если этот ответ не соответствует действительности, а не тому, что вы ищете.
Во-первых, ваш метод возвращает $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();
}
При первом вызове этой функции будет запущена ваша пользовательская логика, и значение, хранящееся в собственность.
Во второй раз, когда это будет вызвано, будут возвращены результаты, которые были сохранены в первый раз.
Это довольно стандартный шаблон, используемый во всей кодовой базе 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;