A atualização de cache do bloco EE 1.14.2 / CE 1.9.2 possui chaves de cache não exclusivas - conteúdo duplicado exibido no frontend


18

Quando atualizei para o EE 1.14.2, a maioria das coisas correu bem, mas me deparei com um problema quando comecei a verificar minhas várias páginas de front-end. Eu tenho um nó de catálogo com várias subcategorias e cada uma delas tem um bloco estático diferente aparecendo nelas. Após a atualização, a página que foi acessada primeiro, após a liberação do cache, aparecer em todas as páginas diferentes.

Não sei se esse mesmo problema estará presente quando o CE 1.9.2 for lançado, mas eu queria colocar minha solução aqui para aqueles que encontrarem o mesmo problema.

ATUALIZAÇÃO: Conforme confirmado aqui, o mesmo problema surgiu na CE 1.9.2


Respostas:


11

Como era EE, pude utilizar o suporte do Magento, mas também resolvi as coisas sozinho para ajudar a focar o problema e obter uma solução o mais rápido possível. As alterações de código foram fornecidas pelo Magento, portanto, aplicá-las aos arquivos reais do aplicativo / código / núcleo é bom, embora você sempre possa duplicar os arquivos no seu / app / code / local e aplicar as alterações lá.

O problema era que o método de armazenamento em cache em bloco que foi adicionado na 1.14.2 não estava gerando uma chave de cache exclusiva; portanto, quando eu tinha vários blocos usados ​​no espaço do controlador de categoria, a chave de cache gerada acabou sendo exclusiva apenas para a primeira página atingida, resultando em todas essas páginas para mostrar conteúdo duplicado.

A correção foi adicionar o seguinte (exibido no formato de arquivo diff para mostrar o contexto em torno das adições - basta adicionar as linhas com o + onde elas precisam ir):

Em app / code / core / Mage / Cms / Block / Block.php na linha 72:

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

Em app / code / core / Mage / Cms / Block / Widget / Block.php na linha 82:

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

Eu não acho que seria o único a ver esse problema e, se ele aparecer na CE 1.9.2, espero que isso ajude a resolvê-lo para algumas pessoas.


Infelizmente, ele não foi lançado no CE 1.9.2, que foi lançado ontem, por isso encontrei esse problema em um dos sites de nossos clientes após a atualização. Vai tentar essa correção.
Marco Miltenburg

isso não está funcionando para mim
Pixelomo

10

Eu acho que da maneira correta é que 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 blog a seguir e você também pode fazer o download dele https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


por que você não o empacota em um módulo com o compositor?
Aleksey Razbakov 29/07

Eu não tive que muito resposta a este post assim que eu pensei que nenhum corpo quer no módulo
Bhupendra Jadeja

ninguém teve esse problema ainda. ninguém usa a nova versão do magento ainda. i não seria também usá-lo se eu não tinha problema com o módulo de terebintina
Aleksey Razbakov

Eu adicionei o link para baixar este módulo
Bhupendra Jadeja

Seria legal para tê-lo no github com modman e compositor como github.com/progammer-rkt/Rkt_SbCache
Aleksey Razbakov

4

Há mais um problema com o cache de blocos do CMS, que não é corrigido com o código fornecido acima.

Se você estiver usando URLs seguros e tags {{media}} em seus blocos do CMS, receberá uma mensagem "Aviso de conteúdo inseguro" do navegador, pois o Magento serve links inseguros do cache.

Para resolvê-lo, você precisa adicionar mais uma tag de informações de cache, como

(int)Mage::app()->getStore()->isCurrentlySecure(),

1

Este bug também pode ser corrigido com esta pequena extensão (não é necessário editar arquivos principais nem reescrever blocos):

https://github.com/progammer-rkt/Rkt_SbCache

E também contém a linha mencionada por @AdvancedLogic para evitar aviso de conteúdo inseguro:

(int)Mage::app()->getStore()->isCurrentlySecure()


isso não funcionou por 1 bloco de alguma forma #
Aleksey Razbakov

Para qual bloco? Eu não entendo, você pode ser mais específico, por favor?
zitix

É apenas um bloco estático. Nada específico. Eu até pensei que era apenas um bloqueio aleatório. Havia html errado. Parecia que o cache errado para este bloco foi usado. Não sei como ser mais específico aqui.
Aleksey Razbakov 30/07/2015
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.