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;
+    }
 }

この問題を目にするのは私だけではないと思います。CE1.9.2でこの問題が発生した場合は、これが一部の人々の問題解決に役立つことを願っています。


残念ながら、昨日リリースされたCE 1.9.2には届かなかったため、アップグレード後にクライアントのWebサイトでこの問題に遭遇しました。この修正を試みます。
マルコミルテンブルク

これは私のために働いていない
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バージョンを使用していません。ターペンタインモジュールに問題がなかった場合にも使用しません
Aleksey Razbakov

私は、このモジュールをダウンロードするためのリンクを追加した
Bhupendra Jadeja


4

CMSブロックのキャッシュにはもう1つの問題があります。これは上記のコードでは修正されません。

CMSブロックで安全なURLと{{media}}タグを使用している場合、Magentoはキャッシュから安全でないリンクを提供するため、ブラウザから「安全でないコンテンツの警告」メッセージを受け取ります。

解決するには、キャッシュ情報タグをもう1つ追加する必要があります。

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

1

このバグは、この小さな拡張子で修正することもできます(コアファイルを編集したり、ブロックを書き換えたりする必要はありません)。

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

また、安全でないコンテンツの警告を回避するために、@ AdvancedLogicが言及した行も含まれています。

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


これは何とか1ブロックで機能しませんでした
アレクセイラズバコフ

どのブロックですか?わかりません、もっと具体的にお願いできますか?
-zitix

これは1つの静的ブロックです。特になし。ランダムなブロックだとさえ思いました。間違ったhtmlがありました。このブロックの間違ったキャッシュが使用されたようです。ここでより具体的にする方法がわかりません。
アレクセイラズバコフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.