Magento 1.9.2.0 statik blok görüntüleme sorunları


77

1.9.1.0'da çalışan birden çok statik bloğu olan bir web sitem var, ancak 1.9.2.0 ile statik bloklar bazen doğru bloğu değil yanlış bloğu gösterdikleri için düzensiz görüntülemeye başlar. Bazen istenildiği gibi görüntülenirler. Herkes ile ilgili olabilir bu sorunu çözmek için nasıl biliyor mu bu konuda ?


Bu tekrarlanamaz ve çılgınca geliyor. Daha iyi bir açıklamanız varsa, size yardımcı olabiliriz, ama bu yüzden bir yol göremiyorum, üzgünüm.
Fabian Blechschmidt,

2
Bunu onaylayabilirim. Bir dükkanda karşılaştı. Önbellek anahtarları 2 blok arasında aynıdır
Sander Mangel


9
Piotr'a göre, bu şimdi doğrulanmış bir hata ve Magento çekirdek ekibi tarafından araştırılıyor.
benmarks

1
Bu hata 1.9.2.4'te hala görülüyor. Hata izci yorumlarına senaryo / detaylar eklendi .
zigojacko

Yanıtlar:


61

EE 1.14.2 ile bu problemi yaşadım ve aynı mesele CE 1.9.2'de de ortaya çıktı. Bu SE sorusuna sorunumu ve çözümümü belgeledim .

Temel olarak, aşağıdaki kodun yapıcısına eklenmesinden dolayı Mage_Cms_Block_Block:

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

CMS statik blokları şimdi önbelleğe alındı. Sorun, önbellek anahtarı bilgisinin nasıl üretildiğinden kaynaklanır. Mage_Core_Block_AbstractBlok ismini mizanpajda kullanma davranışına geri döner . Blok mizanpajla eklenmemişse, örneğin bir cms sayfasında bu ad yoktur. Bu, aynı önbellek anahtarını paylaşan ve önbellekte karışık olan statik bloklara neden olabilir.

Benim çözümüm, Mage_Cms_Block_Blocksınıfı geçersiz kılmak ve blok kimliğine ve geçerli depoya göre önbellek anahtarı bilgisini ayarlamaktı.

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

Açıkçası bunun kendi modülünüzde bir config.xmldosya ve blok geçersiz kılma vb. İle eklenmesi gerekir . Alternatif Mage_Cms_Block_Blockolarak, yerel kod havuzuna kopyalayıp önbellek anahtarını oraya ekleyebilirsiniz.

Yeni hatlar 1.9.2 eklenen görebilirsiniz burada


Bu statik blokları nasıl başlatıyorsunuz? Xml mizanpajı üzerinden yaparsanız, bloğunuza benzersiz bir ad ekleyebilirsiniz, ancak önbelleğe alması gerekir. Hangi senaryoda bloğunuza bir isim vermezdiniz (belki widget'ler?)
Erfan

1
@Erfan Bu sorun, {{block type = "cms / block" blok_id = "block_id"}} gibi CMS sayfalarına bloklar eklerken veya doğrudan şablona statik bir blok yüklerken ortaya çıkar
Andrew Kett

6
işte bu garip problem için bedava bir eklenti. Umarım bu sorunla karşılaşan herkese faydası olur. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy

@Rajeev Hangi Magento sürümleriyle uyumludur? Mage 1.6.x ile de doğru çalışacak mı?
zitix

1
Andrewkett'in cevabından geçici bir çözüm için özü yarattım. Sadece Magento dizinine bu uygulamayı / kodu / yerel / Mage / Cms / Blok / Block.php ekleyin ve sorun çözülecektir. Bir sonraki Magento güncellemenizi yapmadan önce dosyayı kaldırmayı unutmayın (bir sonraki güncellemede düzeltmeyi içerdiklerini varsayalım).
Jay El-Kaake,

13

Sadece 1.9.2.0'a yükselttim ve bunu da yaşıyorum. Statik Bloklar + Ürünler gösterilecek şekilde ayarlanmış kategoriler rasgele yanlış Statik Bloğu gösteriyor. 1.9.2.0 güncellememden önce bu yoktu.

Geçici Düzeltme Blokları HTML çıkış önbelleğini devre dışı bırakın ve görüntülenen bloklar doğru.


Ben de ana sayfada ve ürün sayfalarında
hafta

Bu iş şu an için ama acı bir çözüm olmalı
hafta

Evet, şimdilik bunu yaptım.
Sharif

13

Burada yerel modül tabanlı çözüm ile devam ediyoruz, çünkü yukarıdaki çözüm tüm adımları sağlamıyor. Özel modül yaratmamız gerekiyor çünkü hepiniz Magento Boogieman'ın sizi alacağını biliyorsunuz! Çekirdeği değiştirirseniz :)

Dosyaları takip etmeniz gerekecek: 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;
   }
}

