Problemi di visualizzazione del blocco statico Magento 1.9.2.0


77

Ho un sito Web con più blocchi statici che funzionava in 1.9.1.0, ma con 1.9.2.0 i blocchi statici iniziano a essere visualizzati sporadicamente, poiché a volte mostrano il blocco sbagliato anziché il blocco corretto. A volte vengono visualizzati come desiderato. Qualcuno sa come risolvere questo problema che potrebbe essere correlato a questo problema ?


Sembra irripetibile e folle. Se hai una spiegazione migliore, potremmo aiutarti, ma quindi non vedo alcun modo, scusa.
Fabian Blechschmidt,

2
Posso confermare questo. L'ho incontrato in un negozio. Le chiavi della cache sono identiche tra i 2 blocchi
Sander Mangel


9
Secondo Piotr, questo è un bug confermato e viene esaminato dal core team di Magento.
benmarks

1
Questo errore è ancora evidente in 1.9.2.4. Aggiunti scenario / dettagli ai commenti del localizzatore di bug .
Zigojacko,

Risposte:


61

Ho avuto questo problema con EE 1.14.2 e sembra che lo stesso problema si sia verificato in CE 1.9.2. Ho documentato il mio problema e la soluzione su questa domanda SE .

Fondamentalmente a causa del seguente codice aggiunto al costruttore di Mage_Cms_Block_Block:

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

I blocchi statici CMS sono ora memorizzati nella cache. Il problema sorge da come vengono generate le informazioni sulla chiave cache. Ritorna al Mage_Core_Block_Abstractcomportamento dell'uso del nome dei blocchi nel layout. Se il blocco non è stato aggiunto con layout, ad es. Su una pagina cms, questo nome non esiste. Ciò può comportare blocchi statici che condividono la stessa chiave cache e si confondono nella cache.

La mia soluzione era quella di sovrascrivere la Mage_Cms_Block_Blockclasse e impostare le informazioni sulla chiave cache in base all'ID blocco e all'archivio corrente.

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

Ovviamente questo dovrebbe essere aggiunto nel proprio modulo con un config.xmlfile e blocco override ecc. In alternativa è possibile copiare Mage_Cms_Block_Blocknel pool di codici locale e aggiungere lì la chiave della cache.

Potete vedere le nuove linee aggiunti 1.9.2 qui


Come stai istanziando questi blocchi statici? Se lo fai attraverso il layout xml, puoi semplicemente aggiungere un nome univoco al tuo blocco e dovrebbe cache bene. In quale scenario non daresti un nome al tuo blocco (forse widget?)
Erfan,

1
@Erfan Questo problema si verifica quando si aggiungono blocchi alle pagine CMS come questo {{block type = "cms / block" block_id = "block_id"}} o quando si carica un blocco statico direttamente in un modello
Andrew Kett

6
ecco un'estensione gratuita per questo strano problema. Spero che vada a beneficio di tutti coloro che affrontano questo problema. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy

@Rajeev Con quali versioni di Magento è compatibile? Funzionerà anche correttamente con Mage 1.6.x?
zitix,

1
Ho creato un'idea per una soluzione temporanea dalla risposta di andrewkett. Aggiungi questa app / code / local / Mage / Cms / Block / Block.php alla tua directory Magento e il problema sarà risolto. Ricorda solo di rimuovere il file prima di eseguire il tuo prossimo aggiornamento di Magento (supponendo che includano la correzione nel prossimo aggiornamento).
Jay El-Kaake,

13

Ho appena eseguito l'aggiornamento a 1.9.2.0 e sto vivendo anche questo. Le categorie impostate per visualizzare i blocchi statici + I prodotti visualizzano in modo casuale il blocco statico errato. Questo non esisteva prima del mio aggiornamento 1.9.2.0.

Correzione temporanea Disabilitare la cache di output HTML dei blocchi e i blocchi visualizzati sono corretti.


Lo sto affrontando anche nella home page e nelle pagine dei prodotti
settimana

Questo lavoro per ora, ma dovrebbe essere una soluzione amara
settimana

