Ich habe ein Problem, das mit dem Zwischenspeichern von statischen CMS-Blöcken zusammenhängt.
Ich habe eine cms-Seite und innerhalb dieser Seite rendere ich eine Reihe von statischen cms-Blöcken. Eine vereinfachte Version des CMS-Seiteninhalts sieht folgendermaßen aus:
<div class="cms-block-1">{{block type="cms/block" block_id="banner_home"}}</div>
<div class="cms-block-2">{{block type="cms/block" block_id="promo_home_1_1"}}</div>
<div class="cms-block-3">{{block type="cms/block" block_id="promo_home_1_2"}}</div>
<div class="cms-block-4">{{block type="cms/block" block_id="promo_home_2_1"}}</div>
<div class="cms-block-5">{{block type="cms/block" block_id="promo_home_2_2"}}</div>
<div class="cms-block-6">{{block type="cms/block" block_id="promo_home_2_3"}}</div>
<div class="cms-block-7">{{block type="cms/block" block_id="promo_home_3_1"}}</div>
<div class="cms-block-8">{{block type="cms/block" block_id="promo_home_3_2"}}</div>
Die Seite wird wie erwartet geladen, unmittelbar nachdem der Blockcache geleert wurde. Diese Seite sieht ungefähr so aus:
<div class="cms-block-1">banner content</div>
<div class="cms-block-2">promo_home_1_1 content</div>
<div class="cms-block-3">promo_home_1_2 content</div>
<div class="cms-block-4">promo_home_2_1 content</div>
<div class="cms-block-5">promo_home_2_2 content</div>
<div class="cms-block-6">promo_home_2_3 content</div>
<div class="cms-block-7">promo_home_3_1 content</div>
<div class="cms-block-8">promo_home_3_1 content</div>
Nach dem ersten Laden der Seite ist der Inhalt jedoch bei jedem weiteren Laden der Seite falsch. Es sieht aus wie das:
<div class="cms-block-1">banner content</div>
<div class="cms-block-2">promo_home_1_1 content</div>
<div class="cms-block-3">promo_home_1_2 content</div>
<div class="cms-block-4">promo_home_1_1 content</div>
<div class="cms-block-5">promo_home_1_2 content</div>
<div class="cms-block-6">promo_home_2_1 content</div>
<div class="cms-block-7">promo_home_2_2 content</div>
<div class="cms-block-8">promo_home_2_3 content</div>
Im zweiten Beispiel sehen Sie, dass die ersten beiden Promos korrekt sind, jedoch zeigt alles, was danach folgt, den falschen Inhalt für die block_id an. Außerdem werden die Blöcke promo_home_1_1 und promo_home_1_2 zweimal und promo_home_3_1 und promo_home_3_2 nie gerendert. Es ist wie die Zuordnung zwischen block_id und dem zugehörigen statischen Blockinhalt, der irgendwie verwechselt wird. Dies hängt mit dem Caching zusammen, da ich das Problem nicht mehr sehe, wenn der Blockcache nicht aktiviert ist.
Es ist wahrscheinlich auch erwähnenswert, dass diese Seite für EE 1.13 verwendet wurde. Nach dem Upgrade auf EE 1.14.2 ist dieses Problem jedoch aufgetreten.
Mir ist klar, dass es ziemlich schwer ist zu sagen, was falsch ist, ohne zu wissen, was sonst noch im System vor sich geht, aber ich hoffe, dass jemand mir hier wenigstens eine Richtung geben kann, da mir die Ideen ausgehen.
Aktualisieren:
Ich habe dies auch mit Widgets versucht, z
<div class="cms-block-1">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="63"}}</div>
<div class="cms-block-2">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="64"}}</div>
<div class="cms-block-3">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="65"}}</div>
In diesem Fall haben alle 3 Blöcke den gleichen Inhalt zurückgegeben, obwohl die IDs auf verschiedene Blöcke in der Datenbank verweisen. Wenn der Cache geleert wird, ändert sich der zurückgegebene Block manchmal, aber alle drei Widgets haben immer noch den gleichen Inhalt.
quelle
Antworten:
Ok, ich habe die Ursache für dieses Problem gefunden und es scheint ein Problem in Core Magento zu sein.
In Magento 1.14.2 wurde eine neue _construct-Methode zu Mage_Cms_Block_Block hinzugefügt, die den folgenden Code enthält.
Dies aktiviert effektiv das Caching für cms-Blöcke. Da kein Cache-Schlüssel festgelegt ist, wird auf den Mage_Core_Block_Abstract :: getCacheKeyInfo zurückgegriffen, der den Namen des Blocks im Layout verwendet. In diesem Fall verwenden wir keine Layout-XML-Datei, um den Block hinzuzufügen, und es ist kein Name festgelegt. Magento scheint dies zu versuchen, indem es so etwas wie ANONYMOUS_78 als Namen festlegt. Aus irgendeinem Grund scheint dies jedoch nicht zu 100% zu funktionieren, daher die Duplikate, die ich gesehen habe.
Meine Lösung bestand darin, die Mage_Cms_Block_Block-Klasse in meiner eigenen Erweiterung zu überschreiben und eine neue Methode hinzuzufügen, um den Cache-Schlüssel explizit auf die Block-ID und nicht auf einen zugewiesenen Wert festzulegen. Die Klasse sieht so aus:
Dies scheint das Problem gelöst zu haben.
Aktualisieren:
Es sieht so aus, als ob dasselbe Problem auch in CE 1.9.2 besteht
quelle
Für Magento EE-Kunden fordern Sie bitte den Patch SUPEE-5874 beim Magento Enterprise Support-Team an.
Es werden zwei Dateien aktualisiert
Ich kann den aktuellen Patch von Magento nicht veröffentlichen, da er deren Eigentum ist.
quelle
Es freut mich, dass Magento nun auch statische Blöcke zwischenspeichert. Da die aktuelle aktualisierte Version dieses seltsame Problem aufgrund des Zwischenspeicherns von statischen Blöcken enthält, können Sie mein Modul absolut kostenlos verwenden.
Diese Erweiterung wurde erstellt, um statische Blöcke besser zwischenspeichern zu können. Dabei wird auch berücksichtigt, ob die Site gesichert ist oder nicht. Die Erweiterung hat auch keine Kernumschreibungen, was dieses Modul noch besser macht.
Hier gehts .
Um einen besseren Überblick über die Erweiterung zu erhalten, können Sie auf diesen Thread verweisen .
quelle
Wir haben einen Patch für CE bereitgestellt, der dieses Problem behebt. Da EE seinen Sitz in CE hat, kann dies auch zutreffen.
Sie können diesen Pfad von meiner Liste herunterladen: https://gist.github.com/tux-rampage/77b286f7973336877f7b
Laden Sie den Inhalt herunter, entpacken Sie ihn und führen Sie den folgenden Befehl in Ihrem Magento-Stammverzeichnis aus:
Testen Sie dies in einer Staging-Umgebung, bevor Sie es auf einem Live-System anwenden!
quelle