Das Block-Caching-Update für EE 1.14.2 / CE 1.9.2 verfügt über nicht eindeutige Cache-Schlüssel - doppelter Inhalt wird im Frontend angezeigt


18

Als ich ein Upgrade auf EE 1.14.2 durchführte, liefen die meisten Dinge reibungslos, aber ich stieß auf ein Problem, als ich begann, meine verschiedenen Frontend-Seiten zu überprüfen. Ich habe einen Katalogknoten mit mehreren Unterkategorien, auf denen jeweils ein anderer statischer Block angezeigt wird. Nach dem Upgrade wird die Seite, die nach dem Leeren des Cache zuerst aufgerufen wurde, auf allen Seiten angezeigt.

Ich weiß nicht, ob das gleiche Problem bei der Veröffentlichung von CE 1.9.2 auftreten wird, aber ich wollte hier meine Lösung für diejenigen finden, die das gleiche Problem möglicherweise finden.

UPDATE: Wie hier bestätigt , trat das gleiche Problem in CE 1.9.2 auf


Antworten:


11

Da es sich um EE handelte, konnte ich den Magento-Support nutzen, aber ich habe die Dinge auch selbst herausgearbeitet, um das Problem zu beheben und so schnell wie möglich eine Lösung zu finden. Die Codeänderungen wurden von Magento zur Verfügung gestellt, so dass es in Ordnung ist, sie auf die eigentlichen App- / Code- / Core-Dateien anzuwenden, obwohl Sie die Dateien in Ihrem / app / code / local immer duplizieren und die Änderungen dort anwenden können.

Das Problem war, dass die in 1.14.2 hinzugefügte Block-Caching-Methode keinen eindeutigen Cache-Schlüssel generierte. Wenn also mehrere Blöcke im Bereich der Kategorie-Controller verwendet wurden, war der generierte Cache-Schlüssel nur für den ersten Seitenaufruf eindeutig. Dies führt dazu, dass alle diese Seiten doppelten Inhalt aufweisen.

Der Fix bestand darin, Folgendes hinzuzufügen (wird im Diff-Dateiformat angezeigt, um den Kontext zu zeigen, der die Zusätze umgibt - fügen Sie einfach die Zeilen mit dem + hinzu, in die sie eingefügt werden müssen):

In app / code / core / Mage / Cms / Block / Block.php in Zeile 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;
+    }
 }

In app / code / core / Mage / Cms / Block / Widget / Block.php in Zeile 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;
+    }
 }

Ich würde nicht denken, dass ich der einzige sein würde, der dieses Problem sieht, und wenn es in CE 1.9.2 auftaucht, wird dies hoffentlich dazu beitragen, es für einige Leute zu lösen.


Leider hat es das gestern veröffentlichte CE 1.9.2 nicht geschafft, so dass ich nach dem Upgrade auf einer unserer Kunden-Websites auf dieses Problem gestoßen bin. Werde dieses Update versuchen.
Marco Miltenburg

Das funktioniert bei mir nicht
Pixelomo

10

Ich denke, richtig ist, dass wir ein benutzerdefiniertes Modul erstellen müssen, weil Sie alle wissen, dass Magento Boogieman Sie erhalten wird! wenn ändere den Kern :)

Sie benötigen folgende Dateien: 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;
   }
}

Weitere Informationen finden Sie in folgendem Blog. Sie können auch https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html herunterladen


Warum packst du es nicht in ein Modul mit Komponisten?
Aleksey Razbakov

Ich habe nicht so viel Antwort auf diesen Beitrag bekommen, also dachte ich, kein Körper möchte es im Modul
Bhupendra Jadeja

Noch hatte niemand dieses Problem. Noch niemand benutzt eine neue Magento-Version. Ich würde es auch nicht benutzen, wenn ich kein Problem mit dem Terpentin-Modul hätte
Aleksey Razbakov

Ich habe den Link zum Download dieses Moduls hinzugefügt
Bhupendra Jadeja

Es wäre cool , es mit modman und Komponist wie in Github zu haben github.com/progammer-rkt/Rkt_SbCache
Aleksey Razbakov

4

Es gibt ein weiteres Problem beim CMS-Block-Caching, das mit dem oben angegebenen Code nicht behoben wurde.

Wenn Sie sichere URLs und {{media}} Tags in Ihren CMS-Blöcken verwenden, erhalten Sie vom Browser die Meldung "Insecure Content Warning", da Magento unsichere Links aus dem Cache bedient.

Um dies zu beheben, müssen Sie ein weiteres Cache-Info-Tag hinzufügen, as

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

1

Dieser Fehler kann auch mit dieser kleinen Erweiterung behoben werden (keine Notwendigkeit, Kerndateien zu bearbeiten oder Blöcke neu zu schreiben):

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

Außerdem enthält es die von @AdvancedLogic erwähnte Zeile, um unsichere Inhaltswarnungen zu vermeiden:

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


Das hat für 1 Block irgendwie nicht funktioniert
Aleksey Razbakov

Für welchen Block? Ich verstehe nicht, können Sie bitte genauer sein?
zitix

Es ist nur ein statischer Block. Nichts Spezielles. Ich dachte sogar, es sei nur ein zufälliger Block. Es gab falsches HTML. Es sah so aus, als ob ein falscher Cache für diesen Block verwendet wurde. Ich weiß nicht, wie ich es genauer sagen soll.
Aleksey Razbakov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.