Daha fazla bilgi için linke aşağıdaki ziyaret edebilir ve aynı zamanda indirmek ondan https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


Modülün kurulumu ve yardımı olmadı - sorunum kategoriye atanan CMS bloklarının yok olması, hiç göstermemeleri.
Haim

@Haim 1.9.2.2 kullanıyorsanız, o zaman belirli bir bloğun Sistem-> izin -> cms bloğuna giriş yapmanız gerekir
Bhupendra Jadeja 21.06

Ben Magento ver kullanıyorum. 1.9.2.0 - ama yine sorunum biraz farklı, kategori sayfasında gösterilecek bir CMS bloğu belirledim ve CMS bloğu görünmüyor - eğer bir dahaki sefere görünene kadar gösterdiği önbelleği yenilediğimde
Haim

Magento sürümünü güncellemenizi öneririm, sanırım şimdi oldu.
Bhupendra Jadeja

7

Bunun için resmi bir yama yok, ancak CE 1.9.2.1'de çözüldü.

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

Not: Birden fazla mağaza görünümünde CMS sayfalarında hala sorun olduğu bildirilmiştir:

Magento CE 1.9.2.1 bunu yalnızca kısmen düzeltir.

Sorun, CMS Sayfaları için birden fazla mağaza görünümünde hala devam etmektedir. İşte Güncelleme Düzeltme (Bu resmi bir yama olmadığını unutmayın): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

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



4

Ben de bu sorunu doğrulayabilirim.

Yeniden üretmek:

  1. Kullanarak, CMS -> Widgetssol kenar çubuğuna statik bir blok eklemek için bir widget oluşturun.

  2. Ardından step 1sol kenar çubuğuna ikinci statik bloğu (içeriden farklı blok ) eklemek için ikinci pencere öğesi oluşturun .

  3. Önbellek devre dışı bırakılırsa, her iki statik blok da kenar çubuğunda doğru şekilde görüntülenir.

  4. Ancak önbelleği etkinleştirirseniz, statik bloğun step 1 iki kez görüntülendiğini göreceksiniz .


Selam Zitix Seninle aynı sorunla karşı karşıyayım, bunu nasıl
çözdüğünü


3

Magento’yu 1.9.2.1’e yükseltin

Yaptım ve Blocks HTML çıktısı için önbelleği etkinleştirdim ve düzeltilmiş görünüyor.

Yeni sürümde bazı güvenlik sorunlarının yanı sıra ele alınmaktadır.


3

Magento'nun en yeni sürümünde yeni güvenlik özellikleriyle zenginleştiriyor. statik bloğa sistem-> izinlerinde izinler ekleyebilirsiniz.


2
1.9.2.0 magento da statik bloğu önbelleğe almakta bir sorun var, farklı bir şeyden bahsediyorsunuz.
haftalık

Güzel, bu özellik farkında değildi
amit_game

Bunu severim. :)
zed Blackbeard

2

Mağazamda da aynı sorunu yaşadım. Şimdiye kadar bulduğum en iyi geçici çözüm, etkilenen bloklar için önbelleğe almayı devre dışı bırakmak. Bunu, blokların önbellek ömrünü null olarak ayarlayarak yapabilirsiniz.

Canlı bir sitedeki "Blok HTML çıktısı" önbelleğini küresel olarak devre dışı bırakmak, gereksiz yere site performansını etkilediği için iyi bir fikir değildir.

Xml'deki bir blok önbelleğin devre dışı bırakılması:

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

PHP için bir blok önbelleği devre dışı bırakmak:

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

Bu makalede belirtildiği gibi önbellek ömrünü "0" olarak ayarlamayın


Andreas - Bu makalede anlatılan tekniği kullanmanın etkisinin ne olduğunu ve burada verdiğiniz iki alternatifi ana hatlarıyla verdiğiniz olumsuz sonuçlardan nasıl koruyacağınızı merak ediyorum.
Bryan 'BJ' Hoffpauir Jr.

