문제

나는 다음과 같은 양식을 포함하는 블록에 대해 블록 캐싱을 사용하는 것이 가장 좋은 방법이 있는지 궁금합니다. 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 하지만 불행히도 렌더링 된 블록이 캐시되기 직전에 이벤트가 존재하지 않으므로 코어에 새로운 이벤트를 도입하지 않고는"관찰자 만"솔루션이 불가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top