Question

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

J'ai une page CMS et dans 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 que le cache de bloc est effacé, cette page cherche quelque chose comme 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 la charge intale de la page, chaque charge ultérieure de la page est incorrecte. 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 corrects, mais tout après cela affiche le mauvais contenu du bloc_id. En outre, Block Promo_Home_1_1 et Promo_Home_1_2 sont à la fois rendus deux fois et Promo_Home_3_1 et Promo_Home_3_2 ne sont jamais rendus. C'est comme la mappage entre Block_ID et sa teneur en bloc statique associée est en quelque sorte mélangée. Ceci est lié à la mise en cache comme si le cache de bloc n'est pas activé, je ne vois plus le problème.

Aussi, il convient probablement de noter que cette page utilisait cependant de EE 1.13, toutefois après la mise à niveau vers EE 1.14.2, ce problème a commencé à se produire.

Je réalise que c'est assez difficile de dire ce qui va mal sans savoir quoi d'autre se passe dans le système mais j'espère que quelqu'un pourrait me donner au moins une autre direction ici que je manque d'idées.

mise à jour:

J'ai aussi essayé cela avec des widgets, E.g

<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, tous les 3 blocs ont renvoyé le même contenu, même si les ID indiquent à différents blocs dans la base de données. Lorsque le cache est effacé, le bloc retourné changera parfois, mais les trois widgets auront toujours le même contenu.

Était-ce utile?

La solution

OK, j'ai donc trouvé la cause de ce problème et il semble être un problème dans la magentaine de base.

Il y a une nouvelle méthode _Construction 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 met en mesure de mettre en cache efficacement les blocs de CMS. Aucune clé de cache n'est définie, il est donc revenu sur le MAGE_CORE_BLOCK_ABRACT :: 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 il n'y a pas de nom de nom. 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 consistait à remplacer la classe MAGE_CMS_BLOCK_BLOCK dans mon propre poste et ajoutez une nouvelle méthode pour définir explicitement la clé de cache sur l'ID de bloc plutôt qu'une valeur attribué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 ressemble à ce même problème aussi Existe en CE 1.9.2

Autres conseils

Pour les clients Magento EE, veuillez demander à Patch Supee-5874 de l'équipe de support de 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 poster le patch réel de Magento car il s'agit de leur propriété.

Il est heureux d'ici que Magento est maintenant en cache des blocs statiques aussi.Étant donné que la version actuelle améliorée inclut ce problème de Wierd en raison de la mise en cache des blocs statiques, vous pouvez utiliser mon module pour absolument gratuitement.

Cette extension est créée pour une meilleure mise en cache des blocs statiques.Il prend également en compte si 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 plus mieux.

ici vous allez .

Pour un meilleur aperçu de l'extension, vous pouvez Référez ce fil .

Nous avons fourni un patch pour CE, qui résout ce problème.Depuis que EE est basé sur CE, cela pourrait s'appliquer également.

Vous pouvez télécharger ce chemin de mon gist: https://gist.github.com/tux-Rampage / 77B286F79733368777F7B

Down Chargez le gist, déballez-le et exécutez la commande suivante dans votre racine Magento:

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

Testez ceci sur un environnement de stadification avant d'appliquer sur un système en direct!

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top