Проблемы с отображением статического блока в Magento 1.9.2.0


77

У меня есть веб-сайт с несколькими статическими блоками, который работал в 1.9.1.0, но с 1.9.2.0 статические блоки начинают отображаться спорадически, поскольку иногда они показывают неправильный блок, а не правильный блок. Иногда они отображаются по желанию. Кто-нибудь знает, как решить эту проблему, которая может быть связана с этой проблемой ?


Это звучит невоспроизводимо и безумно. Если у вас есть лучшее объяснение, мы можем вам помочь, но я не вижу пути, извините.
Фабиан Блехшмидт

2
Я могу это подтвердить. Обнаружил это в одном магазине. Ключи кеша идентичны между двумя блоками
Сандер Мангель

8
Существует открытая ошибка для этого magentocommerce.com/bug-tracking/issue/index/id/870
Стив Роббинс

9
По словам Петра, теперь это подтвержденная ошибка, и в настоящее время ее изучает основная команда Magento.
отметки

1
Эта ошибка все еще очевидна в 1.9.2.4. Добавлен сценарий / подробности в комментарии к трекеру ошибок .
zigojacko

Ответы:


61

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

В основном из-за следующего кода, добавляемого в конструктор Mage_Cms_Block_Block:

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

Статические блоки CMS теперь кэшируются. Проблема возникает из-за того, как генерируется информация о ключе кеша. Это возвращается к Mage_Core_Block_Abstractповедению использования имени блока в макете. Если блок не был добавлен с макетом, например, на странице CMS, это имя не существует. Это может привести к тому, что статические блоки будут использовать один и тот же ключ кеша и перепутаться в кеше.

Мое решение состояло в том, чтобы переопределить Mage_Cms_Block_Blockкласс и установить информацию о ключе кэша на основе идентификатора блока и текущего хранилища.

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

Очевидно, это необходимо добавить в ваш собственный модуль с config.xmlпереопределением файла и блока и т. Д. В качестве альтернативы вы можете скопировать Mage_Cms_Block_Blockв локальный пул кода и добавить туда ключ кеша.

Вы можете увидеть новые строки, добавленные в 1.9.2 здесь


Как вы создаете эти статические блоки? Если вы делаете это с помощью layout xml, вы можете просто добавить уникальное имя в свой блок, и оно должно хорошо кэшироваться. В каком сценарии вы не дадите имя своему блоку (возможно, виджетам?)
Эрфан

1
@Erfan Эта проблема возникает при добавлении блоков на страницы CMS, например, {{block type = "cms / block" block_id = "block_id"}} или при загрузке статического блока непосредственно в шаблон
Эндрю Кетт,

6
Вот бесплатное расширение для этой странной проблемы. Надеюсь, что это пойдет на пользу всем, кто сталкивается с этой проблемой. github.com/progammer-rkt/Rkt_SbCache
Раджив К Томи

@Rajeev С какими версиями Magento он совместим? Также будет корректно работать с Mage 1.6.x?
Zitix

1
Я создал суть для временного решения из ответа Эндрюкетта. Просто добавьте это приложение / code / local / Mage / Cms / Block / Block.php в каталог Magento, и проблема будет решена. Просто не забудьте удалить файл, прежде чем выполнять следующее обновление Magento (при условии, что оно включено в следующее обновление).
Джей Эль-Кааке

13

Я только что обновился до 1.9.2.0 и тоже испытываю это. Категории, для которых установлено отображение Статических блоков + Продукты случайно отображают неправильный Статический блок. Этого не было до моего обновления 1.9.2.0.

Временное исправление Отключите кэш вывода блоков HTML, и блоки отображаются правильно.


Я сталкиваюсь с этим также на домашней странице и на страницах продукта
wk

Эта работа сейчас , но должно быть горьким решение
WK

Да, это то, что я сделал сейчас.
Шариф

13

Здесь мы идем с локальным модульным решением, так как вышеупомянутое решение не обеспечивает целых шагов Нам нужно создать пользовательский модуль, потому что вы все знаете, что 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


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

@ Хаим, если вы используете 1.9.2.2, то вам нужно сделать запись в блок System-> Разрешение-> CMS этого конкретного блока
Bhupendra Jadeja

я использую Magento вер. 1.9.2.0 - но опять-таки моя проблема немного отличается, я установил блок CMS для отображения на странице категории, а блок CMS просто не отображается - если я обновлю кэш, который он показывает, до следующего раза, когда он просто исчезнет
Хаим

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

7

Официального патча для этого не существует, однако он был решен в 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;
>     }

Примечание. Сообщается, что по-прежнему существуют проблемы со страницами CMS в нескольких представлениях магазина:

Magento CE 1.9.2.1 исправляет это только частично.

Проблема по-прежнему сохраняется для страниц CMS в нескольких представлениях магазина. Вот обновленное исправление (обратите внимание, что это не официальный патч): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

Источник: http://www.magentocommerce.com/products/bug-tracking/issue/index/id/870



4

Я могу подтвердить эту проблему тоже.

Воспроизвести:

  1. Используя CMS -> Widgets, создайте виджет для добавления статического блока на левую боковую панель.

  2. Затем создайте второй виджет, чтобы добавить второй статический блок (другой блок, чем в step 1) к левой боковой панели.

  3. Если кеш отключен, оба статических блока правильно отображаются на боковой панели.

  4. Но если вы включите кеш, вы увидите, что статический блок step 1 отображается дважды.


