Mam problem, który wydaje się być związany z buforowaniem bloków statycznych CMS.
Mam stronę cms i na tej stronie renderuję kilka bloków statycznych cms. Uproszczona wersja zawartości strony CMS wygląda następująco:
<div class="cms-block-1">{{block type="cms/block" block_id="banner_home"}}</div>
<div class="cms-block-2">{{block type="cms/block" block_id="promo_home_1_1"}}</div>
<div class="cms-block-3">{{block type="cms/block" block_id="promo_home_1_2"}}</div>
<div class="cms-block-4">{{block type="cms/block" block_id="promo_home_2_1"}}</div>
<div class="cms-block-5">{{block type="cms/block" block_id="promo_home_2_2"}}</div>
<div class="cms-block-6">{{block type="cms/block" block_id="promo_home_2_3"}}</div>
<div class="cms-block-7">{{block type="cms/block" block_id="promo_home_3_1"}}</div>
<div class="cms-block-8">{{block type="cms/block" block_id="promo_home_3_2"}}</div>
Strona ładuje się zgodnie z oczekiwaniami natychmiast po wyczyszczeniu pamięci podręcznej bloków, strona wygląda mniej więcej tak:
<div class="cms-block-1">banner content</div>
<div class="cms-block-2">promo_home_1_1 content</div>
<div class="cms-block-3">promo_home_1_2 content</div>
<div class="cms-block-4">promo_home_2_1 content</div>
<div class="cms-block-5">promo_home_2_2 content</div>
<div class="cms-block-6">promo_home_2_3 content</div>
<div class="cms-block-7">promo_home_3_1 content</div>
<div class="cms-block-8">promo_home_3_1 content</div>
Jednak po początkowym załadowaniu strony każde kolejne ładowanie strony jest niepoprawne. To wygląda tak:
<div class="cms-block-1">banner content</div>
<div class="cms-block-2">promo_home_1_1 content</div>
<div class="cms-block-3">promo_home_1_2 content</div>
<div class="cms-block-4">promo_home_1_1 content</div>
<div class="cms-block-5">promo_home_1_2 content</div>
<div class="cms-block-6">promo_home_2_1 content</div>
<div class="cms-block-7">promo_home_2_2 content</div>
<div class="cms-block-8">promo_home_2_3 content</div>
W drugim przykładzie widać, że pierwsze dwa promocje są poprawne, jednak wszystko po tym wyświetla nieprawidłową treść dla block_id. Ponadto blok promo_home_1_1 i promo_home_1_2 są renderowane dwukrotnie, a promo_home_3_1 i promo_home_3_2 nigdy nie są renderowane. To tak, jakby mapowanie między block_id a powiązaną z nim statyczną zawartością bloku zostało w jakiś sposób pomieszane. Jest to związane z buforowaniem, ponieważ jeśli blokowanie pamięci podręcznej bloków nie jest włączone, to nie widzę już problemu.
Warto również zauważyć, że ta strona działała na EE 1.13, jednak po aktualizacji do EE 1.14.2 problem zaczął występować.
Zdaję sobie sprawę, że ciężko jest powiedzieć, co jest nie tak, nie wiedząc, co jeszcze dzieje się w systemie, ale mam nadzieję, że ktoś może dać mi przynajmniej trochę więcej wskazówek, ponieważ brakuje mi pomysłów.
Aktualizacja:
Próbowałem też tego z widżetami, np
<div class="cms-block-1">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="63"}}</div>
<div class="cms-block-2">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="64"}}</div>
<div class="cms-block-3">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="65"}}</div>
W tym przypadku wszystkie 3 bloki zwróciły tę samą treść, mimo że identyfikatory wskazują różne bloki w bazie danych. Po wyczyszczeniu pamięci podręcznej zwracany blok czasami się zmienia, ale wszystkie trzy widżety nadal będą miały tę samą zawartość.
źródło
Odpowiedzi:
Ok, więc znalazłem przyczynę tego problemu i wydaje się, że jest to problem w rdzeniu Magento.
W Magento 1.14.2 dodano nową metodę _construct do Mage_Cms_Block_Block, która zawiera następujący kod.
To skutecznie włącza buforowanie dla bloków cms. Klucz pamięci podręcznej nie jest ustawiony, więc wraca do Mage_Core_Block_Abstract :: getCacheKeyInfo, która używa nazwy bloku w układzie. W tym przypadku tak naprawdę nie używamy pliku xml układu, aby dodać blok i nie ma ustawionej nazwy. Magento wydaje się próbować sobie z tym poradzić, ustawiając coś takiego jak ANONYMOUS_78 jako nazwę. Jednak z jakiegoś powodu nie działa to w 100%, stąd duplikaty, które widziałem.
Moim rozwiązaniem było zastąpienie klasy Mage_Cms_Block_Block we własnym rozszerzeniu i dodanie nowej metody, aby ustawić klucz pamięci podręcznej jawnie na identyfikator bloku, a nie na przypisaną wartość. Klasa wygląda następująco:
Wydaje się, że to rozwiązało problem.
Aktualizacja:
Wygląda na to, że ten sam problem istnieje również w CE 1.9.2
źródło
Klienci Magento EE proszeni są o łatkę SUPEE-5874 od zespołu wsparcia Magento Enterprise.
Zaktualizuje dwa pliki
Nie mogę opublikować aktualnej łatki z Magento, ponieważ jest to ich własność.
źródło
Cieszy nas, że Magento teraz buforuje statyczne bloki. Ponieważ obecna zaktualizowana wersja zawiera ten dziwny problem z powodu buforowania bloków statycznych, możesz używać mojego modułu zupełnie za darmo.
To rozszerzenie jest tworzone w celu lepszego buforowania bloków statycznych. Bierze również pod uwagę, czy strona jest zabezpieczona, czy nie. Ponadto rozszerzenie nie ma żadnych podstawowych poprawek, co czyni ten moduł jeszcze lepszym.
Proszę bardzo .
Aby uzyskać lepszy przegląd rozszerzenia, możesz odnieść się do tego wątku .
źródło
Udostępniliśmy łatkę dla CE, która rozwiązuje ten problem. Ponieważ EE ma siedzibę w CE, może to również mieć zastosowanie.
Możesz pobrać tę ścieżkę z mojej treści: https://gist.github.com/tux-rampage/77b286f7973336877f7b
Załaduj zawartość, rozpakuj ją i uruchom następującą komendę w swoim katalogu głównym Magento:
Przetestuj to w środowisku testowym przed zastosowaniem go w systemie na żywo!
źródło