Sì, questo è quello che ho fatto per ora.
Sharif,

13

Qui andiamo con la soluzione basata su modulo locale poiché la soluzione sopra non fornisce passaggi interi. Dobbiamo creare un modulo personalizzato perché tutti sapete che Magento Boogieman ti conquisterà! se cambia il core :)

Sarà necessario i seguenti file: 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;
   }
}

Per ulteriori informazioni è possibile visitare il seguente link e anche scaricare da esso https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


Installa il modulo e non ha aiutato - il mio problema è che i blocchi CMS assegnati alla categoria scompaiono, non si mostrano affatto.
Haim

@Haim se stai usando 1.9.2.2 allora devi entrare nel sistema-> permesso -> blocco cms di quel particolare blocco
Bhupendra Jadeja

sto usando Magento ver. 1.9.2.0 - ma ancora una volta il mio problema è leggermente diverso, ho impostato un blocco CMS da mostrare in una pagina di categoria e il blocco CMS non mostra - se aggiorno la cache che mostra fino alla prossima volta che scompare
Haim

Ti suggerisco di aggiornare la versione di Magento, penso che sia stata adesso.
Bhupendra Jadeja,

7

Non esiste una patch ufficiale per questo, tuttavia, è stata risolta in 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;
>     }

Nota: è stato segnalato che ci sono ancora problemi con le pagine CMS in più viste dello store:

Magento CE 1.9.2.1 risolve questo problema solo parzialmente.

Il problema persiste ancora per le pagine CMS su più viste dello store. Ecco un aggiornamento rapido aggiornato (nota che questa non è una patch ufficiale): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

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



4

Posso confermare anche questo problema.

Per riprodurre:

  1. Usando il CMS -> Widgets, creare un widget per aggiungere un blocco statico alla barra laterale di sinistra.

  2. Quindi creare un secondo widget per aggiungere il secondo blocco statico (blocco diverso rispetto a in step 1) alla barra laterale sinistra.

  3. Se la cache è disabilitata, entrambi i blocchi statici vengono visualizzati correttamente nella barra laterale.

  4. Ma se abiliti la cache, vedrai il blocco statico step 1 visualizzato due volte.


Ciao Zitix, ho di fronte lo stesso problema come puoi dirmi come lo risolvi
Jaimin,

3

Piotr di Magento ha pubblicato per il momento una patch non ufficiale per questo problema: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

Sembra fare il trucco. Sì, sta modificando il core, ma risolve il problema fino a quando Magento non rilascia la patch ufficiale o la prossima versione ...


Questo trucco è utilizzato nella versione più recente 1.9.3.3. tuttavia non risolve il mio problema.
Ribelle

3

Aggiorna Magento a 1.9.2.1

L'ho fatto e abilitato la cache per l'output HTML di Blocks e sembra essere stato risolto.

Oltre ad alcuni problemi di sicurezza vengono risolti nella nuova versione.


3

Nell'ultima versione di Magento lo migliora con nuove funzionalità di sicurezza. puoi aggiungere permessi nel sistema-> permessi al blocco statico.


2
in magento 1.9.2.0 c'è un problema nella memorizzazione nella cache del blocco statico, stai parlando di qualcosa di diverso.
settimana

Bene

Mi piace questo. :)
zed Barbanera,

2

Ho avuto lo stesso problema con il mio negozio. La soluzione migliore che ho scoperto finora è quella di disattivare la memorizzazione nella cache per i blocchi interessati. Puoi farlo impostando la durata della cache dei blocchi su null.

Disabilitare globalmente la cache "Blocca l'output HTML" su un sito live non è una buona idea in quanto influisce inutilmente sulle prestazioni del sito.

Disabilitare la cache per un blocco in xml:

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

Disabilitare la cache per un blocco in php:

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

Non impostare la durata della cache su "0" come indicato in questo articolo


Andreas - Sono curioso di sapere qual è l'impatto dell'utilizzo della tecnica descritta in quell'articolo e in che modo le due alternative che fornisci qui evitano le conseguenze negative che descrivi?
Bryan 'BJ' Hoffpauir Jr.

