Probleme bei der Anzeige von statischen Blöcken in Magento 1.9.2.0

77

Ich habe eine Website mit mehreren statischen Blöcken, die in Version 1.9.1.0 ausgeführt wurde. In Version 1.9.2.0 werden die statischen Blöcke jedoch nur sporadisch angezeigt, da sie manchmal nicht den richtigen, sondern den falschen Block enthalten. Manchmal werden sie wie gewünscht angezeigt. Weiß jemand, wie man dieses Problem löst, das möglicherweise mit diesem Problem zusammenhängt ?

wk
quelle
Das klingt nicht reproduzierbar und verrückt. Wenn Sie eine bessere Erklärung haben, könnten wir Ihnen helfen, aber so sehe ich keinen Weg, sorry.
Fabian Blechschmidt
2
Das kann ich bestätigen. Begegnete es in einem Geschäft. Cache-Schlüssel sind zwischen den beiden Blöcken identisch
Sander Mangel
8
Es gibt einen offenen Bug für diese magentocommerce.com/bug-tracking/issue/index/id/870
Steve Robbins
9
Laut Piotr ist dies nun ein bestätigter Fehler und wird vom Magento-Kernteam untersucht.
benmarks
1
Dieser Fehler ist in 1.9.2.4 immer noch sichtbar. Szenario / Details zu Bug-Tracker-Kommentaren hinzugefügt .
Zigojacko

Antworten:

61

Ich hatte dieses Problem mit EE 1.14.2 und es sieht so aus, als wäre dasselbe Problem in CE 1.9.2 aufgetreten. Ich habe mein Problem und meine Lösung zu dieser SE-Frage dokumentiert .

Grundsätzlich aufgrund des folgenden Codes, der dem Konstruktor von hinzugefügt wurde Mage_Cms_Block_Block:

$this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
$this->setCacheLifetime(false);

Statische CMS-Blöcke werden jetzt zwischengespeichert. Das Problem ergibt sich aus der Generierung der Cache-Schlüsselinformationen. Es wird auf das Mage_Core_Block_AbstractVerhalten bei der Verwendung des Blocknamens im Layout zurückgegriffen. Wenn der Block nicht mit Layout hinzugefügt wurde, z. B. auf einer CMS-Seite, ist dieser Name nicht vorhanden. Dies kann dazu führen, dass statische Blöcke denselben Cache-Schlüssel verwenden und im Cache verwechselt werden.

Meine Lösung bestand darin, die Mage_Cms_Block_BlockKlasse zu überschreiben und die Cache-Schlüssel-Informationen basierend auf der Block-ID und dem aktuellen Speicher festzulegen.

