Problemy z wyświetlaniem statycznego bloku Magento 1.9.2.0

77

Mam witrynę z wieloma blokami statycznymi, która działała w wersji 1.9.1.0, ale w wersji 1.9.2.0 bloki statyczne zaczynają wyświetlać się sporadycznie, ponieważ czasami pokazują nieprawidłowy blok, a nie poprawny. Czasami wyświetlają się zgodnie z życzeniem. Czy ktoś wie, jak rozwiązać ten problem, który może być związany z tym problemem ?

wk
źródło
To brzmi nieproduktywnie i szalone. Jeśli masz lepsze wytłumaczenie, możemy ci pomóc, ale nie widzę wyjścia, przepraszam.
Fabian Blechschmidt
2
Mogę to potwierdzić. Spotkałem go w jednym sklepie. Klucze pamięci podręcznej są identyczne między 2 blokami
Sander Mangel
8
Istnieje otwarty błąd dla tego magentocommerce.com/bug-tracking/issue/index/id/870
Steve Robbins
9
Według Piotra jest to teraz potwierdzony błąd, nad którym bada zespół główny Magento.
zyskuje
1
Ten błąd jest nadal widoczny w wersji 1.9.2.4. Dodano scenariusz / szczegóły do komentarzy modułu śledzenia błędów .
zigojacko,

Odpowiedzi:

61

Miałem ten problem z EE 1.14.2 i wygląda na to, że ten sam problem pojawił się w CE 1.9.2. Udokumentowałem mój problem i rozwiązanie w tym pytaniu dotyczącym SE .

Zasadniczo z powodu dodania następującego kodu do konstruktora Mage_Cms_Block_Block:

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

Bloki statyczne CMS są teraz buforowane. Problem wynika ze sposobu generowania informacji o kluczu pamięci podręcznej. Powoduje to Mage_Core_Block_Abstractzachowanie przy użyciu nazwy bloków w układzie. Jeśli blok nie został dodany z układem, np. Na stronie cms, ta nazwa nie istnieje. Może to spowodować, że statyczne bloki współużytkują ten sam klucz pamięci podręcznej i ulegną pomieszaniu w pamięci podręcznej.

Moim rozwiązaniem było zastąpienie Mage_Cms_Block_Blockklasy i ustawienie informacji o kluczu pamięci podręcznej na podstawie identyfikatora bloku i bieżącego sklepu.

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

Oczywiście należy to dodać we własnym module z config.xmlzastąpieniem pliku i bloku itp. Alternatywnie możesz skopiować Mage_Cms_Block_Blockdo lokalnej puli kodów i dodać tam klucz pamięci podręcznej.

Możesz zobaczyć nowe linie dodane w 1.9.2 tutaj

Andrew Kett
źródło
Jak tworzysz te statyczne bloki? Jeśli zrobisz to za pomocą xml układu, możesz po prostu dodać unikalną nazwę do swojego bloku i powinien dobrze buforować. W którym scenariuszu nie nadałbyś nazwy swojemu blokowi (być może widżetów?)
Erfan
1
@Erfan Ten problem występuje podczas dodawania bloków do stron CMS takich jak ten {{block type = "cms / block" block_id = "block_id"}} lub podczas ładowania bloku statycznego bezpośrednio do szablonu
Andrew Kett
6
tutaj jest bezpłatne rozszerzenie tego dziwnego problemu. Mam nadzieję, że przyniesie to korzyści każdemu, kto napotka ten problem. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy
@Rajeev Z którymi wersjami Magento jest kompatybilny? Czy będzie również działał poprawnie z Mage 1.6.x?
zitix
1
Stworzyłem sens tymczasowego rozwiązania na podstawie odpowiedzi andrewkett. Wystarczy dodać tę aplikację / code / local / Mage / Cms / Block / Block.php do katalogu Magento, a problem zostanie rozwiązany. Pamiętaj tylko, aby usunąć plik przed wykonaniem następnej aktualizacji Magento (zakładając, że obejmują one poprawkę w następnej aktualizacji).
Jay El-Kaake
13

Właśnie zaktualizowałem do wersji 1.9.2.0 i również tego doświadczam. Kategorie ustawione do wyświetlania bloków statycznych + Produkty losowo wyświetlają nieprawidłowy blok statyczny. Nie istniało to przed moją aktualizacją 1.9.2.0.

Tymczasowa poprawka Wyłącz blokowanie wyjściowej pamięci podręcznej HTML, a wyświetlane bloki są prawidłowe.

