EE 1.14.2 / CE 1.9.2 blok önbellek güncellemesi benzersiz olmayan önbellek anahtarlarına sahiptir - ön uçta yinelenen içerik gösteriliyor


18

EE 1.14.2'ye yükselttiğimde, çoğu şey sorunsuz gitti, ancak çeşitli ön uç sayfalarımı kontrol etmeye başladığımda bir sorunla karşılaştım. Birkaç alt kategorileri olan bir katalog düğümü var ve her biri üzerinde gösterilen farklı bir statik blok var. Yeni sürüme geçişten sonra, bir önbellek sifonundan sonra ilk önce hangi sayfaya isabet edilirse, tüm farklı sayfalarda görünecektir.

CE 1.9.2 yayınlandığında aynı sorunun var olup olmayacağını bilmiyorum ama aynı sorunu bulabilecekler için çözümümü buraya koymak istedim.

GÜNCELLEME: As doğruladı burada aynı sorunu CE 1.9.2 gündeme geldiği


Yanıtlar:


11

Bu EE olduğu için Magento desteğinden yararlanabildim, ancak konuyu odaklamak ve mümkün olduğunca hızlı bir çözüm elde etmek için kendi başıma da çalıştım. Kod değişiklikleri Magento tarafından sağlanmıştır, bu nedenle onları gerçek uygulama / kod / çekirdek dosyalarına uygulamak iyidir, ancak / app / code / local dosyalarınızdaki dosyaları her zaman çoğaltabilir ve değişiklikleri oraya uygulayabilirsiniz.

Sorun, 1.14.2'de eklenen blok önbellekleme yönteminin benzersiz bir önbellek anahtarı üretmemesiydi, bu yüzden kategori denetleyicisi alanında birden fazla blok kullanıldığında, oluşturulan önbellek anahtarı yalnızca ilk sayfa isabeti için benzersizdi, tüm bu sayfaların yinelenen içerik göstermesine neden olur.

Düzeltme aşağıdakileri eklemekti (ekleri çevreleyen bağlamı göstermek için diff dosya biçiminde görüntülenir - sadece gitmeleri gereken + işaretli satırları ekleyin):

72. satırdaki app / code / core / Mage / Cms / Block / Block.php dosyasında:

         }
         return $html;
     }
+
+    /**
+     * Retrieve values of properties that unambiguously identify unique content
+     *
+     * @return array
+     */
+    public function getCacheKeyInfo()
+    {
+        $blockId = $this->getBlockId();
+        if ($blockId) {
+            $result = array(
+                $blockId,
+                Mage::app()->getStore()->getCode(),
+            );
+        } else {
+            $result = parent::getCacheKeyInfo();
+        }
+        return $result;
+    }
 }

82 numaralı satırdaki app / code / core / Mage / Cms / Block / Widget / Block.php dosyasında:

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

Bu sorunu gören tek kişi ben olacağımı düşünmüyorum ve eğer CE 1.9.2'de görünüyorsa, umarım bu bazı insanlar için çözülmesine yardımcı olacaktır.


Maalesef, dün yayınlanan CE 1.9.2'ye geçmedi, bu yüzden yükseltme işleminden sonra müşterilerimizin web sitelerinden birinde bu sorunla karşılaştım. Bu düzeltmeyi deneyeceğim.
Marco Miltenburg

bu benim için çalışmıyor
Pixelomo

10

Bence doğru yol Özel modül yaratmamız gerektiğidir çünkü hepiniz Magento Boogieman'ın sizi alacağını biliyorsunuz! eğer çekirdek değiştirmek :)

Aşağıdaki dosyaları kullanmanız gerekir: 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 aşağıdaki blogu ziyaret edebilir ve https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html adresinden de indirebilirsiniz.


neden bestecili bir modülde paketlemiyorsun?
Aleksey Razbakov

Ben bu yazıya bu kadar yanıt alamadım, bu yüzden hiçbir vücut modülde istemediğini düşündüm
Bhupendra Jadeja

henüz kimse bu problemi yaşamadı. henüz kimse yeni magento sürümünü kullanmıyor. Terebentin modülü ile ilgili sorunum olmasaydı da kullanmazdım
Aleksey Razbakov

Bu modülü indirmek için bağlantı ekledim
Bhupendra Jadeja


4

Yukarıdaki kod ile düzeltilmemiş CMS blokları önbelleğe alma ile ilgili bir sorun daha var.

CMS bloklarınızda güvenli URL'ler ve {{media}} etiketleri kullanıyorsanız, Magento önbellekten güvenli olmayan bağlantılar sunduğu için tarayıcıdan "Güvenli olmayan içerik uyarısı" mesajı alırsınız.

Çözmek için, bir önbellek bilgi etiketi daha eklemeniz gerekir.

(int)Mage::app()->getStore()->isCurrentlySecure(),

1

Bu hata ayrıca bu küçük uzantı ile düzeltilebilir (çekirdek dosyaları düzenlemenize veya blokları yeniden yazmanıza gerek yoktur):

https://github.com/progammer-rkt/Rkt_SbCache

Ayrıca, güvenli olmayan içerik uyarısından kaçınmak için @AdvancedLogic tarafından belirtilen satırı içerir:

(int)Mage::app()->getStore()->isCurrentlySecure()


bu bir şekilde 1 blok için işe yaramadı
Aleksey Razbakov

Hangi blok için? Anlamıyorum, daha spesifik olabilir misin lütfen?
zitix

Sadece bir statik blok. Spesifik bir şey yok. Hatta rastgele bir blok olduğunu düşündüm. Yanlış html vardı. Bu blok için yanlış önbellek kullanılmış gibi görünüyordu. Burada nasıl daha spesifik olacağımı bilmiyorum.
Aleksey Razbakov
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.