Problème de mise en cache des blocs CMS dans EE 1.14.2

15

J'ai un problème qui semble être lié à la mise en cache des blocs statiques du CMS.

J'ai une page cms et au sein de cette page, je rend un certain nombre de blocs statiques cms. Une version simplifiée du contenu de la page CMS ressemble à ceci:

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

La page se charge comme prévu immédiatement après l'effacement du cache de bloc, cette page ressemblant à ceci:

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

Cependant, après le chargement initial de la page, chaque chargement de page suivant le contenu est incorrect. Cela ressemble à ceci:

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

Dans le deuxième exemple, vous pouvez voir que les deux premières promos sont correctes, mais tout ce qui suit affiche le mauvais contenu pour le block_id. De plus, les blocs promo_home_1_1 et promo_home_1_2 sont tous deux rendus deux fois et promo_home_3_1 et promo_home_3_2 ne sont jamais rendus. C'est comme le mappage entre block_id et son contenu de bloc statique associé est en quelque sorte mélangé. Cela est lié à la mise en cache, comme si le cache de bloc n'est pas activé, je ne vois plus le problème.

En outre, il convient probablement de noter que cette page fonctionnait auparavant sur EE 1.13, mais après la mise à niveau vers EE 1.14.2, ce problème a commencé à se produire.

Je me rends compte qu'il est assez difficile de dire ce qui ne va pas sans savoir ce qui se passe dans le système, mais j'espère que quelqu'un pourrait me donner au moins un peu plus de direction ici car je manque d'idées.

Mise à jour:

J'ai aussi essayé ça avec des widgets, par exemple

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

Dans ce cas, les 3 blocs ont renvoyé le même contenu même si les identifiants pointent vers des blocs différents dans la base de données. Lorsque le cache est effacé, le bloc renvoyé change parfois, mais les trois widgets auront toujours le même contenu.

Andrew Kett
la source
avez-vous pu le résoudre pour les widgets?
Sergei Guk
Je n'ai pas vraiment eu ce problème donc non, mais il semble que Mage_Cms_Block_Widget_Block pourrait avoir le même problème et donc la même solution
Andrew Kett

Réponses:

5

Ok donc j'ai trouvé la cause de ce problème et il semble que ce soit un problème dans le noyau de magento.

Il y a une nouvelle méthode _construct ajoutée à Mage_Cms_Block_Block dans magento 1.14.2 qui contient le code suivant.

/**
 * Initialize cache
 *
 * @return null
 */
protected function _construct()
{
    /*
    * setting cache to save the cms block
    */
    $this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
    $this->setCacheLifetime(false);
}

Cela active effectivement la mise en cache des blocs cms. Aucune clé de cache n'est définie, elle revient donc à Mage_Core_Block_Abstract :: getCacheKeyInfo qui utilise le nom du bloc dans la mise en page. Dans ce cas, nous n'utilisons pas réellement un fichier xml de mise en page pour ajouter le bloc et aucun nom n'est défini. Magento semble essayer de gérer cela en définissant quelque chose comme ANONYMOUS_78 comme nom. Cependant, pour une raison quelconque, cela ne semble pas fonctionner à 100%, d'où les doublons que je voyais.

Ma solution a été de remplacer la classe Mage_Cms_Block_Block dans ma propre extension et d'ajouter une nouvelle méthode pour définir explicitement la clé de cache sur l'ID de bloc plutôt qu'une valeur assignée. La classe ressemble à ceci:

/**
 * Override cms/block to add cache key. This started being a problem as of EE 1.14.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();
        }
    }
}

Cela semble avoir résolu le problème.

Mise à jour:

Il semble que ce même problème existe également dans CE 1.9.2

Andrew Kett
la source
2

Pour les clients Magento EE, veuillez demander le correctif SUPEE-5874 à l'équipe d'assistance Magento Enterprise.

Il mettra à jour deux fichiers

app/code/core/Mage/Cms/Block/Widget/Block.php
app/code/core/Mage/Cms/Block/Block.php

Je ne peux pas publier le correctif réel de Magento car c'est leur propriété.

kab8609
la source
1

Il est heureux que Magento mette également en cache des blocs statiques. Étant donné que la version mise à niveau actuelle inclut ce problème étrange en raison du cache des blocs statiques, vous pouvez utiliser mon module gratuitement.

Cette extension est créée pour une meilleure mise en cache des blocs statiques. Il tient également compte du fait que le site est sécurisé ou non. De plus, l'extension n'a pas de réécriture de base, ce qui rend ce module encore meilleur.

Et voilà .

Pour une meilleure vue d'ensemble de l'extension, vous pouvez consulter ce fil .

Rajeev K Tomy
la source
0

Nous avons fourni un correctif pour CE, qui résout ce problème. Étant donné que EE est basé en CE, cela pourrait également s'appliquer.

Vous pouvez télécharger ce chemin depuis mon résumé: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Téléchargez le gist, décompressez-le et exécutez la commande suivante dans votre racine magento:

patch -p2 </path/to/LUKA-MCE20150714-cms-caching-hotfix.patch

Testez-le sur un environnement intermédiaire avant de l'appliquer sur un système en direct!

tux-rampage
la source