1
il primo approccio non funzionerà perché Magento interpreterà l'aggiornamento del layout come questa $block->setCacheLifeTime("null");Nota NULL e "null" sono due cose diverse (più avanti una è una stringa) e quindi il risultato atteso non otterrà.
Rajeev K Tomy,

1
@BJ Hoffpauir: se la cache per un blocco cms / block è attivata, lo stesso cms / blocco memorizzato nella cache verrà utilizzato per tutte le visualizzazioni del negozio. Se si dispone di una versione inglese (vista negozio) e tedesca (vista negozio) per lo stesso identificatore di blocco, per entrambe le viste negozio verrà utilizzata la versione inglese o quella tedesca. La disabilitazione della cache per questo blocco risolve il problema. Se vuoi ancora memorizzare nella cache il blocco, puoi farlo inserendo il blocco in un altro blocco e memorizzalo nella cache.
Andreas Riedmüller,

1
@Rajeev Grazie, ho trovato questo metodo in diversi post, ma sono abbastanza sicuro che tu abbia ragione. Ho cambiato il metodo per disabilitare la cache in XML. Il metodo precedente era una risposta accettata qui però: stackoverflow.com/questions/27684236/…
Andreas Riedmüller

2

Sono stato in grado di risolvere questo problema aggiornando le estensioni esistenti in Magento Connection Manager. Dopo averlo esaminato, avevo l'impressione che il problema esistesse nel sistema di memorizzazione nella cache di Magento.

Per impostazione predefinita Magento ha diversi pacchetti relativi alle sue tecnologie di memorizzazione nella cache. Includono adattatori e librerie per Zend e Redis.

Invece di provare a trovare il pacchetto appropriato, ho scelto di aggiornare tutti i pacchetti nella mia installazione.

Quindi ho scelto il segno di spunta su: Mage_All_Latest che è un metapacchetto per l'ultima versione stabile di Magento 1.9.0.0.

Potrebbe essere possibile risolvere il problema aggiornando solo i pacchetti giusti. Ho pensato che fosse il modo migliore di procedere perché sospetto che questo metodo applichi anche le patch di sicurezza.


1

Dovrai eseguire un aggiornamento completo o backport 1.9.2.0

Modifiche alla memorizzazione nella cache di CMS Block e Widget in 1.9.2.1

Magento-1921 / app / code / core / Mage / Cms / blocchi / 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 / blocchi / 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

Sto usando Magento 1.9.3.8 e il problema persiste.

Puoi trovare la mia soluzione qui :

Fondamentalmente sto aggiungendo una stringa univoca basata sull'URL della pagina e blockId a ogni informazione sulla chiave della cache, quindi ogni blocco avrà una chiave univoca:

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

Fino a quando Magento non preparerà una correzione per questo problema, è possibile creare il file:

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

e inserisci il codice dall'URL github sopra come contenuto.

Questo codice è testato per Magento 1.9.2. * E 1.9.3. *


-1

Questo è un bug confermato nella versione 1.9.2, per ora puoi risolvere questo problema semplicemente disabilitando la cache "Blocca output HTML" dall'amministratore -> sezione gestione cache

Spero che sia d'aiuto


studio2f ha menzionato la tua risposta, puoi usare @andrewkett o fare clic su "questo problema" nella domanda principale che ti aiuterà anche
wk

2
Direi che disabilitare tutta la cache dei blocchi per risolvere un problema che si manifesta solo su alcuni blocchi specifici è un po 'come tagliare tutta la mano se si sviluppa il congelamento su un dito. Tagliare il dito, anche se spiacevole, sarebbe almeno una risposta più proporzionata alla malattia. La risposta di Andrewkett ( magento.stackexchange.com/users/527/andrewkett ) è un approccio più ragionevole: magento.stackexchange.com/questions/73685/…
Bryan 'BJ' Hoffpauir Jr.

Non modificare o cambiare mai le classi CORE.
Ahsan Horani,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.