Problèmes d'affichage des blocs statiques Magento 1.9.2.0


77

J'ai un site Web avec plusieurs blocs statiques qui fonctionnait dans 1.9.1.0, mais avec 1.9.2.0, les blocs statiques commencent à s'afficher de façon sporadique, car ils affichent parfois le mauvais bloc plutôt que le bon bloc. Parfois, ils affichent comme souhaité. Est-ce que quelqu'un sait comment résoudre ce problème qui peut être lié à ce problème ?


Cela semble improductif et fou. Si vous avez une meilleure explication, nous pourrions vous aider, mais je ne vois pas comment, désolé.
Fabian Blechschmidt

2
Je peux le confirmer. Je l'ai rencontré dans un magasin. Les clés de cache sont identiques entre les 2 blocs
Sander Mangel


9
Selon Piotr, il s’agit maintenant d’un bug confirmé et est examiné par l’équipe de base de Magento.
benmarks

1
Ce bug est toujours apparent dans 1.9.2.4. Scénario / détails ajoutés aux commentaires du traqueur de bogues .
Zigojacko

Réponses:


61

J'ai eu ce problème avec EE 1.14.2 et il semble que le même problème se pose dans CE 1.9.2. J'ai documenté mon problème et solution sur cette question SE .

Fondamentalement, le code suivant a été ajouté au constructeur de Mage_Cms_Block_Block:

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

Les blocs statiques du CMS sont maintenant mis en cache. Le problème provient de la manière dont les informations de la clé de cache sont générées. Cela revient à Mage_Core_Block_Abstractutiliser le nom des blocs dans la mise en page. Si le bloc n'a pas été ajouté avec layout, par exemple sur une page cms, ce nom n'existe pas. Cela peut entraîner des blocs statiques partageant la même clé de cache et se mélangeant dans le cache.

Ma solution consistait à remplacer la Mage_Cms_Block_Blockclasse et à définir les informations de clé de cache en fonction de l'ID de bloc et du magasin actuel.

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

Évidemment, cela devrait être ajouté dans votre propre module avec un config.xmlfichier et un remplacement de bloc, etc. Sinon, vous pouvez également copier Mage_Cms_Block_Blockdans le pool de code local et y ajouter la clé de cache.

Vous pouvez voir les nouvelles lignes ajoutées en 1.9.2 ici


Comment instanciez-vous ces blocs statiques? Si vous le faites par le biais de XML de mise en page, vous pouvez simplement ajouter un nom unique à votre bloc et le placer correctement en cache. Dans quel scénario ne donneriez-vous pas un nom à votre bloc (des widgets peut-être?)
Erfan

1
@ Erfan Ce problème se produit lors de l'ajout de blocs aux pages du CMS, comme ceci {{block type = "cms / block" id_bloc = "id_bloc"}} ou lors du chargement d'un bloc statique directement dans un modèle
Andrew Kett le

6
Voici une extension gratuite pour ce problème étrange. J'espère que cela profitera à tous ceux qui font face à ce problème. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy

@Rajeev Avec quelles versions de Magento est-il compatible? Est-ce que travailler aussi correctement avec Mage 1.6.x?
Zitix

1
J'ai créé l'essentiel d'une solution temporaire à partir de la réponse d'Andrewkett. Ajoutez simplement cette application / code / local / Mage / Cms / Block / Block.php à votre répertoire Magento et le problème sera résolu. N'oubliez pas de supprimer le fichier avant d'effectuer votre prochaine mise à jour de Magento (en supposant qu'ils incluent le correctif dans la prochaine mise à jour).
Jay El-Kaake

13

Je viens de passer à la version 1.9.2.0 et je vis cela aussi. Les catégories définies pour afficher des blocs statiques + Les produits affichent de manière aléatoire le mauvais bloc statique. Cela n'existait pas avant ma mise à jour 1.9.2.0.

Correctif temporaire Désactive le cache de sortie HTML de Blocks et les blocs affichés sont correctement.


Je suis confronté à cela également à la page d'accueil et dans les pages produits
semaine du

Ce travail pour le moment mais devrait être une solution amère
semaine du

Oui, c'est ce que j'ai fait pour le moment.
Sharif

13

Nous allons ici avec une solution basée sur un module local, car la solution ci-dessus ne fournit pas d’étapes complètes. Nous devons créer un module personnalisé car vous savez tous que Magento Boogieman saura vous aider! si changer le noyau :)

