Frage

Diese Frage bezieht sich auf die Optimierung. Ich verwende 1.7.0.2 CE.

Ich füge ein CSS hinzu <body> Klasse bedingt zu meiner Frontend -Seite (n). Ich habe ein XML verwendet rewrite Um meine eigene Logik vorzustellen:

File: app/code/local/Jongosi/Module/etc/config.xml
...
<global>
    <blocks>
        <page>
            <rewrite>
                <html>Jongosi_Module_Block_Page_Html</html>
            </rewrite>
        </page>
    </blocks>
</global>
...

In dieser Klasse schreibe ich das neu getBodyClass Methode:

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;
    }
}

Das „Problem“ ist, dass diese Methode mehrmals pro Seite geladen wird (4 -mal auf einer Standardinstallation auf der Startseite, 8 -mal auf Produktseiten). Meine benutzerdefinierte Logik ist ziemlich intensiv.

Das <body> Klasse muss für jede Seite geladen werden.

Ich möchte jedoch nicht, dass meine Logik 8 Mal läuft, da sie die Seitenlast erhöht. Ich benutze derzeit ein Cookie, das auf 3 Sekunden Leben eingestellt ist, aber es fühlt sich schmutzig an. Ich habe den Cookie auf die erste Iteration eingestellt und dann für die verbleibenden 7 Schleifen gelesen.

Ich hoffe, was ich versuche zu tun, ist klar. Gibt es eine Möglichkeit, das Ergebnis nur für das Laden von Seite zu leiten und dann die Logik auf der nächsten Seite erneut auszuführen? Ich habe durch den Kern geschleudert, aber nichts, was ich gefunden habe, scheint eine gute Lösung zu bieten.

Vielen Dank.

War es hilfreich?

Lösung

Ihre Frage ist nicht so kontextreich, wie ich es mir möchte, also entschuldige ich mich, wenn diese Antwort nicht auf der Basis und nicht das ist, wonach Sie suchen.

Erstens kehrt Ihre Methode zurück $this, was falsch ist. Wenn Sie sich das tatsächliche ansehen getBodyClass Methode

public function getBodyClass()
{
    return $this->_getData('body_class');
}

Sie werden sehen, dass es den Inhalt der zurückgibt body_class Dateneigenschaft (die mit festgelegt ist mit setBodyClass, was von von bezeichnet wird von addBodyClass). Sie möchten also sicherstellen, dass Ihre Methode tatsächlich eine Zeichenfolge zurückgibt, die ein Klassenname für die ist <body/> Element.

Für den Rest dieser Antwort werde ich davon ausgehen, dass Sie Magentos Logik ignorieren möchten, um eine Körperklasse festzulegen, und Sie ersetzen dies vollständig durch Ihre eigenen.

Zweitens kann das von Ihnen gewünschte Caching über direktes PHP oder mit einem Magento -Setter/Getter erreicht werden. Betrachten Sie Ihre Methode

public function getBodyClass()
{
    $original_bodyclass = parent::getBodyClass();

    $my_custom_results = null;
    // my own logic here to populate $my_custom_results;

    return $my_custom_results;
}

Anstatt es als oben genannte zu schreiben, schreiben Sie es einfach als

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();
}

Das erste Mal, dass dies als benutzerdefinierte Logik bezeichnet wird, wird der in einer Eigenschaft gespeicherte Wert ausgeführt.

Das zweite Mal, dass dies die Ergebnisse genannt wird, die beim ersten Mal gespeichert wurden, wird zurückgegeben.

Dies ist ein ziemlich Standardmuster, das überall in der Magento -Codebasis verwendet wird. Verwenden einer Objekteigenschaft funktioniert, weil 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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top