Pregunta

Esta pregunta se relaciona con la optimización. Estoy usando 1.7.0.2 CE.

Estoy agregando un CSS <body> Clase condicionalmente a mi (s) página (s). He usado un XML rewrite Para presentar mi propia lógica:

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

En esa clase, reescribo el getBodyClass método:

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

El "problema" es que este método se llama muchas veces por carga de página (4 veces en una instalación predeterminada en la página de inicio, 8 veces en las páginas de productos). Mi lógica personalizada es bastante intensiva.

los <body> clase deber reescribir para cada carga de página.

Sin embargo, no quiero que mi lógica se ejecute 8 veces porque está aumentando la carga de la página. Actualmente estoy usando una cookie, establecida en 3 segundos de vida, pero se siente sucio. Establecí la cookie en la primera iteración y luego la leí para los 7 bucles restantes.

Espero que lo que estoy tratando de hacer sea claro. ¿Hay alguna manera de almacenar en caché el resultado solo para la carga de la página y luego hacer que vuelva a ejecutar la lógica en la carga de la página siguiente? He rastreado el núcleo, pero nada que he encontrado parece proporcionar una buena solución.

Gracias.

¿Fue útil?

Solución

Tu pregunta no es tan rica en contexto como me gustaría, así que mis disculpas si esta respuesta está fuera de la base y no lo que estás buscando.

Primero, su método está volviendo $this, que es incorrecto. Si miras el real getBodyClass método

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

Verás que está devolviendo el contenido del body_class propiedad de datos (que se establece con setBodyClass, que se llama addBodyClass). Por lo tanto, querrá asegurarse de que su método realmente devuelva una cadena que sea un nombre de clase para el <body/> elemento.

Por el resto de esta respuesta, asumiré que desea ignorar la lógica de Magento para establecer una clase de cuerpo, y lo está reemplazando por completo con la suya.

En segundo lugar, el almacenamiento en caché que desea se puede lograr a través de PHP recto o con un setter/getter magento. Considere su método

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

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

    return $my_custom_results;
}

En lugar de escribirlo como lo anterior, simplemente escríbelo como

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 primera vez que se llama su lógica personalizada se ejecutará y el valor almacenado en una propiedad.

La segunda vez que se llama los resultados que se almacenaron la primera vez que se devolverán.

Este es un patrón bastante estándar utilizado en toda la base de código Magento. Usar una propiedad de objeto funciona porque Mage_Page_Block_Html solo se instancia una vez (es decir, siempre es el mismo objeto). Si estuviera tratando con múltiples instancias de objetos, pero solo quería que su código se ejecutara una vez, almacenaría los resultados en caché en una propiedad estática.

if(!self::$my_custom_results)
{
    //...populate local $my_custom_results
    self::$my_custom_results = $my_custom_results
}
return self::$my_custom_results;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top