Problemas de visualización de bloque estático de Magento 1.9.2.0

77

Tengo un sitio web con múltiples bloques estáticos que funcionaba en 1.9.1.0, pero con 1.9.2.0 los bloques estáticos comienzan a mostrarse esporádicamente, ya que a veces muestran el bloque incorrecto en lugar del bloque correcto. A veces se muestran como se desea. ¿Alguien sabe cómo resolver este problema que puede estar relacionado con este problema ?

wk
fuente
Esto suena irreproducible y loco. Si tiene una mejor explicación, podríamos ayudarlo, pero no veo forma, lo siento.
Fabian Blechschmidt
2
Puedo confirmar esto. Lo encontré en una tienda. Las claves de caché son idénticas entre los 2 bloques
Sander Mangel
8
Hay un error abierto para este magentocommerce.com/bug-tracking/issue/index/id/870
Steve Robbins
99
Según Piotr, este es un error confirmado y está siendo examinado por el equipo central de Magento.
puntos de referencia
1
Este error todavía es evidente en 1.9.2.4. Se agregaron escenarios / detalles a los comentarios del rastreador de errores .
zigojacko

Respuestas:

61

Tuve este problema con EE 1.14.2 y parece que ha surgido el mismo problema en CE 1.9.2. Documenté mi problema y solución en esta pregunta SE .

Básicamente debido al siguiente código que se agrega al constructor de Mage_Cms_Block_Block:

$this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
$this->setCacheLifetime(false);

Los bloques estáticos de CMS ahora se almacenan en caché. El problema surge de cómo se genera la información de la clave de caché. Recurre al Mage_Core_Block_Abstractcomportamiento de usar el nombre de los bloques en el diseño. Si el bloque no se ha agregado con el diseño, por ejemplo, en una página de cms, este nombre no existe. Esto puede provocar que los bloques estáticos compartan la misma clave de caché y se mezclen en la caché.

Mi solución fue anular la Mage_Cms_Block_Blockclase y establecer la información de la clave de caché en función de la identificación del bloque y la tienda actual.

/**
 * Override cms/block to add cache key. This started being a problem as of EE 1.14.2 and CE 1.9.2 when the _construct
 * method was added which turns on caching for cms blocks
 */
class Mysite_Cms_Block_Block extends Mage_Cms_Block_Block
{

    /**
     * If this block has a block id, use that as the cache key.
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        if ($this->getBlockId()) {
            return array(
                Mage_Cms_Model_Block::CACHE_TAG,
                Mage::app()->getStore()->getId(),
                $this->getBlockId(),
                (int) Mage::app()->getStore()->isCurrentlySecure()
            );
        } else {
            return parent::getCacheKeyInfo();
        }
    }
}

Obviamente, esto debería agregarse en su propio módulo con un config.xmlarchivo y anular el bloqueo, etc. Alternativamente, podría copiar Mage_Cms_Block_Blockal grupo de códigos local y agregar la clave de caché allí.

Puedes ver las nuevas líneas agregadas en 1.9.2 aquí

Andrew Kett
fuente
¿Cómo estás instanciando estos bloques estáticos? Si lo hace a través del diseño xml, simplemente puede agregar un nombre único a su bloque y debería almacenarse en caché. ¿En qué escenario no le pondrías un nombre a tu bloque (quizás widgets?)
Erfan
1
@Erfan Este problema ocurre al agregar bloques a páginas CMS como esta {{block type = "cms / block" block_id = "block_id"}} o al cargar un bloque estático directamente en una plantilla
Andrew Kett
66
Aquí hay una extensión gratuita para este extraño problema. Espero que beneficie a todos los que enfrentan este problema. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy
@Rajeev ¿Con qué versiones de Magento es compatible? ¿También funcionará correctamente con Mage 1.6.x?
zitix
1
Creé una esencia para una solución temporal a partir de la respuesta de Andrew. Simplemente agregue esta aplicación / código / local / Mage / Cms / Block / Block.php a su directorio de Magento y el problema se resolverá. Solo recuerde eliminar el archivo antes de realizar su próxima actualización de Magento (suponiendo que incluyan la solución en la próxima actualización).
Jay El-Kaake
13

Acabo de actualizar a 1.9.2.0 y también estoy experimentando esto. Las categorías configuradas para mostrar Bloques estáticos + Productos muestran aleatoriamente el Bloque estático incorrecto. Esto no existía antes de mi actualización 1.9.2.0.

Solución temporal Deshabilite la caché de salida HTML de bloques y los bloques que se muestran están correctamente

studio2f
fuente
Estoy enfrentando esto también en la página de inicio y en las páginas de productos
semana
Esto funciona por ahora, pero debería ser una solución amarga
wk
Sí, esto es lo que hice por ahora.
Sharif
13

Aquí vamos con la solución basada en el módulo local, ya que la solución anterior no proporciona pasos completos. ¡Necesitamos crear un módulo personalizado porque todos saben que Magento Boogieman lo atrapará! si cambia el núcleo :)

Necesitará los siguientes archivos: app/etc/modules/Bhupendra_Cms.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Bhupendra_Cms>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Cms/>
            </depends>
        </Bhupendra_Cms>
    </modules>
</config>

app/code/local/Bhupendra/Cms/etc/config.xml

<?xml version="1.0"?>
<config>
        <modules>
            <Bhupendra_Cms>
                <version>1.0.0</version>
            </Bhupendra_Cms>
        </modules>
        <global>
            <blocks>
                <cms>
                    <rewrite>
                        <block>Bhupendra_Cms_Block_Block</block>
                        <widget_block>Bhupendra_Cms_Block_Widget_Block</widget_block>
                    </rewrite>
                </cms>
            </blocks>
        </global>
</config>

app/code/local/Bhupendra/Cms/Block/Block.php

<?php
class Bhupendra_Cms_Block_Block extends Mage_Cms_Block_Block {

   public function getCacheKeyInfo()
    {

      $blockId = $this->getBlockId();
      if ($blockId) {
            $result = array(
                $blockId,
                Mage::app()->getStore()->getCode(),
            );
      } else {
           $result = parent::getCacheKeyInfo();
       }
       return $result;
   }

}

app/code/local/Bhupendra/Cms/Block/Widget/Block.php

class Bhupendra_Cms_Block_Widget_Block extends Mage_Cms_Block_Widget_Block
{
       /**
     * Storage for used widgets
     *
     * @var array
     */
    static protected $_widgetUsageMap = array();

