Оптимальный способ добавления к методу GetBodyClass

magento.stackexchange https://magento.stackexchange.com/questions/6089

  •  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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top