Проблеми з відображенням статичного блоку Magento 1.9.2.0


77

У мене є веб-сайт з декількома статичними блоками, який працював в 1.9.1.0, але з 1.9.2.0 статичні блоки починають відображатися спорадично, оскільки вони інколи показують неправильний блок, а не правильний. Іноді вони відображаються за бажанням. Хтось знає, як вирішити це питання, яке може бути пов'язане з цим питанням ?


Це звучить невідтворювано і шалено. Якщо у вас є краще пояснення, ми можемо вам допомогти, але я не бачу способу, вибачте.
Фабіан Блешшмідт

2
Я можу це підтвердити. Зустрів його в одному магазині. Клавіші кешу однакові між двома блоками
Sander Mangel

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. Я задокументував свою проблему та вирішення цього питання щодо ДП .

В основному завдяки наступному коду, що додається до конструктора 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 тут


Як ви створюєте інстанцію цих статичних блоків? Якщо ви робите це через макет xml, ви можете просто додати унікальне ім'я до свого блоку, і воно має добре кешуватися. У якому сценарії ви б не давали ім'я своєму блоку (можливо, віджети?)
Ерфан

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

6
ось безкоштовне розширення для цієї проблеми. Сподіваюся, що це піде на користь усім, хто стикається з цією проблемою. github.com/progammer-rkt/Rkt_SbCache
K Tomy

@Rajeev З якими версіями Magento він сумісний? Чи буде також правильно працювати з Mage 1.6.x?
zitix

1
Я створив суть тимчасового рішення з відповіді andrewkett. Просто додайте цю програму / код / ​​локальний / 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, призначені категорії, зникають, вони взагалі не відображаються.
Хаїм

@Haim, якщо ви використовуєте 1.9.2.2, тоді вам потрібно зробити запис у System-> дозвіл -> cms-блок цього конкретного блоку
Bhupendra Jadeja

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

Я пропоную вам оновити версію magento, я думаю, це було зараз.
Bhupendra Jadeja

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 Pages у кількох переглядах магазинів. Ось оновлене виправлення (зауважте, це не офіційний патч): 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

Piotr з Magento поки опублікував неофіційний патч для цього випуску: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

Здається, зробити трюк. Так, він редагує серцевину, але виправляє проблему, поки Magento не випустить офіційний патч або наступну версію ...


Цей трюк використовується в новій версії 1.9.3.3. однак це не вирішує мою проблему.
Повстанець

3

Оновіть Magento до 1.9.2.1

Я це зробив і ввімкнув кеш для виведення HTML блоків і, здається, виправлений.

А також деякі питання безпеки розглядаються у новому випуску.


3

В останній версії Magento удосконалює його новими функціями безпеки. Ви можете додати дозволи в системних дозволах до статичного блоку.


2
у magento 1.9.2.0 є проблема кешування статичного блоку, ви говорите про щось інше.
wk

Приємно, я не знав про цю особливість
amit_game

Мені подобається це. :)
zed Blackbeard

2

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

Глобальне вимкнення кешу "Блокування 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' Hoffpauir Jr.

1
перший підхід не спрацює, тому що, magento буде інтерпретувати оновлення макета як подібну $block->setCacheLifeTime("null");примітку NULL та "null" - це дві різні речі (пізніше одна - рядок), і тому очікуваний результат не отримає.
Rajeev K Tomy

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

1
@Rajeev Спасибі, я знайшов цей метод у кількох дописах, але я впевнений, що ви праві. Я змінив метод відключення кешу в xml. Попередній метод був обслуговується відповідь тут , хоча: stackoverflow.com/questions/27684236 / ...
Andreas Riedmüller

2

Мені вдалося виправити цю проблему, оновивши наявні розширення в Magento Connection Manager. Переглянувши це, у мене було враження, що проблема існує в системі кешування Magento.

За замовчуванням Magento має декілька пакетів, пов'язаних з кеш-технологіями. Вони включають адаптери та бібліотеки для Zend та Redis.

Замість того, щоб намагатися знайти відповідний пакет, я вирішив оновити всі пакунки у своїй установці.

Потім я вибрав галочку на: Mage_All_Latest Що є метапакетом для останнього стабільного Magento 1.9.0.0 випуску.

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


1

Вам доведеться виконати повне оновлення або підтримку 1.9.2.0

Змінення кешування блоків та віджетів CMS в 1.9.2.1

magento-1921 / додаток / код / ​​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 / додаток / код / ​​core / Mage / 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 не підготує виправлення цієї проблеми, ви можете створити файл:

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

і вставте код із вказаної вище адреси 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' Hoffpauir Jr.

Ніколи не редагуйте та не змінюйте CORE класи.
Ахсан Хорані
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.