Привет Zitix Я сталкиваюсь с той же проблемой, как вы, вы можете сказать мне, как вы решаете это
Jaimin

3

В настоящее время Петр из Magento опубликовал неофициальный патч для этой проблемы: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

Кажется, чтобы сделать трюк. Да, он редактирует ядро, но исправляет проблему, пока Magento не выпустит официальный патч или следующую версию ...


Этот прием используется в более новой версии 1.9.3.3. однако это не решает мою проблему.
Мятежник

3

Обновите Magento до 1.9.2.1

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

А также некоторые проблемы безопасности, решаемые в новой версии.


3

В последней версии Magento дополняет его новыми функциями безопасности. Вы можете добавить разрешения в system-> permissions для статического блока.


2
в magento 1.9.2.0 есть проблема с кэшированием статического блока, вы говорите о чем-то другом.
WK

Хорошо, я не знал об этой функции
amit_game

Мне это нравится. :)
Зед Черная Борода

2

У меня была такая же проблема с моим магазином. Лучший обходной путь, который я обнаружил на данный момент, - это отключить кэширование для затронутых блоков. Вы можете сделать это, установив время жизни кеша блоков в null.

Глобальное отключение кеша «Блокирует вывод HTML» на живом сайте не очень хорошая идея, так как это излишне влияет на производительность сайта.

Отключение кеша для одного блока в xml:

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

Отключение кеша для одного блока в php:

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

Не устанавливайте время жизни кэша на «0», как указано в этой статье.


Андреас - мне любопытно, каково влияние использования техники, описанной в этой статье, и как две предложенные вами альтернативы позволяют избежать негативных последствий, которые вы наметили?
Брайан 'BJ' Хоффпауир младший

1
первый подход не сработает, потому что magento будет интерпретировать это обновление макета, как это $block->setCacheLifeTime("null");примечание, NULL и «null» - это две разные вещи (позже одна строка) и, следовательно, ожидаемый результат не будет получен.
Раджив К Томи

1
@BJ Hoffpauir: если кеш для блока cms / block активирован, один и тот же кешированный cms / block будет использоваться для всех представлений магазина. Если у вас есть английская (просмотр магазина) и немецкая (просмотр магазина) версии для одного и того же идентификатора блока, то для обоих представлений магазина будет использоваться английская или немецкая версия. Отключение кеша для этого блока решает проблему. Если вы все еще хотите кэшировать блок, вы можете сделать это, поместив блок в другой блок и вместо этого кэшировать этот блок.
Андреас Ридмюллер

1
@Rajeev Спасибо, я нашел этот метод в нескольких сообщениях, но я уверен, что вы правы. Я изменил метод, чтобы отключить кэш в XML. Предыдущий метод был принят здесь, хотя ответ: stackoverflow.com/questions/27684236/…
Андреас Ридмюллер

2

Я смог исправить эту проблему, обновив существующие расширения в Magento Connection Manager. Посмотрев на это, у меня сложилось впечатление, что проблема существует в системе кэширования Magento.

По умолчанию в Magento есть несколько пакетов, связанных с технологиями кэширования. Они включают в себя адаптеры и библиотеки для Zend и Redis.

Вместо того, чтобы пытаться найти подходящий пакет, я решил обновить все пакеты в моей установке.

Затем я выбрал галочку: Mage_All_Latest, которая является метапакетом для последней стабильной версии Magento 1.9.0.0.

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


1

Вам нужно будет сделать полное обновление или backport 1.9.2.0

Изменения в кэшировании блоков и виджетов CMS в 1.9.2.1

Magento-1921 / приложение / код / ​​ядро ​​/ Маг / Cms / блок / 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 / приложение / код / ​​ядро ​​/ Маг / Cms / блок / виджет / 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;

0

Я использую Magento 1.9.3.8, и проблема все еще существует.

Вы можете найти мое исправление здесь :

По сути, я добавляю уникальную строку, основанную на URL страницы и blockId, к каждой информации о ключе кэша, поэтому у каждого блока будет уникальный ключ:

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

Пока Magento не подготовит исправление для этой проблемы, вы можете создать файл:

Приложение / код / ​​местные / Mage / Cms / Block / Block.php

и вставьте код из вышеупомянутого URL GitHub в качестве содержимого.

Этот код проверен на Magento 1.9.2. * И 1.9.3. *


-1

Это подтвержденная ошибка в версии 1.9.2, в настоящее время вы можете решить эту проблему, просто отключив кэш «Блокирует вывод HTML» в разделе администратора -> Управление кешем.

Надеюсь, это поможет


studio2f упомянул ваш ответ, вы можете использовать @andrewkett или нажать «этот вопрос» в главном вопросе, это также поможет вам
wk

2
Я бы сказал, что отключение кэширования всех блоков для решения проблемы, которая проявляется только в некоторых конкретных блоках, похоже на отрубание всей руки, если у вас развивается обморожение на пальце. Отрезание пальца, хотя и неприятно, будет, по крайней мере, более пропорциональным ответом на болезнь. Ответ Эндрюкетта ( magento.stackexchange.com/users/527/andrewkett ) является более разумным подходом: magento.stackexchange.com/questions/73685/…
Брайан 'BJ' Хоффпауир младший

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