Question

Cette question a trait à l'optimisation. J'utilise 1.7.0.2 CE.

Je suis une classe ajoutais <body> CSS conditionnellement à ma page frontend (s). Je l'ai utilisé un rewrite XML pour présenter ma propre logique:

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

Dans cette classe, je réécris la méthode 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;
    }
}

Le « problème » est que cette méthode est appelée plusieurs fois par chargement de la page (4 fois sur une installation par défaut sur la page d'accueil, 8 fois sur les pages produits). Ma logique personnalisée est assez intensive.

La classe <body> doit pour être réécrite chaque chargement de page.

Cependant, je ne veux pas que ma logique à courir 8 fois car il augmente la charge de page. Je suis actuellement en utilisant un cookie, mis à 3 secondes à vie, mais il se sent sale. Je mis le cookie lors de la première itération, puis le lire pour les 7 autres boucles.

J'espère que ce que je suis en train de faire est clair. Est-il un moyen de mettre en cache le résultat de la charge de page uniquement, ont ensuite besoin de relancer la logique sur la prochaine chargement de la page? J'ai chalutables à travers le noyau, mais rien que j'ai trouvé semble être une bonne solution.

Merci.

Était-ce utile?

La solution

Votre question n'est pas aussi riche contexte que je voudrais, donc mes excuses si cette réponse est hors de la base et non ce que vous cherchez.

Tout d'abord, votre méthode est de retour $this, ce qui est incorrect. Si vous regardez la méthode getBodyClass réelle

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

vous verrez qu'il est de retour le contenu de la propriété des données body_class (qui est définie avec setBodyClass, qui est appelé par addBodyClass). Donc, vous voulez vous assurer que votre méthode retourne en fait une chaîne qui est un nom de classe pour l'élément <body/>.

Pour le reste de cette réponse que je vais supposer que vous voulez ignorer la logique de Magento pour définir une classe de corps, et vous remplacez complètement que par votre propre.

En second lieu, la mise en cache que vous voulez peut être réalisé via PHP directement ou avec un setter Magento / getter. Considérez votre méthode

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

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

    return $my_custom_results;
}

Au lieu de l'écrire comme ci-dessus, écrivez simplement comme

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

La première fois est appelé votre logique personnalisée fonctionnera, et la valeur stockée dans une propriété.

La deuxième fois est appelé les résultats qui ont été enregistrés pour la première fois seront retournés.

Ceci est un modèle assez standard utilisé dans le code de base Magento. L'utilisation d'une propriété d'objet fonctionne parce que Mage_Page_Block_Html est seulement instancié une seule fois (à savoir qu'il est toujours le même objet). Si vous aviez affaire à plusieurs instances d'objet, mais seulement vouliez que votre code à exécuter une fois, vous souhaitez stocker les résultats mis en cache dans une propriété statique.

if(!self::$my_custom_results)
{
    //...populate local $my_custom_results
    self::$my_custom_results = $my_custom_results
}
return self::$my_custom_results;
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top