EE 1.14.2 / CE 1.9.2 обновление блочного кэширования имеет неуникальные ключи кэширования - дублированный контент отображается во внешнем интерфейсе


18

Когда я обновился до EE 1.14.2, большинство вещей прошло гладко, но я столкнулся с проблемой, когда начал проверять свои различные страницы веб-интерфейса. У меня есть узел каталога с несколькими подкатегориями, и у каждой из них есть разные статические блоки. После обновления, какая бы страница ни была открыта первой после сброса кэша, она будет отображаться на всех страницах.

Я не знаю, будет ли эта проблема присутствовать при выпуске CE 1.9.2, но я хотел бы разместить здесь свое решение для тех, кто может найти эту же проблему.

ОБНОВЛЕНИЕ: как подтверждено здесь та же самая проблема возникла в CE 1.9.2


Ответы:


11

Так как это была EE, я смог использовать поддержку Magento, но я также решил все самостоятельно, чтобы помочь решить проблему и найти решение как можно быстрее. Изменения кода были предоставлены Magento, поэтому применять их к фактическим файлам app / code / core - это хорошо, хотя вы всегда можете скопировать файлы в вашем / app / code / local и применить изменения там.

Проблема заключалась в том, что метод блочного кэширования, который был добавлен в 1.14.2, не генерировал уникальный ключ кэша, поэтому, когда у меня было несколько блоков, используемых в пространстве контроллера категории, сгенерированный ключ кэша оказался уникальным только для первого попадания страницы, в результате на всех этих страницах отображается дублированный контент.

Исправление состояло в том, чтобы добавить следующее (отображается в формате файла diff, чтобы показать контекст, окружающий дополнения - просто добавьте строки с +, куда они должны идти):

В app / code / core / Mage / Cms / Block / Block.php в строке 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;
+    }
 }

В app / code / core / Mage / Cms / Block / Widget / Block.php в строке 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;
+    }
 }

Я не думаю, что буду единственным, кто увидит эту проблему, и если она появится в CE 1.9.2, надеюсь, это поможет решить некоторые проблемы.


К сожалению, он не попал в CE 1.9.2, который был выпущен вчера, поэтому я столкнулся с этой проблемой на одном из наших клиентских веб-сайтов после обновления. Постараюсь это исправить.
Марко Мильтенбург

это не работает для меня
Pixelomo

10

Я думаю, что правильно нам нужно создать пользовательский модуль, потому что вы все знаете, что Magento Boogieman получит вас! если сменить ядро ​​:)

Вам понадобятся следующие файлы: 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;
   }
}

Для получения дополнительной информации вы можете посетить следующий блог, а также загрузить с него https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


почему бы вам не упаковать его в модуль с композитором?
Алексей Разбаков

Я не получил такого большого ответа на этот пост, поэтому я думал, что никто не хочет, чтобы это было в модуле
Бхупендра Джадежа

Ни у кого еще не было этой проблемы. никто не использует новую версию magento. я также не использовал бы его, если бы у меня не было проблем со скипидарным модулем
Алексей Разбаков

Я добавил ссылку, чтобы скачать этот модуль
Бхупендра Jadeja

было бы круто иметь его в github с модманом и композитором, как github.com/progammer-rkt/Rkt_SbCache
Алексей Разбаков

4

Существует еще одна проблема с кэшированием блоков CMS, которая не устранена с помощью данного кода сверху.

Если вы используете защищенные URL-адреса и теги {{media}} в своих блоках CMS, вы получите сообщение «Предупреждение о небезопасном содержании» из браузера, поскольку Magento обслуживает небезопасные ссылки из кэша.

Чтобы решить эту проблему, вам нужно добавить еще один тэг

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

1

Эту ошибку также можно исправить с помощью этого небольшого расширения (не нужно редактировать файлы ядра или перезаписывать блоки):

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

И он также содержит строку, упомянутую @AdvancedLogic, чтобы избежать небезопасного предупреждения о содержании:

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


это как-то не сработало на 1 блок
Алексей Разбаков

Для какого блока? Я не понимаю, можете ли вы быть более конкретным, пожалуйста?
Zitix

Это всего лишь один статический блок. Ничего конкретного. Я даже думал, что это был просто случайный блок. Там был неправильный HTML. Это выглядело как неправильный кеш для этого блока. Я не знаю, как быть более конкретным здесь.
Алексей Разбаков
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.