    /**
     * Prepare block text and determine whether block output enabled or not
     * Prevent blocks recursion if needed
     *
     * @return Mage_Cms_Block_Widget_Block
     */
    protected function _beforeToHtml()
    {
        parent::_beforeToHtml();
        $blockId = $this->getData('block_id');
        $blockHash = get_class($this) . $blockId;

        if (isset(self::$_widgetUsageMap[$blockHash])) {
            return $this;
        }
        self::$_widgetUsageMap[$blockHash] = true;

        if ($blockId) {
            $block = Mage::getModel('cms/block')
                ->setStoreId(Mage::app()->getStore()->getId())
                ->load($blockId);
            if ($block->getIsActive()) {
                /* @var $helper Mage_Cms_Helper_Data */
                $helper = Mage::helper('cms');
                $processor = $helper->getBlockTemplateProcessor();
                $this->setText($processor->filter($block->getContent()));
                $this->addModelTags($block);
            }
        }

        unset(self::$_widgetUsageMap[$blockHash]);
        return $this;
    }

     /**
     * Retrieve values of properties that unambiguously identify unique content
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        $result = parent::getCacheKeyInfo();
        $blockId = $this->getBlockId();
        if ($blockId) {
            $result[] = $blockId;
       }
        return $result;
   }
}

Para obtener más información, puede visitar siguiente enlace y descarga de ella https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html

Bhupendra Jadeja
fuente
Configure el módulo y no ayudó: mi problema es que los bloques CMS asignados a la categoría desaparecen, no se muestran en absoluto.
Haim
@Haim si está utilizando 1.9.2.2, entonces necesita ingresar al Sistema-> permiso -> bloque cms de ese bloque en particular
Bhupendra Jadeja
Estoy usando Magento ver. 1.9.2.0 - pero nuevamente mi problema es ligeramente diferente, configuré un bloque CMS para que se muestre en una página de categoría y el bloque CMS simplemente no se muestra - si actualizo el caché se muestra hasta la próxima vez que simplemente desaparezca
Haim
Le sugiero que actualice la versión de magento, creo que ha sido ahora.
Bhupendra Jadeja
7

No hay un parche oficial para esto, sin embargo, se resolvió en CE 1.9.2.1

diff -r magento-CE-1.9.2.0/app/code/core/Mage/Cms/Block/Block.php magento-CE-1.9.2.1/app/code/core/Mage/Cms/Block/Block.php
74a75,94
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result = array(
>                 'CMS_BLOCK',
>                 $blockId,
>                 Mage::app()->getStore()->getCode(),
>             );
>         } else {
>             $result = parent::getCacheKeyInfo();
>         }
>         return $result;
>     }
diff -r magento-CE-1.9.2.0/app/code/core/Mage/Cms/Block/Widget/Block.php magento-CE-1.9.2.1/app/code/core/Mage/Cms/Block/Widget/Block.php
84a85
>                 $this->addModelTags($block);
90a92,106
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $result = parent::getCacheKeyInfo();
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result[] = $blockId;
>         }
>         return $result;
>     }

Nota: Se ha informado que todavía hay problemas con las páginas de CMS en varias vistas de la tienda:

Magento CE 1.9.2.1 corrige esto solo parcialmente.

El problema aún persiste para las páginas CMS en varias vistas de la tienda. Aquí hay una revisión actualizada (tenga en cuenta que este no es un parche oficial): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

Fuente: http://www.magentocommerce.com/products/bug-tracking/issue/index/id/870

Steve Robbins
fuente
4

También puedo confirmar este problema.

Reproducir:

  1. Con el CMS -> Widgets, cree un widget para agregar un bloque estático a la barra lateral izquierda.

  2. Luego, cree un segundo widget para agregar un segundo bloque estático (un bloque diferente que en step 1) a la barra lateral izquierda.

  3. Si la memoria caché está desactivada, ambos bloques estáticos se muestran correctamente en la barra lateral.

  4. Pero si habilita el caché, verá que el bloque estático se step 1 muestra dos veces.

zitix
fuente
Hola Zitix que se enfrentan al mismo problema, como puede usted decirme cómo solucionar este
Jaimin
3

Piotr de Magento ha publicado un parche no oficial para este problema por el momento: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

Parece funcionar. Sí, está editando el núcleo, pero soluciona el problema hasta que Magento lanza el parche oficial o la próxima versión ...

Rob Mangiafico
fuente
Este truco se usa en la versión más reciente 1.9.3.3. Sin embargo, no soluciona mi problema.
Rebelde
3

Actualice Magento a 1.9.2.1

Lo hice y habilité el caché para la salida HTML de Blocks y parece estar solucionado.

Además, algunos problemas de seguridad se abordan en la nueva versión.

Sharif
fuente
3

En la última versión de Magento lo mejora con nuevas características de seguridad. Puede agregar permisos en sistema-> permisos al bloque estático.

user32751
fuente
2
en magento 1.9.2.0 hay un problema al almacenar en caché el bloque estático, estás hablando de algo diferente.
semana
Agradable, no estaba al tanto de esta característica
amit_game
Me gusta esto. :)
zed Blackbeard
2

Tuve el mismo problema con mi tienda. La mejor solución que he descubierto hasta ahora es desactivar el almacenamiento en caché de los bloques afectados. Puede hacerlo estableciendo la duración de la memoria caché de los bloques como nula.

Desactivar globalmente el caché "Blocks HTML output" en un sitio en vivo no es una buena idea ya que afecta innecesariamente el rendimiento del sitio.

Deshabilitar el caché para un bloque en xml:

<block ... >
    ...
    <action method="unsetData"><key>cache_lifetime</key></action>
    <action method="unsetData"><key>cache_tags</key></action>
</block>

Deshabilitar el caché para un bloque en php:

$this->getLayout()->createBlock('cms/block')
    ->setCacheLifetime(null)
    ->setBlockId('block-id')
    ->toHtml();

No establezca la duración de la memoria caché en "0" como se señala en este artículo

Andreas Riedmüller
fuente
Andreas: Tengo curiosidad por saber cuál es el impacto del uso de la técnica descrita en ese artículo y cómo las dos alternativas que proporciona aquí evitan las consecuencias negativas que describe.
Bryan 'BJ' Hoffpauir Jr.
1
el primer enfoque no va a funcionar porque, magento interpretará esa actualización de diseño como esta $block->setCacheLifeTime("null");nota NULL y "nulo" son dos cosas diferentes (luego una es una cadena) y, por lo tanto, no se obtendrá el resultado esperado.
Rajeev K Tomy
1
@BJ Hoffpauir: si la caché para un bloque cms / block está activada, se utilizará el mismo cms / block en caché para todas las vistas de la tienda. Si tiene una versión en inglés (vista de tienda) y alemana (vista de tienda) para el mismo identificador de bloque, se usará el inglés o el alemán para ambas vistas de tienda. Deshabilitar el caché para este bloque resuelve el problema. Si aún desea almacenar en caché el bloque, puede hacerlo colocando el bloque en otro bloque y almacenando en caché este bloque.
Andreas Riedmüller
1
@Rajeev Gracias, encontré este método en varias publicaciones, pero estoy bastante seguro de que tienes razón. Cambié el método para deshabilitar el caché en xml. Sin embargo, el método anterior fue una respuesta aceptada aquí: stackoverflow.com/questions/27684236/…
Andreas Riedmüller el
2

Pude solucionar este problema actualizando las extensiones existentes en Magento Connection Manager. Después de investigarlo, tenía la impresión de que el problema existe en el sistema de almacenamiento en caché de Magento.

Por defecto, Magento tiene varios paquetes relacionados con sus tecnologías de almacenamiento en caché. Incluyen adaptadores y bibliotecas para Zend y Redis.

En lugar de tratar de encontrar el paquete apropiado, elegí actualizar todos los paquetes en mi instalación.

Luego elegí la marca de verificación en: Mage_All_Latest, que es un Metapackage para la última versión estable de Magento 1.9.0.0.

Es posible solucionar el problema actualizando solo los paquetes correctos. Sentí que esta era la mejor manera de hacerlo porque sospecho que este método también aplica parches de seguridad.

Café123
fuente
1

Tendrás que hacer una actualización completa o hacer un backport 1.9.2.0

Bloque de CMS y cambios de almacenamiento en caché de widgets en 1.9.2.1

magento-1921 / app / code / core / Mage / Cms / Block / Block.php

diff -r magento-1920/app/code/core/Mage/Cms/Block/Block.php magento-1921/app/code/core/Mage/Cms/Block/Block.php
74a75,94
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result = array(
>                 'CMS_BLOCK',
>                 $blockId,
>                 Mage::app()->getStore()->getCode(),
>             );
>         } else {
>             $result = parent::getCacheKeyInfo();
>         }
>         return $result;
>     }

magento-1921 / app / code / core / Mage / Cms / Block / Widget / Block.php

diff -r magento-1920/app/code/core/Mage/Cms/Block/Widget/Block.php magento-1921/app/code/core/Mage/Cms/Block/Widget/Block.php
84a85
>                 $this->addModelTags($block);
89a91,105
>     }
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $result = parent::getCacheKeyInfo();
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result[] = $blockId;
>         }
>         return $result;
Laboratorios Fiasco
fuente
0

Estoy usando Magento 1.9.3.8 y el problema aún existe.

Puedes encontrar mi solución aquí :

Básicamente, estoy agregando una cadena única basada en la URL de la página y blockId a cada información de clave de caché, por lo que cada bloque tendrá una clave única:

 /**
 * Generates a string based on the page url (for example category/product pages) and concatenate the block id to the url
 * Removes the caracters: /, . , &, = and , from this string
 */
private function generateUrlBasedString($blockId = null)
{
    $currentUrl = Mage::helper('core/url')->getCurrentUrl();
    $url = Mage::getSingleton('core/url')->parseUrl($currentUrl);
    $path = '_' . $url->getPath();

    $path = str_replace('/', '', $path);
    $path = str_replace('.', '', $path);
    $path = str_replace('&', '', $path);
    $path = str_replace(',', '', $path);
    $path = str_replace('=', '', $path);

    if(isset($blockId)) {
        $path .= '_' . $blockId;
    }

    return $path;
}
/**
 * Retrieve values of properties that unambiguously identify unique content
 *
 * @return array
 */
public function getCacheKeyInfo()
{
    $blockId = $this->getBlockId();
    if ($blockId) {
        $result = array(
            'CMS_BLOCK',
            $blockId,
            Mage::app()->getStore()->getCode() . $this->generateUrlBasedString($blockId),
        );
    } else {
        $result = parent::getCacheKeyInfo();
    }
    return $result;
}

Hasta que Magento prepare una solución para este problema, puede crear el archivo:

aplicación / código / local / Mage / Cms / Block / Block.php

e inserte el código de la URL de github anterior como contenido.

Este código se prueba para Magento 1.9.2. * Y 1.9.3. *

Pascut
fuente
-1

Esto es un error confirmado en la versión 1.9.2, por el momento puede resolver este problema simplemente deshabilitando el caché "Blocks HTML output" del administrador -> sección de gestión de caché

Espero eso ayude

7ochem
fuente
studio2f tenía mencionar respuesta Thie, u puede utilizar @andrewkett o haga clic en "este problema" en la pregunta principal que esto ayudará u también
sem
2
Diría que deshabilitar todo el almacenamiento en caché de bloques para abordar un problema que solo se manifiesta en algunos bloques específicos es un poco como cortarle la mano si desarrolla congelación en un dedo. Cortarse el dedo, aunque también es desagradable, sería al menos una respuesta más proporcionada a la enfermedad. La respuesta de Andrewkett ( magento.stackexchange.com/users/527/andrewkett ) es un enfoque más razonable: magento.stackexchange.com/questions/73685/…
Bryan 'BJ' Hoffpauir Jr.
Nunca edite o cambie las clases CORE.
Ahsan Horani