Forma óptima de agregar al método getBodyClass
-
16-10-2019 - |
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.
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;