Problemas de exibição de bloco estático Magento 1.9.2.0

77

Eu tenho um site com vários blocos estáticos que estavam funcionando no 1.9.1.0, mas com o 1.9.2.0 os blocos estáticos começam a ser exibidos esporadicamente, pois às vezes mostram o bloco errado e não o bloco correto. Às vezes, eles são exibidos como desejado. Alguém sabe como resolver esse problema que pode estar relacionado a esse problema ?

semana
fonte
Isso parece improdutivo e louco. Se você tem uma explicação melhor, podemos ajudá-lo, mas não vejo como, desculpe.
Fabian Blechschmidt
2
Eu posso confirmar isso. Encontrou-o em uma loja. As chaves de cache são idênticas entre os 2 blocos
Sander Mangel
8
Há um bug aberto para este magentocommerce.com/bug-tracking/issue/index/id/870
Steve Robbins
9
Segundo Piotr, este é agora um erro confirmado e está sendo analisado pela equipe principal do Magento.
benmarks
1
Este bug ainda é aparente no 1.9.2.4. Cenário / detalhes adicionados aos comentários do rastreador de erros .
Zigojacko

Respostas:

61

Eu tive esse problema com o EE 1.14.2 e parece que o mesmo problema surgiu no CE 1.9.2. Eu documentei meu problema e solução nesta questão SE .

Basicamente, devido ao seguinte código ser adicionado ao construtor de Mage_Cms_Block_Block:

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

Blocos estáticos do CMS agora são armazenados em cache. O problema surge de como as informações da chave do cache são geradas. Ele volta ao Mage_Core_Block_Abstractcomportamento de usar o nome dos blocos no layout. Se o bloco não foi adicionado ao layout, por exemplo, em uma página cms, esse nome não existe. Isso pode resultar em blocos estáticos que compartilham a mesma chave de cache e se misturam no cache.

Minha solução foi substituir a Mage_Cms_Block_Blockclasse e definir as informações da chave de cache com base na identificação do bloco e no armazenamento atual.

