Aktualizacja buforowania bloku EE 1.14.2 / CE 1.9.2 ma nieunikalne klucze pamięci podręcznej - zdublowana zawartość wyświetlana na interfejsie


18

Kiedy uaktualniłem do EE 1.14.2, większość rzeczy poszło gładko, ale natknąłem się na problem, kiedy zacząłem sprawdzać różne strony frontendowe. Mam węzeł katalogu z kilkoma podkategoriami, a każda z nich ma inny blok statyczny. Po uaktualnieniu, która strona została trafiona jako pierwsza po opróżnieniu pamięci podręcznej, pojawiłaby się na wszystkich różnych stronach.

Nie wiem, czy ten sam problem będzie występował po wydaniu CE 1.9.2, ale chciałem tu umieścić moje rozwiązanie dla tych, którzy mogą znaleźć ten sam problem.

AKTUALIZACJA: Jak potwierdzono tutaj, ten sam problem pojawił się w CE 1.9.2


Odpowiedzi:


11

Ponieważ była to EE, mogłem skorzystać ze wsparcia Magento, ale sam również opracowałem rozwiązania, aby pomóc w skupieniu się na problemie i jak najszybszym znalezieniu rozwiązania. Zmiany w kodzie zostały dostarczone przez Magento, więc zastosowanie ich do rzeczywistych plików aplikacji / kodu / rdzenia jest w porządku, chociaż zawsze można zduplikować pliki w / app / code / local i tam zastosować zmiany.

Problem polegał na tym, że metoda buforowania bloków dodana w 1.14.2 nie generowała unikatowego klucza pamięci podręcznej, więc gdy miałem wiele bloków używanych w obszarze kontrolera kategorii, wygenerowany klucz pamięci podręcznej okazał się unikalny tylko dla pierwszej strony, co powoduje, że wszystkie strony wyświetlają zduplikowane treści.

Rozwiązano problem polegający na dodaniu następujących elementów (wyświetlanych w formacie pliku różnicowego, aby pokazać kontekst otaczający dodatki - wystarczy dodać w wierszach +, gdzie powinny się znaleźć):

W app / code / core / Mage / Cms / Block / Block.php w linii 72:

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

W app / code / core / Mage / Cms / Block / Widget / Block.php w linii 82:

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

Nie sądzę, że jako jedyny widzę ten problem, a jeśli pojawi się w CE 1.9.2, mam nadzieję, że pomoże to rozwiązać niektóre osoby.


Niestety nie udało się go wprowadzić do wersji CE 1.9.2, która została wydana wczoraj, więc napotkałem ten problem na jednej z witryn naszych klientów po aktualizacji. Spróbuje tej poprawki.
Marco Miltenburg,

to nie działa dla mnie
Pixelomo

10

Myślę, że właściwym sposobem jest utworzenie niestandardowego modułu, ponieważ wszyscy wiecie, że Magento Boogieman cię dopadnie! jeśli zmień rdzeń :)

Konieczne będą następujące pliki: 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;
   }
}

Aby uzyskać więcej informacji, odwiedź następujący blog, a także możesz go pobrać https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


dlaczego nie spakujesz go do modułu z kompozytorem?
Aleksey Razbakov

Nie otrzymałem tak dużej odpowiedzi na ten post, więc pomyślałem, że żadne ciało nie chce tego w module
Bhupendra Jadeja

nikt jeszcze nie miał tego problemu. nikt jeszcze nie używa nowej wersji Magento. nie
użyłbym

Dodałem link do pobrania tego modułu
Bhupendra Jadeja

fajnie byłoby mieć to w githubie z modmanem i kompozytorem, takim jak github.com/progammer-rkt/Rkt_SbCache
Aleksey Razbakov

4

Jest jeszcze jeden problem z buforowaniem bloków CMS, który nie został rozwiązany przy danym kodzie z góry.

Jeśli korzystasz z bezpiecznych adresów URL i tagów {{media}} w swoich blokach CMS, otrzymasz od przeglądarki komunikat „Niebezpieczne ostrzeżenie o treści”, ponieważ Magento podaje niezabezpieczone linki z pamięci podręcznej.

Aby rozwiązać ten problem, musisz dodać jeszcze jeden znacznik informacji o pamięci podręcznej, as

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

1

Ten błąd można również naprawić za pomocą tego małego rozszerzenia (nie trzeba edytować podstawowych plików ani przepisywać bloków):

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

Zawiera także wiersz wspomniany przez @AdvancedLogic, aby uniknąć niebezpiecznego ostrzeżenia o treści:

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


to nie działało jakoś na 1 blok
Aleksey Razbakov

Dla którego bloku? Nie rozumiem, czy możesz być bardziej szczegółowy?
zitix

To tylko jeden blok statyczny. Nic konkretnego. Myślałem nawet, że to tylko losowy blok. Błąd HTML. Wyglądało na to, że użyto niewłaściwej pamięci podręcznej dla tego bloku. Nie wiem, jak być bardziej szczegółowym.
Aleksey Razbakov
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.