Ottimale modo di aggiungere al metodo getBodyClass
-
16-10-2019 - |
Domanda
Questa domanda si riferisce a ottimizzazione. Sto utilizzando 1.7.0.2 CE.
Io sono l'aggiunta di una classe CSS <body>
condizionatamente alla mia pagina frontend (s). Ho usato un rewrite
XML per introdurre la mia logica:
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 quella classe, riscrivo il metodo 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;
}
}
Il 'problema' è che questo metodo viene chiamato molte volte al caricamento della pagina (4 volte su una installazione di default nella home page, 8 volte su pagine di prodotto). La mia logica personalizzata è abbastanza intenso.
La classe <body>
deve per essere riscritto ogni caricamento della pagina.
Tuttavia, non voglio la mia logica per eseguire 8 volte, perché è in aumento il caricamento della pagina. Attualmente sto usando un cookie, impostato a 3 secondi di vita, ma ci si sente sporca. Ho impostato il cookie sul prima iterazione e poi leggerlo per i restanti 7 cicli.
Spero che quello che sto cercando di fare è chiaro. C'è un modo per mettere in cache il risultato solo per il caricamento della pagina, poi l'hanno ri-eseguire la logica sul prossimo caricamento della pagina? Ho spulciato attraverso il nucleo, ma nulla ho trovato sembra fornire una buona soluzione.
Grazie.
Soluzione
La tua domanda non è così ricco contesto come vorrei, quindi le mie scuse se questa risposta è fuori base e non quello che stai cercando.
$this
In primo luogo, il metodo sta tornando, che non è corretto. Se si guarda il metodo getBodyClass
reale
public function getBodyClass()
{
return $this->_getData('body_class');
}
vedrete che è di tornare il contenuto della proprietà data body_class
(che è impostato con setBodyClass
, che è chiamato da addBodyClass
). Quindi, ti consigliamo di assicurarsi che il metodo in realtà restituisce una stringa che è un nome di classe per l'elemento <body/>
.
Per il resto di questa risposta ho intenzione di assumere si desidera ignorare la logica di Magento per impostare una classe corpo, e il gioco è completamente in sostituzione di quello con il vostro.
In secondo luogo, la memorizzazione nella cache che si desidera può essere raggiunto tramite dritto PHP o con un Magento setter / getter. Considerate il metodo
public function getBodyClass()
{
$original_bodyclass = parent::getBodyClass();
$my_custom_results = null;
// my own logic here to populate $my_custom_results;
return $my_custom_results;
}
Invece di scrivere come sopra, è sufficiente scrivere come
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 prima volta che questo si chiama la tua logica personalizzata verrà eseguito, e il valore memorizzato in una proprietà.
La seconda volta che questo si chiama i risultati che sono stati memorizzati per la prima volta verrà restituito.
Questo è un modello piuttosto standard utilizzato in tutto il codebase Magento. Utilizzando una proprietà oggetto funziona perché Mage_Page_Block_Html
viene istanziata una sola volta (cioè è sempre lo stesso oggetto). Se si trattasse di istanze di oggetti multipli, ma solo voluto il codice da eseguire una volta, ci si memorizzare i risultati memorizzati nella cache in una proprietà statica.
if(!self::$my_custom_results)
{
//...populate local $my_custom_results
self::$my_custom_results = $my_custom_results
}
return self::$my_custom_results;