Vous aurez besoin des fichiers suivants: 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;
   }
}

Pour plus d'informations, vous pouvez consulter le lien suivant et également télécharger à partir de ce lien https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


Configurez le module et cela n’a pas aidé - mon problème est que les blocs CMS affectés à la catégorie disparaissent, ils ne s'affichent pas du tout.
Haïm

@ Haïm si vous utilisez 1.9.2.2 alors vous devez faire une entrée dans System-> permission -> bloc cms de ce bloc particulier
Bhupendra Jadeja

J'utilise Magento ver. 1.9.2.0 - mais là encore, mon problème est légèrement différent, je mets un bloc CMS à afficher sur une page de catégorie et le bloc CMS ne s'affiche tout simplement pas - si j'actualise le cache, il s'affiche jusqu'à la prochaine fois qu'il disparaît
Haim

Je vous suggère de mettre à jour la version de magento, je pense que cela a été fait maintenant.
Bhupendra Jadeja

7

Il n'y a pas de correctif officiel pour cela, cependant, cela a été résolu dans 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;
>     }

Remarque: il a été signalé qu'il restait des problèmes avec les pages CMS sur plusieurs vues de magasin:

Magento CE 1.9.2.1 ne corrige cela que partiellement.

Le problème persiste pour les pages CMS sur plusieurs vues de magasin. Voici un correctif mis à jour (notez qu'il ne s'agit pas d'un correctif officiel): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

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



4

Je peux confirmer ce problème aussi.

Reproduire:

  1. À l'aide de CMS -> Widgets, créez un widget pour ajouter un bloc statique à la barre latérale gauche.

  2. Créez ensuite un deuxième widget pour ajouter un deuxième bloc statique (différent de celui qui est in step 1) à la barre latérale gauche.

  3. Si le cache est désactivé, les deux blocs statiques sont correctement affichés dans la barre latérale.

  4. Mais si vous activez le cache, vous verrez le bloc statique step 1 affiché deux fois.


Bonjour Zitix Je suis confronté au même problème que vous. Pouvez-vous me dire comment vous résolvez cela?
Jaimin

3

Pour l’instant, Piotr de Magento a publié un correctif non officiel pour ce problème: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

Semble faire l'affaire. Oui, c'est l'édition du coeur, mais le problème est résolu jusqu'à ce que Magento publie le correctif officiel ou la prochaine version ...


Cette astuce est utilisée sur la nouvelle version 1.9.3.3. Cependant, cela ne résout pas mon problème.
Rebel

3

Mettre à niveau Magento vers 1.9.2.1

Je l'ai fait et activé le cache pour la sortie HTML de Blocks et il semble être corrigé.

Certains problèmes de sécurité sont également abordés dans la nouvelle version.


3

Dans sa dernière version, Magento l’améliore avec de nouvelles fonctionnalités de sécurité. vous pouvez ajouter des autorisations dans system-> autorisations pour bloquer en statique.


2
Dans magento 1.9.2.0, il y a un problème de mise en cache de bloc statique, vous parlez de quelque chose de différent.
semaine

Bien

J'aime ça. :)
Zed Blackbeard

2

J'ai eu le même problème avec mon magasin. La meilleure solution que j'ai trouvée jusqu'à présent consiste à désactiver la mise en cache pour les blocs affectés. Vous pouvez le faire en définissant la durée de vie du cache des blocs sur null.

Désactiver globalement le cache "Blocs de sortie HTML" sur un site actif n'est pas une bonne idée car cela aurait un impact inutile sur les performances du site.

Désactiver le cache pour un bloc en xml:

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

Désactiver le cache pour un bloc en php:

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

Ne définissez pas la durée de vie du cache sur "0" comme indiqué dans cet article


Andreas - Je suis curieux de savoir quel est l’impact de l’utilisation de la technique décrite dans cet article et comment les deux alternatives que vous proposez ici évitent-elles les conséquences négatives que vous avez décrites?
Bryan 'BJ' Hoffpauir Jr. le

1
la première approche ne fonctionnera pas, car magento interprétera cette mise à jour comme si cette $block->setCacheLifeTime("null");note NULL et "null" étaient deux choses différentes (une plus tard est une chaîne) et le résultat attendu ne sera donc pas obtenu.
Rajeev K Tomy

1
@BJ Hoffpauir: Si le cache pour un bloc cms / block est activé, le même cms / block mis en cache sera utilisé pour toutes les vues du magasin. Si vous avez une version anglaise (vue magasin) et une version allemande (vue magasin) pour le même identifiant de bloc, la version anglaise ou allemande sera utilisée pour les deux vues magasin. La désactivation du cache pour ce bloc résout le problème. Si vous souhaitez toujours mettre le bloc en cache, vous pouvez le faire en le plaçant dans un autre bloc et en le mettant en cache.
Andreas Riedmüller

1
@Rajeev Merci, j'ai trouvé cette méthode dans plusieurs messages, mais je suis sûr que vous avez raison. J'ai changé la méthode pour désactiver le cache en XML. La méthode précédente était une réponse acceptée ici cependant: stackoverflow.com/questions/27684236/…
Andreas Riedmüller

2

J'ai pu résoudre ce problème en mettant à jour les extensions existantes dans Magento Connection Manager. Après l’avoir examiné, j’ai eu l’impression que le problème existe dans le système de mise en cache de Magento.

Par défaut, Magento dispose de plusieurs packages liés à ses technologies de mise en cache. Ils incluent des adaptateurs et des bibliothèques pour Zend et Redis.

Au lieu d'essayer de trouver le paquet approprié, j'ai choisi de mettre à jour tous les paquets de mon installation.

Ensuite, j'ai coché la case: Mage_All_Latest, qui est un métapaquet pour la dernière version stable de Magento 1.9.0.0.

Il peut être possible de résoudre le problème en mettant à niveau uniquement les bons packages. Je pensais que c'était la meilleure façon de faire, car je suis soupçonné que cette méthode applique également des correctifs de sécurité.


1

Vous devrez faire une mise à niveau complète, ou backport 1.9.2.0

Modifications de la mise en cache des blocs et des widgets CMS dans la version 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;

0

J'utilise Magento 1.9.3.8 et le problème existe toujours.

Vous pouvez trouver ma solution ici :

Fondamentalement, j'ajoute une chaîne unique basée sur l'URL de la page et sur blockId pour chaque information de clé de cache. Ainsi, chaque bloc aura une clé unique:

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

Jusqu'à ce que Magento prépare un correctif pour ce problème, vous pouvez créer le fichier:

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

et insérez le code de l'URL github ci-dessus en tant que contenu.

Ce code est testé pour Magento 1.9.2. * Et 1.9.3. *


-1

Ceci est un bug confirmé dans la version 1.9.2, pour le moment, vous pouvez résoudre ce problème en désactivant simplement le cache "Blocks HTML output" de l' administrateur -> section de gestion du cache

J'espère que ça aide


studio2f avait mentionné sa réponse, vous pouvez utiliser @andrewkett ou cliquer sur "ce numéro" dans la question principale, cela vous aidera également
semaine du

2
Je dirais que désactiver la mise en cache de blocs pour résoudre un problème qui ne se manifeste que sur certains blocs équivaut à couper une main entière si vous développez des engelures sur un doigt. Couper le doigt, bien que tout aussi désagréable, serait au moins une réponse plus proportionnée à la maladie. Andrewkett ( magento.stackexchange.com/users/527/andrewkett ) répond de manière plus raisonnable: magento.stackexchange.com/questions/73685/…
Bryan 'BJ' Hoffpauir Jr.

Ne jamais modifier ou modifier les classes CORE.
Ahsan Horani
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.