Magento 1.9.2.0の静的ブロック表示の問題


77

1.9.1.0で動作していた複数の静的ブロックを含むWebサイトがありますが、1.9.2.0では、静的ブロックが散発的に表示されるようになります。必要に応じて表示される場合があります。誰でもに関連している可能性があり、この問題解決する方法を知っていますこの問題を


これは再現不可能でクレイジーに聞こえます。より良い説明がある場合、私たちはあなたを助けるかもしれませんが、私は仕方がありません、ごめんなさい。
ファビアンBlechschmidt

2
これを確認できます。1つの店でそれを見つけました。キャッシュキーは、2つのブロック間で同一である
サンダーMangelは


9
Piotrによると、これは現在確認されているバグであり、Magentoコアチームによって調査されています。
ベンマーク

1
このバグは1.9.2.4。でも明らかです。バグトラッカーコメントにシナリオ/詳細を追加しました。
ジゴジャック

回答:


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クラスをオーバーライドし、ブロックIDと現在のストアに基づいてキャッシュキー情報を設定することでした。

/**
 * 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を介して行う場合、ブロックに一意の名前を追加するだけで、キャッシュに問題はありません。どのシナリオで、ブロックに名前を付けないのでしょうか(おそらくウィジェットですか?)
Erfan

1
この{{ブロックタイプが=「CMS /ブロック」BLOCK_ID =「BLOCK_ID」}}のようなCMSのページにブロックを追加する場合、またはテンプレートに直接静的ブロックをロードするとき、この問題@Erfan起こり
アンドリューケット

6
ここに、この奇妙な問題に対する無料の拡張機能があります。この問題に直面しているすべての人に役立つことを願っています github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy

@Rajeev Magentoのどのバージョンと互換性がありますか?Mage 1.6.xでも正しく動作しますか?
zitix

1
アンドリューケットの答えから一時的な解決策の要点を作成しました。このapp / code / local / Mage / Cms / Block / Block.phpをMagentoディレクトリに追加するだけで、問題は解決します。次のMagentoの更新を実行する前にファイルを削除することを忘れないでください(次の更新に修正が含まれていると仮定)。
ジェイエルカーケ

13

1.9.2.0にアップグレードしたばかりですが、これも経験しています。静的ブロック+製品を表示するように設定されているカテゴリは、間違った静的ブロックをランダムに表示しています。これは、1.9.2.0のアップグレード前には存在しませんでした。

一時的な修正ブロックHTML出力キャッシュを無効にすると、表示されるブロックが正しくなります。


イムは、ホーム・ページで、製品ページでこれを直面
WK

今しかしためのこの作品は、苦いソリューションであるべき

うん、これは私が今やったことです。
シャリフ

13

ここでは、上記のソリューションでは手順全体が提供されないため、ローカルモジュールベースのソリューションを使用します。カスタムモジュールを作成する必要があります。MagentoBoogiemanがあなたを手に入れることを皆さんはご存知だからです!コアを変更する場合:)

次のファイルが必要です。 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を使用している場合-その特定のブロックの> CMSブロックを
Bhupendra Jadeja

Magentoバージョンを使用しています。1.9.2.0-しかし、私の問題は少し異なります。CMSブロックをカテゴリページに表示するように設定しますが、CMSブロックは表示されません-キャッシュを更新すると、次に消えるまで表示されます
Haim

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. 次に、2番目のウィジェットを作成して、2番目の静的ブロック(内とは異なるブロックstep 1)を左側のサイドバーに追加します。

  3. キャッシュが無効になっている場合、両方の静的ブロックがサイドバーに正しく表示されます。

  4. ただし、キャッシュを有効にすると、静的ブロックがstep 1 2回表示されます。


こんにちはZitix私はあなたがこれを解決する方法を教えてもらえるように同じ問題に直面しています
ジャイミン

3

MagentoのPiotrは、当面この問題に対する非公式パッチを公開しています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では、静的ブロックのキャッシュに問題があります。あなたは何か違うことを話しているのです。

ニース、私はこの機能を認識していなかった
amit_game

私はこれが好き。:)
Zed Blackbeard

2

私の店でも同じ問題がありました。私がこれまでに発見した最善の回避策は、影響を受けるブロックのキャッシュを無効にすることです。これを行うには、ブロックのキャッシュライフタイムをnullに設定します。

ライブサイトで「ブロックHTML出力」キャッシュをグローバルに無効にすることは、サイトのパフォーマンスに不必要に影響するため、良いアイデアではありません。

xmlの1ブロックのキャッシュを無効にします:

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

PHPの1ブロックのキャッシュを無効にします:

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

この記事で指摘されているように、キャッシュの有効期間を「0」に設定しないでください


アンドレアス-その記事で説明されている手法を使用することの影響と、ここで提供する2つの代替策が、あなたが概説したマイナスの結果をどのように回避するのか、興味があります。
ブライアン 'BJ'ホフパウアJr.

1
最初のアプローチは機能しません。これは、magentoがそのレイアウトの更新を、この$block->setCacheLifeTime("null");Note NULL と「null」が2つの異なるもの(後で1つは文字列)であると解釈し、期待される結果が得られないためです。
ラジーエフKトミー

1
@BJ Hoffpauir:cms / blockブロックのキャッシュが有効になっている場合、同じキャッシュされたcms / blockがすべてのストアビューに使用されます。同じブロック識別子の英語版(ストアビュー)とドイツ語版(ストアビュー)がある場合、両方のストアビューで英語版またはドイツ語版が使用されます。このブロックのキャッシュを無効にすると、問題が解決します。それでもブロックをキャッシュしたい場合は、そのブロックを別のブロックに入れて、代わりにこのブロックをキャッシュすることでそれを行うことができます。
アンドレアスリードミュラー

1
@Rajeevありがとう、この方法はいくつかの投稿で見つけましたが、あなたが正しいと確信しています。メソッドを変更して、xmlのキャッシュを無効にしました。:従来の方法とはいえ、ここで受け入れ答えたstackoverflow.com/questions/27684236/...
アンドレアスRiedmüller

2

Magento Connection Managerの既存の拡張機能を更新することで、この問題を修正できました。調べてみると、Magentoキャッシングシステムに問題があるという印象を受けました。

デフォルトでは、Magentoにはキャッシュテクノロジーに関連するいくつかのパッケージがあります。ZendおよびRedis用のアダプターとライブラリが含まれます。

適切なパッケージを見つける代わりに、インストール内のすべてのパッケージを更新することにしました。

次に、Mage_All_Latestのチェックマークを選択しました。これは、最新の安定したMagento 1.9.0.0リリースのメタパッケージです。

適切なパッケージのみをアップグレードすることにより、問題を解決できる場合があります。この方法はセキュリティパッチも適用するのではないかと疑われているため、これがより良い方法だと感じました。


1

完全なアップグレードを行うか、1.9.2.0をバックポートする必要があります

1.9.2.1でのCMSブロックおよびウィジェットキャッシングの変更

magento-1921 / app / code / 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 / app / code / core / Mage / Cms / Block / Widget / 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 URLのコードをコンテンツとして挿入します。

このコードは、Magento 1.9.2。*および1.9.3。*でテストされています


-1

これはバージョン1.9.2のバグとして確認されていますが、当面はadmin- > cache management sectionから「Blocks HTML output」キャッシュを無効にするだけでこの問題を解決できます。

それが役に立てば幸い


studio2fはその答えに言及していました。@ andrewkettを使用するか、メインの質問で「この問題」をクリックすると、これもuに役立ちます
wk

2
特定のブロックにのみ現れる問題に対処するためにすべてのブロックキャッシングを無効にすることは、指に凍傷が発生した場合に手全体を切り落とすようなものです。指を切り落とすことは不快でもありますが、少なくとも病気に対するより比例した反応になります。Andrewkettさん(magento.stackexchange.com/users/527/andrewkett)答えは、より合理的なアプローチです:magento.stackexchange.com/questions/73685/...
ブライアン「BJ」Hoffpauirジュニア

COREクラスを編集または変更しないでください。
アーサンホラニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.