양식_키를 포함하는 캐시 블록(즉,동적 콘텐츠)
-
13-12-2019 - |
문제
나는 다음과 같은 양식을 포함하는 블록에 대해 블록 캐싱을 사용하는 것이 가장 좋은 방법이 있는지 궁금합니다. form_key
입력(토큰).
나는 전체 페이지 캐시 구멍 펀칭,하지만 젠토 세륨의 표준 블록 캐시에 대해 이야기하고 있지 않다.
일반적으로 말하는:동적 콘텐츠의 작은 부분이 있는 블록이나 캐시되지 않은 자식 블록을 캐시하려면 어떻게 해야 합니까?
해결책
이것이 내가 결국 그것을 해결 한 방법이며,문제의 블록에 다음과 같은 방법을 추가하십시오:
const FORM_KEY_PLACEHOLDER = '{{FORM_KEY}}';
protected function _toHtml()
{
return $this->_insertFormKeyPlaceholder(parent::_toHtml());
}
protected function _afterToHtml($html)
{
return $this->_restoreFormKey(parent::_afterToHtml($html));
}
protected function _insertFormKeyPlaceholder($html)
{
/** @var $session Mage_Core_Model_Session */
$session = Mage::getSingleton('core/session');
return str_replace($session->getFormKey(), self::FORM_KEY_PLACEHOLDER, $html);
}
protected function _restoreFormKey($html)
{
/** @var $session Mage_Core_Model_Session */
$session = Mage::getSingleton('core/session');
return str_replace(self::FORM_KEY_PLACEHOLDER, $session->getFormKey(), $html);
}
설명:
렌더링 된 블록이 캐시되기 전에 폼 키를 자리 표시 자로 바꾸고 블록이 캐시에서로드 된 후에 다시 현재 폼 키로 자리 표시 자를 바꿉니다.
내가 사용 _toHtml
이 메서드의 반환 값이 캐시에 즉시 기록되므로 자리 표시자를 삽입합니다.
내가 사용 _afterToHtml
이 메서드는 콘텐츠가 캐시에서 로드된 직후(또는 아직 캐시되지 않은 경우 캐시에 저장된 후)호출되므로 양식 키를 복원합니다.이 방법은 블록 캐시에 관계없이 호출 될 수 있습니다.
더 많은 토그
제네릭 솔루션은 아직 존재하지 않는 것 같지만 위에서 설명한 방법은 모든 동적 콘텐츠에 대해 작동하며 둘 이상의 블록 또는 다른 콘텐츠로 필요한 경우 자리 표시자 논리를 별도의 모델로 쉽게 추출할 수 있습니다.
자리 표시자를 바꾸기 위해 당신은 또한 core_block_abstract_to_html_after
하지만 불행히도 렌더링 된 블록이 캐시되기 직전에 이벤트가 존재하지 않으므로 코어에 새로운 이벤트를 도입하지 않고는"관찰자 만"솔루션이 불가능합니다.