studio2f
źródło
Stoję w obliczu tego również na stronie głównej i na stronach produktów
wk
To działa na razie, ale powinno być gorzkim rozwiązaniem
wk
Tak, na razie to zrobiłem.
Sharif
13

Tutaj idziemy z rozwiązaniem opartym na module lokalnym, ponieważ powyższe rozwiązanie nie zapewnia całych kroków. Musimy stworzyć moduł niestandardowy, 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, możesz odwiedzić poniższy link, a także pobrać z niego https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html

Bhupendra Jadeja
źródło
Skonfiguruj moduł i to nie pomogło - moim problemem jest to, że bloki CMS przypisane do kategorii znikają, w ogóle się nie pokazują.
Haim,
@Haim, jeśli używasz 1.9.2.2, musisz dokonać wpisu w System-> pozwolenie -> blok cms tego konkretnego bloku
Bhupendra Jadeja
używam Magento ver. 1.9.2.0 - ale znowu mój problem jest nieco inny, ustawiam blok CMS, aby wyświetlał się na stronie kategorii, a blok CMS po prostu się nie wyświetla - jeśli odświeżę pamięć podręczną, którą pokazuje, aż do następnego zniknięcia
Haim
Sugeruję, aby zaktualizować wersję Magento, myślę, że już była.
Bhupendra Jadeja
7

Nie ma na to oficjalnej łatki, jednak została rozwiązana w 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;
>     }

Uwaga: zgłoszono, że nadal występują problemy ze stronami CMS w wielu widokach sklepu:

Magento CE 1.9.2.1 naprawia to tylko częściowo.

Problem nadal występuje w przypadku stron CMS w wielu widokach sklepu. Oto zaktualizowana poprawka (uwaga: nie jest to oficjalna łatka): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

Źródło: http://www.magentocommerce.com/products/bug-tracking/issue/index/id/870

Steve Robbins
źródło
4

Mogę również potwierdzić ten problem.

Powielać:

  1. Za pomocą przycisku CMS -> Widgetsutwórz widżet, aby dodać blok statyczny do lewego paska bocznego.

  2. Następnie utwórz drugi widget, aby dodać drugi blok statyczny (inny blok niż w step 1) do lewego paska bocznego.

  3. Jeśli bufor jest wyłączony, oba statyczne bloki są poprawnie wyświetlane na pasku bocznym.

  4. Ale jeśli włączysz bufor, zobaczysz blok statyczny z step 1 wyświetlanego dwukrotnie.

zitix
źródło
Cześć, Zitix. Mam do czynienia z tym samym problemem. Możesz mi powiedzieć, jak to rozwiązać
Jaimin,
3

Piotr z Magento opublikował na razie nieoficjalną łatkę do tego wydania: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

Wydaje się, że załatwi sprawę. Tak, edytuje rdzeń, ale rozwiązuje problem, dopóki Magento nie wyda oficjalnej łaty lub następnej wersji ...

Rob Mangiafico
źródło
Ta sztuczka jest używana w nowszej wersji 1.9.3.3. jednak to nie rozwiązuje mojego problemu.
Rebelianci
3

Zaktualizuj Magento do 1.9.2.1

Zrobiłem to i włączyłem pamięć podręczną dla danych wyjściowych Blocks HTML i wydaje się, że jest to naprawione.

Jak również niektóre problemy bezpieczeństwa zostały rozwiązane w nowej wersji.

Sharif
źródło
3

W najnowszej wersji Magento rozszerza ją o nowe funkcje bezpieczeństwa. możesz dodać uprawnienia w systemie-> uprawnienia do bloku statycznego.

użytkownik32751
źródło
2
w magento 1.9.2.0 występuje problem z buforowaniem bloku statycznego, mówisz o czymś innym.
wk
Fajnie, nie byłem świadomy tej funkcji
amit_game
Lubię to. :)
zed Blackbeard
2

Miałem ten sam problem z moim sklepem. Najlepszym obejściem, jakie do tej pory odkryłem, jest wyłączenie buforowania dotkniętych bloków. Możesz to zrobić, ustawiając czas życia pamięci podręcznej bloków na null.

Globalne wyłączenie pamięci podręcznej „Blokuje wyjście HTML” w aktywnej witrynie nie jest dobrym pomysłem, ponieważ niepotrzebnie wpływa na wydajność witryny.

Wyłączanie pamięci podręcznej dla jednego bloku w xml:

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

Wyłączanie pamięci podręcznej dla jednego bloku w php:

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

Nie ustawiaj czasu życia pamięci podręcznej na „0”, jak wskazano w tym artykule

