De façon optimale d'ajouter à la méthode getBodyClass
-
16-10-2019 - |
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.
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;