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.

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top