Andreas Riedmüller
źródło
Andreas - Jestem ciekawy, jaki jest wpływ zastosowania techniki opisanej w tym artykule i w jaki sposób dwie przedstawione tu alternatywy unikają przedstawionych przez ciebie negatywnych konsekwencji?
Bryan „BJ” Hoffpauir Jr.
1
pierwsze podejście nie zadziała, ponieważ magento zinterpretuje tę aktualizację układu, podobnie jak ta $block->setCacheLifeTime("null");Uwaga NULL i „null” to dwie różne rzeczy (później jedna jest ciągiem) i dlatego oczekiwany wynik nie zostanie uzyskany.
Rajeev K Tomy
1
@BJ Hoffpauir: Jeśli pamięć podręczna dla bloku cms / bloku jest aktywowana, te same buforowane cms / bloku będą używane dla wszystkich widoków sklepu. Jeśli masz wersję angielską (widok sklepu) i niemiecką (widok sklepu) dla tego samego identyfikatora bloku, dla obu widoków sklepu zostanie użyta wersja angielska lub niemiecka. Wyłączenie pamięci podręcznej dla tego bloku rozwiązuje problem. Jeśli nadal chcesz buforować blok, możesz to zrobić, umieszczając blok w innym bloku i zamiast tego buforuj ten blok.
Andreas Riedmüller,
1
@Rajeev Dzięki, znalazłem tę metodę w kilku postach, ale jestem pewien, że masz rację. Zmieniłem metodę, aby wyłączyć pamięć podręczną w xml. Poprzednia metoda była tutaj akceptowaną odpowiedzią: stackoverflow.com/questions/27684236/…
Andreas Riedmüller
2

Udało mi się rozwiązać ten problem, aktualizując istniejące rozszerzenia w Magento Connection Manager. Po przyjrzeniu się temu miałem wrażenie, że problem istnieje w systemie buforowania Magento.

Domyślnie Magento ma kilka pakietów związanych z technologiami buforowania. Obejmują one adaptery i biblioteki dla Zend i Redis.

Zamiast próbować znaleźć odpowiedni pakiet, zdecydowałem się zaktualizować wszystkie pakiety w mojej instalacji.

Następnie wybrałem znacznik wyboru: Mage_All_Latest Który jest metapakietem dla najnowszej stabilnej wersji Magento 1.9.0.0.

Problem może być rozwiązany poprzez aktualizację tylko odpowiednich pakietów. Czułem, że to była lepsza droga, ponieważ podejrzewam, że ta metoda stosuje również poprawki bezpieczeństwa.

Kawa123
źródło
1

Będziesz musiał wykonać pełną aktualizację lub backport 1.9.2.0

Zmiany pamięci podręcznej bloków i widżetów CMS w 1.9.2.1

magento-1921 / app / code / core / Mage / Cms / Block / 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 / Block / 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;
Fiasco Labs
źródło
0

Korzystam z Magento 1.9.3.8 i problem nadal występuje.

Możesz znaleźć moją poprawkę tutaj :

Zasadniczo dodam unikalny ciąg znaków na podstawie adresu URL strony i blockId do informacji o każdym kluczu pamięci podręcznej, więc każdy blok będzie miał unikalny klucz:

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

Dopóki Magento nie przygotuje poprawki dla tego problemu, możesz utworzyć plik:

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

i wstaw kod z powyższego adresu URL github jako treść.

Ten kod jest testowany dla Magento 1.9.2. * I 1.9.3. *

Pascut
źródło
-1

Jest to potwierdzony błąd w wersji 1.9.2, na razie możesz rozwiązać ten problem, po prostu wyłączając pamięć podręczną „Blokuje wyjście HTML” z poziomu admin -> sekcja zarządzania pamięcią podręczną

Mam nadzieję, że to pomoże

7ochem
źródło
studio2f wspomniało o twojej odpowiedzi, możesz użyć @andrewkett lub kliknąć „ten problem” w głównym pytaniu, to też ci pomoże
wk
2
Powiedziałbym, że wyłączenie całego buforowania bloków w celu rozwiązania problemu, który objawia się tylko na niektórych konkretnych blokach, przypomina trochę odrąbanie całej dłoni, jeśli na palcu pojawi się odmrożenie. Odcięcie palca, choć również nieprzyjemne, byłoby przynajmniej bardziej proporcjonalną reakcją na chorobę. Odpowiedź Andrewkett ( magento.stackexchange.com/users/527/andrewkett ) jest bardziej rozsądnym podejściem: magento.stackexchange.com/questions/73685/…
Bryan „BJ” Hoffpauir Jr.
Nigdy nie edytuj ani nie zmieniaj klas CORE.
Ahsan Horani