/**
 * 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, isso precisaria ser adicionado em seu próprio módulo com uma config.xmlsubstituição de arquivo e bloco etc. Como alternativa, você pode copiar Mage_Cms_Block_Blockpara o conjunto de códigos local e adicionar a chave de cache lá.

Você pode ver as novas linhas adicionadas no 1.9.2 aqui

Andrew Kett
fonte
Como você está instanciando esses blocos estáticos? Se você fizer isso através do layout xml, basta adicionar um nome exclusivo ao seu bloco e ele deve fazer o cache. Em qual cenário que você não dê um nome para o seu bloco (widgets talvez?)
Erfan
1
@Erfan Este problema acontece quando a adição de blocos de páginas CMS como este {{block type = "cms / block" block_id = "block_id"}} ou ao carregar um bloco estático diretamente em um modelo
Andrew Kett
6
Aqui está uma extensão gratuita para este problema estranho. Espero que beneficie todos os que enfrentam esse problema. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy
@Rajeev Com quais versões do Magento é compatível? Também funcionará correto com o Mage 1.6.x?
Zitix 14/07/2015
1
Criei uma essência para uma solução temporária a partir da resposta de andrewkett. Basta adicionar este app / code / local / Mage / Cms / Block / Block.php ao diretório Magento e o problema será resolvido. Lembre-se de remover o arquivo antes de executar sua próxima atualização do Magento (supondo que eles incluam a correção na próxima atualização).
Jay El-Kaake
13

Acabei de atualizar para 1.9.2.0 e também estou enfrentando isso. As categorias definidas para exibir blocos estáticos + produtos exibem aleatoriamente o bloco estático errado. Isso não existia antes da minha atualização 1.9.2.0.

Correção temporária Desative o cache de saída HTML dos blocos e os blocos exibidos estão corretamente.

studio2f
fonte
Estou enfrentando isso também na home page e nas páginas de produtos
wk
Este trabalho para agora, mas deve ser uma solução amarga
semana
Sim, foi isso que fiz por enquanto.
Sharif
13

Aqui vamos nós com a solução baseada em módulo local, pois a solução acima não fornece etapas inteiras. Precisamos criar o módulo Customizado, porque todos sabem que o Magento Boogieman vai buscá-lo! se mudar o núcleo :)

Você precisará dos seguintes arquivos: 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 obter mais informações, visite o link a seguir e faça o download dele https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html

Bhupendra Jadeja
fonte
Configure o módulo e não ajudou - meu problema é que os blocos CMS atribuídos à categoria desaparecem, eles não são exibidos.
Haim
@Haim se você estiver usando 1.9.2.2, então você precisa fazer entrada em System-> permissão -> cms bloco de que determinado bloco
Bhupendra Jadeja
estou usando o Magento ver. 1.9.2.0 - mas, novamente, meu problema é um pouco diferente, defino um bloco CMS para ser exibido em uma página de categoria e o bloco CMS simplesmente não aparece - se eu atualizar o cache, ele será exibido até a próxima vez em que ele desaparecer
Haim
Eu sugiro que você atualize a versão magento, acho que já foi.
Bhupendra Jadeja 22/03
7

Não há um patch oficial para isso, no entanto, ele foi resolvido no 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: Foi relatado que ainda existem problemas com as páginas do CMS em várias visualizações da loja:

O Magento CE 1.9.2.1 corrige isso apenas parcialmente.

O problema ainda persiste para as páginas do CMS em várias visualizações da loja. Aqui está um hotfix atualizado (observe que este não é um patch oficial): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

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

Steve Robbins
fonte
4

Também posso confirmar este problema.

Reproduzir:

  1. Usando o CMS -> Widgets, crie um widget para adicionar um bloco estático à barra lateral esquerda.

  2. Em seguida, crie o segundo widget para adicionar o segundo bloco estático (bloco diferente do que está dentro step 1) à barra lateral esquerda.

  3. Se o cache estiver desativado, os dois blocos estáticos serão exibidos corretamente na barra lateral.

  4. Mas se você habilitar o cache, verá o bloco estático sendo step 1 exibido duas vezes.

zitix
fonte
Oi Zitix eu enfrento o mesmo problema como você pode me dizer como você resolver este
Jaimin
3

Por enquanto, o Piotr do Magento publicou um patch não oficial para esta edição: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

Parece fazer o truque. Sim, está editando o núcleo, mas corrige o problema até o Magento lançar o patch oficial ou a próxima versão ...

Rob Mangiafico
fonte
Este truque é usado na versão mais recente 1.9.3.3. no entanto, ele não corrige o meu problema.
Rebel
3

Atualize o Magento para 1.9.2.1

Eu fiz isso e habilitei o cache para a saída HTML dos blocos e parece estar corrigido.

Assim como alguns problemas de segurança são abordados em uma nova versão.

Sharif
fonte
3

Na versão mais recente do Magento, aprimora-o com novos recursos de segurança. você pode adicionar permissões no sistema-> permissões ao bloco estático.

user32751
fonte
2
no magento 1.9.2.0 há um problema no cache do bloco estático, você está falando sobre algo diferente.
semana
Bom, eu não estava ciente desta característica
amit_game
Eu gosto disso. :)
zed Blackbeard
2

Eu tive o mesmo problema com minha loja. A melhor solução que descobri até agora é desativar o cache dos blocos afetados. Você pode fazer isso definindo o tempo de vida do cache dos blocos como nulo.

Desabilitar globalmente o cache "Blocks HTML output" em um site ativo não é uma boa ideia, pois afeta desnecessariamente o desempenho do site.

Desabilitando o cache para um bloco no xml:

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

Desabilitando o cache para um bloco no php:

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

Não defina o tempo de vida do cache como "0", conforme indicado neste artigo

Andreas Riedmüller
fonte
Andreas - Estou curioso sobre qual é o impacto do uso da técnica descrita nesse artigo e como as duas alternativas que você fornece aqui evitam as consequências negativas que você descreve?
Bryan 'BJ' Hoffpauir Jr. -
1
a primeira abordagem não vai funcionar porque, o magento interpretará essa atualização de layout como esta $block->setCacheLifeTime("null");Nota NULL e "null" são duas coisas diferentes (depois uma é uma string) e, portanto, o resultado esperado não será obtido.
Rajeev K Tomy
1
@BJ Hoffpauir: Se o cache de um bloco de cms / bloco estiver ativado, o mesmo cms / bloco em cache será usado para todas as visualizações de loja. Se você possui uma versão em inglês (visualização da loja) e alemão (visualização da loja) para o mesmo identificador de bloco, o inglês ou o alemão será usado para ambas as visualizações da loja. Desativar o cache para este bloco resolve o problema. Se você ainda deseja armazenar em cache o bloco, pode fazê-lo colocando-o em outro bloco e armazenando-o em cache.
Andreas Riedmüller
1
@ Rajeev Obrigado, eu encontrei este método em vários posts, mas tenho certeza que você está certo. Mudei o método para desativar o cache em xml. O método anterior foi uma resposta aceita aqui: stackoverflow.com/questions/27684236/…
Andreas Riedmüller
2

Consegui corrigir esse problema atualizando as extensões existentes no Magento Connection Manager. Depois de analisar, fiquei com a impressão de que o problema existe no sistema de cache do Magento.

Por padrão, o Magento possui vários pacotes relacionados às suas tecnologias de cache. Eles incluem adaptadores e bibliotecas para Zend e Redis.

Em vez de tentar encontrar o pacote apropriado, optei por atualizar todos os pacotes na minha instalação.

Então eu escolhi a marca de seleção em: Mage_All_Latest Qual é um metapacote para a versão estável mais recente do Magento 1.9.0.0.

Pode ser possível corrigir o problema atualizando apenas os pacotes corretos. Eu senti que esse era o melhor caminho a seguir, porque estou sob suspeita de que esse método também aplique patches de segurança.

Café123
fonte
1

Você precisará fazer uma atualização completa ou o backport 1.9.2.0

Alterações de cache do CMS Block e Widget no 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;
Fiasco Labs
fonte
0

Estou usando o Magento 1.9.3.8 e o problema ainda existe.

Você pode encontrar minha correção aqui :

Basicamente, estou adicionando uma string exclusiva com base na URL da página e blockId a cada informação da chave do cache, para que cada bloco tenha uma chave exclusiva:

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

Até o Magento preparar uma correção para esse problema, você pode criar o arquivo:

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

e insira o código do URL do github acima como conteúdo.

Este código foi testado para Magento 1.9.2. * E 1.9.3. *

Pascut
fonte
-1

Este erro foi confirmado na versão 1.9.2. Por enquanto, você pode resolver esse problema desativando o cache "Blocks HTML output" na seção admin -> cache management

Espero que ajude

7ochem
fonte
studio2f teve mencionar resposta thie, u pode usar @andrewkett ou clique em "esta questão" na questão principal isso vai ajudar u também
semana
2
Eu diria que desabilitar todo o cache do bloco para resolver um problema que só se manifesta em alguns blocos específicos é um pouco como cortar a mão inteira de uma pessoa, se você desenvolver ulcerações pelo dedo. Cortar o dedo, embora também seja desagradável, seria pelo menos uma resposta mais proporcional à doença. (Da Andrewkett magento.stackexchange.com/users/527/andrewkett ) resposta é uma abordagem mais razoável: magento.stackexchange.com/questions/73685/...
Bryan 'BJ' Hoffpauir Jr.
Nunca edite ou altere as classes CORE.
Ahsan Horani 14/09