/**
 * 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();
        }
    }
}

Offensichtlich müsste dies in Ihrem eigenen Modul mit einer config.xmlDatei und einer Blocküberschreibung usw. hinzugefügt werden . Alternativ könnten Sie Mage_Cms_Block_Blockin den lokalen Codepool kopieren und den Cache-Schlüssel dort hinzufügen.

Sie können die in 1.9.2 hinzugefügten neuen Zeilen hier sehen

Andrew Kett
quelle
Wie instanziieren Sie diese statischen Blöcke? Wenn Sie dies über Layout-XML tun, können Sie Ihrem Block einfach einen eindeutigen Namen hinzufügen, und der Cache sollte in Ordnung sein. In welchem ​​Szenario würden Sie Ihrem Block keinen Namen geben (Widgets vielleicht?)
Erfan
1
@Erfan Dieses Problem tritt auf, wenn Blöcke zu CMS - Seiten wie dieser {{Block type = "cms / Block" block_id = "block_id"}} Hinzufügen oder , wenn ein statischen Block direkt in einer Vorlage laden
Andrew Kett
6
Hier ist eine kostenlose Erweiterung für dieses seltsame Problem. Ich hoffe, es kommt allen zugute, die mit diesem Problem konfrontiert sind. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy
@Rajeev Mit welchen Versionen von Magento ist es kompatibel? Funktioniert es auch korrekt mit Mage 1.6.x?
Zitix
1
Aus Andrewketts Antwort entwickelte ich eine Kurzfassung für eine vorübergehende Lösung. Fügen Sie einfach diese App / code / local / Mage / Cms / Block / Block.php zu Ihrem Magento-Verzeichnis hinzu und das Problem ist gelöst. Denken Sie daran, die Datei zu entfernen, bevor Sie Ihr nächstes Magento-Update durchführen (vorausgesetzt, sie enthalten die Korrektur im nächsten Update).
Jay El-Kaake
13

Ich habe gerade ein Upgrade auf 1.9.2.0 durchgeführt und erlebe dies auch. Kategorien, in denen statische Blöcke + Produkte angezeigt werden, zeigen zufällig den falschen statischen Block an. Dies war vor meinem Upgrade auf 1.9.2.0 nicht der Fall.

Temporäre Korrektur Deaktivieren Sie den HTML-Ausgabecache für Blöcke, und die angezeigten Blöcke sind korrekt.

studio2f
quelle
Ich stehe dem auch auf der Homepage und auf den Produktseiten gegenüber
wk
Diese Arbeit für den
wk
Ja, das habe ich jetzt getan.
Sharif
13

Hier gehen wir mit lokaler modulbasierter Lösung um, da die obige Lösung keine ganzen Schritte enthält. Wir müssen ein benutzerdefiniertes Modul erstellen, da 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 unter folgendem Link und können auch unter https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html heruntergeladen werden

Bhupendra Jadeja
quelle
Richten Sie das Modul ein und es hat nicht geholfen. Mein Problem ist, dass CMS-Blöcke, die der Kategorie zugewiesen sind, verschwinden und überhaupt nicht angezeigt werden.
Haim
@Haim Wenn Sie 1.9.2.2 verwenden, müssen Sie in System-> permission -> cms-Block dieses bestimmten Blocks
Bhupendra Jadeja
Ich benutze Magento ver. 1.9.2.0 - aber auch hier mein Problem etwas anders ist, habe ich ein CMS - Block auf einer Kategorie - Seite zu zeigen , und das CMS - Block nur nicht zeigen - wenn ich den Cache aktualisieren zeigt es bis zum nächsten Mal ist es nur verschwindet
Haim
Ich schlage vor, Sie Magento-Version zu aktualisieren, ich denke, es ist jetzt gewesen.
Bhupendra Jadeja
7

Es gibt keinen offiziellen Patch dafür, er wurde jedoch in CE 1.9.2.1 behoben

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

Hinweis: Es wurde berichtet, dass immer noch Probleme mit CMS-Seiten in mehreren Geschäftsansichten vorliegen:

Magento CE 1.9.2.1 behebt dies nur teilweise.

Das Problem besteht weiterhin für CMS-Seiten in mehreren Geschäftsansichten. Hier ist ein aktualisierter Hotfix (dies ist kein offizieller Patch): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

Quelle: http://www.magentocommerce.com/products/bug-tracking/issue/index/id/870

Steve Robbins
quelle
4

Ich kann dieses Problem auch bestätigen.

Reproduzieren:

  1. Mit der CMS -> Widgets, erstellen Sie ein Widget einen statischen Block auf der linken Seitenleiste hinzuzufügen.

  2. Erstellen Sie dann ein zweites Widget, um step 1der linken Seitenleiste einen zweiten statischen Block (einen anderen Block als in ) hinzuzufügen .

  3. Wenn der Cache deaktiviert ist, werden beide statischen Blöcke korrekt in der Seitenleiste angezeigt.

  4. Wenn Sie jedoch den Cache aktivieren, wird der statische Block step 1 zweimal angezeigt.

zitix
quelle
Hallo Zitix, ich stehe vor dem gleichen Problem, wie Sie mir sagen können, wie Sie dieses
Problem
3

Piotr von Magento hat vorerst einen nicht offiziellen Patch für diese Ausgabe veröffentlicht: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

Scheint den Trick zu machen. Ja, es bearbeitet den Core, behebt aber das Problem, bis Magento den offiziellen Patch oder die nächste Version veröffentlicht ...

Rob Mangiafico
quelle
Dieser Trick wird in der neueren Version 1.9.3.3 verwendet. Es behebt jedoch nicht mein Problem.
Rebel
3

Aktualisieren Sie Magento auf 1.9.2.1

Ich habe es getan und den Cache für die Block-HTML-Ausgabe aktiviert und es scheint behoben zu sein.

Ebenso wie einige Sicherheitsprobleme werden in der neuen Version behoben.

Sharif
quelle
3

In der neuesten Version von Magento erweitert es mit neuen Sicherheitsfunktionen. Sie können Berechtigungen in system-> permissions to static block hinzufügen.

user32751
quelle
2
In Magento 1.9.2.0 gibt es ein Problem beim Zwischenspeichern von statischen Blöcken. Sie sprechen von etwas anderem.
WK
Nizza, ich war mir dieser Funktion nicht bewusst
amit_game
Ich mag das. :)
Zed Blackbeard
2

Ich hatte das gleiche Problem mit meinem Geschäft. Die beste Lösung, die ich bisher gefunden habe, besteht darin, das Caching für die betroffenen Blöcke zu deaktivieren. Sie können dies tun, indem Sie die Cache-Lebensdauer der Blöcke auf Null setzen.

Das globale Deaktivieren des Cache "Blockiert HTML-Ausgabe" auf einer Live-Site ist keine gute Idee, da dies die Site-Leistung unnötig beeinträchtigt.

Cache für einen Block in xml deaktivieren:

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

Deaktivieren des Cache für einen Block in PHP:

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

Setzen Sie die Cache-Lebensdauer nicht auf "0", wie in diesem Artikel erläutert

Andreas Riedmüller
quelle
Andreas - Ich bin gespannt, welche Auswirkungen der Einsatz der in diesem Artikel beschriebenen Technik hat und wie Sie mit den beiden hier angebotenen Alternativen die von Ihnen skizzierten negativen Konsequenzen vermeiden können.
Bryan 'BJ' Hoffpauir Jr.
1
Der erste Ansatz wird nicht funktionieren, da Magento dieses Layout-Update wie folgt interpretiert: $block->setCacheLifeTime("null");Hinweis NULL und "Null" sind zwei verschiedene Dinge (später ist einer eine Zeichenfolge) und daher wird das erwartete Ergebnis nicht erhalten.
Rajeev K Tomy
1
@BJ Hoffpauir: Wenn der Cache für einen cms / block-Block aktiviert ist, wird für alle Geschäftsansichten derselbe zwischengespeicherte cms / block verwendet. Wenn Sie eine englische (Store View) und eine deutsche (Store View) Version für dieselbe Block-ID haben, wird entweder die englische oder die deutsche Version für beide Store Views verwendet. Durch Deaktivieren des Caches für diesen Block wird das Problem behoben. Wenn Sie den Block dennoch zwischenspeichern möchten, können Sie dies tun, indem Sie den Block in einen anderen Block einfügen und stattdessen diesen Block zwischenspeichern.
Andreas Riedmüller
1
@ Rajeev Danke, ich habe diese Methode in mehreren Beiträgen gefunden, aber ich bin mir ziemlich sicher, dass Sie Recht haben. Ich habe die Methode geändert, um den Cache in XML zu deaktivieren. Die vorherige Methode war hier jedoch eine akzeptierte Antwort: stackoverflow.com/questions/27684236/…
Andreas Riedmüller
2

Ich konnte dieses Problem beheben, indem ich die vorhandenen Erweiterungen in Magento Connection Manager aktualisierte. Nachdem ich es mir angesehen hatte, hatte ich den Eindruck, dass das Problem im Magento-Caching-System besteht.

Standardmäßig verfügt Magento über mehrere Pakete, die sich auf seine Caching-Technologien beziehen. Sie enthalten Adapter und Bibliotheken für Zend und Redis.

Anstatt zu versuchen, das richtige Paket zu finden, habe ich alle Pakete in meiner Installation aktualisiert.

Dann habe ich das Häkchen gesetzt: Mage_All_Latest Dies ist ein Metapaket für die neueste stabile Version von Magento 1.9.0.0.

Möglicherweise können Sie das Problem beheben, indem Sie nur die richtigen Pakete aktualisieren. Ich war der Meinung, dass dies der bessere Weg ist, da ich den Verdacht habe, dass diese Methode auch Sicherheitspatches anwendet.

Coffee123
quelle
1

Sie müssen ein vollständiges Upgrade durchführen oder 1.9.2.0 zurückportieren

CMS-Block- und Widget-Caching-Änderungen in 1.9.2.1

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;
Fiasco Labs
quelle
0

Ich verwende Magento 1.9.3.8 und das Problem besteht immer noch.

Sie können meine Lösung hier finden :

Grundsätzlich füge ich jeder Cache-Schlüsselinformation eine eindeutige Zeichenfolge basierend auf der Seiten-URL und der Block-ID hinzu, sodass jeder Block einen eindeutigen Schlüssel hat:

 /**
 * 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;
}

Bis Magento ein Update für dieses Problem vorbereitet, können Sie die Datei erstellen:

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

und füge den Code aus der obigen Github-URL als Inhalt ein.

Dieser Code wurde für Magento 1.9.2. * Und 1.9.3. * Getestet.

Pascut
quelle
-1

Dies ist ein bestätigter Fehler in Version 1.9.2. Zurzeit können Sie dieses Problem beheben, indem Sie einfach den Cache "Blockiert HTML-Ausgabe" im Abschnitt admin -> Cache-Verwaltung deaktivieren

Ich hoffe es hilft

7ochem
quelle
studio2f hat deine antwort erwähnt, du kannst @andrewkett benutzen oder auf "this issue" in der Hauptfrage klicken, das wird dir auch helfen
wk
2
Ich würde sagen, dass das Deaktivieren des gesamten Block-Cachings zur Behebung eines Problems, das sich nur in bestimmten Blöcken manifestiert, ein bisschen so ist, als würde man sich die ganze Hand abhacken, wenn man Erfrierungen an einem Finger entwickelt. Das Abhacken des Fingers wäre zwar auch unangenehm, aber eine angemessenere Reaktion auf die Krankheit. Andrewketts ( magento.stackexchange.com/users/527/andrewkett ) Antwort ist ein vernünftigerer Ansatz: magento.stackexchange.com/questions/73685/…
Bryan 'BJ' Hoffpauir Jr.
Bearbeiten oder ändern Sie niemals CORE-Klassen.
Ahsan Horani