Оновлення блоку кешування блоків 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 / local та застосувати зміни до них.

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

Виправлення полягало в тому, щоб додати наступне (відображається у файлі різного формату, щоб показати контекст, що оточує доповнення - просто додайте у рядках з позначкою +, куди потрібно йти):

У додатку / код / ​​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;
+    }
 }

У додатку / код / ​​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


чому ти не упакуєш його в модуль із композитором?
Олексій Разбаков

Я не отримав такої великої відповіді на цю посаду, тому я подумав, що жодне тіло не хоче цього в модулі
Bhupendra Jadeja

ще ніхто не мав цієї проблеми. ще ніхто не використовує нову версію magento. я б також не використовував його, якби у мене не виникло проблем зі скипидарним модулем
Олексій Разбаков,

Я додав посилання для завантаження цього модуля
Bhupendra 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.