1
ilk yaklaşım işe yaramayacak çünkü magento mizanpaj güncellemesini bu $block->setCacheLifeTime("null");Not gibi yorumlayacak NULL ve "null" iki farklı şey (daha sonra bir dizedir) ve dolayısıyla beklenen sonuç elde edilemeyecek.
Rajeev K Tomy

1
@BJ Hoffpauir: Bir cms / blok bloğunun önbelleği etkinleştirilirse, tüm önbellek görünümlerinde aynı önbelleklenen cms / blok kullanılır. Aynı blok tanımlayıcısı için ingilizce (mağaza görünümü) ve almanca (mağaza görünümü) sürümünüz varsa, hem ingilizce hem de almanca her iki mağaza görünümünde de kullanılacaktır. Bu blok için önbelleği devre dışı bırakmak sorunu çözer. Hala bloğu önbelleğe almak istiyorsanız, bunu bloğu başka bir bloğa koyarak ve bu bloğu önbelleğe alarak yapabilirsiniz.
Andreas Riedmüller

1
@Rajeev Teşekkürler, bu yöntemi birkaç mesajda buldum, ancak haklı olduğunuza eminim. Xml önbelleğini devre dışı bırakmak için yöntemi değiştirdim. Ancak önceki yöntem burada kabul edilmiş bir cevaptı: stackoverflow.com/questions/27684236/…
Andreas Riedmüller

2

Magento Bağlantı Yöneticisi'ndeki mevcut uzantıları güncelleyerek bu sorunu çözebildim. Bunu inceledikten sonra, sorunun Magento önbellek sisteminde var olduğu izlenimini edindim.

Varsayılan olarak, Magento'nun önbellekleme teknolojilerine ilişkin birkaç paketi vardır. Zend ve Redis için uyarlayıcılar ve kütüphaneler içerirler.

Uygun paketi bulmaya çalışmak yerine, kurulumumdaki tüm paketleri güncellemeyi seçtim.

Sonra onay işaretini seçtim: Mage_All_Latest En son kararlı Magento 1.9.0.0 sürümü için bir Metapackage.

Yalnızca doğru paketleri yükselterek sorunu çözmek mümkün olabilir. Bunun daha iyi bir yol olduğunu hissettim, çünkü bu yöntemin güvenlik yamaları uyguladığı konusunda şüpheliyim.


1

Tam bir yükseltme yapmanız gerekecek veya 1.9.2.0

CMS Blok ve Widget önbelleğe alma 1.9.2.1’deki değişiklikler

magento-1921 / uygulama / kod / çekirdek / Mage / Cms / Blok / 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 / uygulama / kod / çekirdek / Mage / Cms / Blok / Araç / 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

Magento 1.9.3.8 kullanıyorum ve sorun hala var.

Düzeltmemi burada bulabilirsiniz :

Temel olarak her önbellek anahtarı bilgisine sayfa url ve blockId değerlerine dayalı benzersiz bir dize ekliyorum, böylece her bloğun benzersiz bir anahtarı olacak:

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

Magento bu konuda bir düzeltme hazırlayana kadar dosyayı oluşturabilirsiniz:

Uygulamanın / kod / yerel / Büyücü / Cms / Blok / Block.php

ve yukarıdaki github url'den kodu içerik olarak ekleyin.

Bu kod Magento 1.9.2. * Ve 1.9.3. * İçin test edilmiştir.


-1

Bu 1.9.2 sürümünde hata teyit edildi, çünkü bu sorunu yalnızca "Blok HTML çıktısı" önbelleğini admin -> önbellek yönetimi bölümünden devre dışı bırakarak çözebilirsiniz.

Umarım yardımcı olur


studio2f u bu da u yardımcı olacaktır @andrewkett kullanmak veya ana söz konusu "Bu konuda" tıklayabilirsiniz thie cevabı söz vardı
haftalık

2
Tüm blok önbelleklemeyi, yalnızca belirli bir blokta kendini gösteren bir sorunu çözmek için devre dışı bırakmanın, bir parmağında donma geliştirirseniz, birinin elini tamamen kesmek gibi olduğunu söyleyebilirim. Parmağını kesmek, aynı zamanda tatsız olsa da, en azından hastalığa karşı daha orantılı bir tepki olacaktır. Andrewkett'in ( magento.stackexchange.com/users/527/andrewkett ) cevabı daha makul bir yaklaşımdır: magento.stackexchange.com/questions/73685/…
Bryan 'BJ' Hoffpauir Jr.

CORE sınıflarını asla düzenlemeyin veya değiştirmeyin.
Ahsan Horani 14:16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.