Оптимальный Способ Добавления В Метод 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 циклов.

Я надеюсь, что то, что я пытаюсь сделать, понятно. Есть ли способ кэшировать результат только для загрузки страницы, а затем повторно запустить логику при следующей загрузке страницы? Я тралил через ядро, но ничего из того, что я нашел, похоже, не дает хорошего решения.

Спасибо.

Author: Jongosi, 2013-07-25

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;
 2
Author: Alan Storm, 2015-08-06 22:37:59