2011-11-14 4 views
8

Magento Enterprise 1.10.1.1을 사용하고 있으며 제품 페이지에서 일부 동적 컨텐츠를 가져와야합니다. 블록에 현재 시간을 삽입하여 작동하는지 빠르게 확인하지만 전체 페이지 캐시를 통과 할 수는 없습니다.Magento의 전체 페이지 캐시를 통해 구멍이 뚫린 동적 컨텐츠 가져 오기

나는 여기 구현의 다양한 시도 :

http://tweetorials.tumblr.com/post/10160075026/ee-full-page-cache-hole-punching http://oggettoweb.com/blog/customizations-compatible-magento-full-page-cache/ http://magentophp.blogspot.com/2011/02/magento-enterprise-full-page-caching.html

모든 솔루션, 생각, 의견, 조언을 환영합니다.

응용 프로그램/코드/지역/스누피/예/등/config.xml에

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Fido_Example> 
      <version>0.1.0</version> 
     </Fido_Example> 
    </modules> 
    <global> 
     <blocks> 
      <fido_example> 
       <class>Fido_Example_Block</class> 
      </fido_example>  
     </blocks> 
    </global> 
</config> 

응용 프로그램/코드/지역/스누피가/예/등/cache.xml : 여기

내 코드입니다

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <placeholders> 
     <fido_example> 
      <block>fido_example/view</block> 
      <name>example</name> 
      <placeholder>CACHE_TEST</placeholder> 
      <container>Fido_Example_Model_Container_Cachetest</container> 
      <cache_lifetime>86400</cache_lifetime> 
     </fido_example> 
    </placeholders> 
</config> 

응용 프로그램/코드/지역/스누피/예/차단/View.php

<?php 

class Fido_Example_Block_View extends Mage_Core_Block_Template 
{ 
    private $message; 
    private $att; 

    protected function createMessage($msg) { 
     $this->message = $msg; 
    } 

    public function receiveMessage() { 
     if($this->message != '') { 
      return $this->message; 
     } 
     else { 
      $this->createMessage('Hello World'); 
      return $this->message; 
     } 
    } 

    protected function _toHtml() { 
     $html = parent::_toHtml(); 

     if($this->att = $this->getMyCustom() && $this->getMyCustom() != '') { 
      $html .= '<br />'.$this->att; 
     } 
     else { 

     $now = date('m-d-Y h:i:s A'); 
     $html .= $now; 
     $html .= '<br />' ; 
     } 

     return $html; 
    } 

} 
,363,210

응용 프로그램/코드/지역/스누피/예/모델/컨테이너/Cachetest.php

<?php 

class Fido_Example_Model_Container_Cachetest extends Enterprise_PageCache_Model_Container_Abstract { 

    protected function _getCacheId() 
    { 
     return 'HOMEPAGE_PRODUCTS' . md5($this->_placeholder->getAttribute('cache_id') . $this->_getIdentifier()); 
    } 

    protected function _renderBlock() 
    { 
     $blockClass = $this->_placeholder->getAttribute('block'); 
     $template = $this->_placeholder->getAttribute('template'); 

     $block = new $blockClass; 
     $block->setTemplate($template); 
     return $block->toHtml(); 
    } 

protected function _saveCache($data, $id, $tags = array(), $lifetime = null) { return false; } 

} 

응용 프로그램/디자인/프론트 엔드/기업/[mytheme] /template/example/view.phtml

<?php echo $this->receiveMessage() ?> 
응용 프로그램/디자인/프론트 엔드/기업에서

조각은/[mytheme] /layout/catalog.xml

<reference name="content"> 
    <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml"> 
      <block type="fido_example/view" name="product.info.example" as="example" template="example/view.phtml" /> 
+1

'Fido_Example_Model_Container_Cachetest :: _ getIdentifier()'코드를 표시하지 않았습니다. [http://oggettoweb.com/blog/customizations-compatible-magento-full-page-cache/]를 철저히 읽으면 구멍 펀칭을 사용하는 블록의 출력도 캐싱된다는 것을 알 수 있습니다. [http://oggettoweb.com/blog/customizations-compatible-magento-full-page-cache/]의 예에서 각 고객별로 캐싱됩니다. '_getIdentifier()'에서'microtime()'또는 그와 비슷한 것을 반환하여 고유하게 만들 수 있습니다. 그러나이 아이디어가 좋은 것인지 잘 모르겠다. – Zyava

+0

조언을 주셔서 감사합니다 Zyava,하지만 그 트릭을하지 않았다 - 여전히 캐시지고. (btw, 실수로 Cachetest.php에서 제거했습니다. – rlflow

+0

md5 ($ this -> _ placeholder-> getAttribute ('cache_id'). $ this -> _ getIdentifier())'는 항상 새로운 값입니다. ? – Zyava

답변

15

cache.xml의 <name> 레이아웃 별칭이 아닌, 예를 들어, 귀하의 블록 전체 이름과 일치해야합니다 <name>product.info.example</name>

Enterprise_PageCache_Model_Container_Abstract에도 _getIdentifier()이 구현되어 있지 않으므로 _getCacheId()에서 반환 한 문자열에서 제거하십시오. 일부 변형을 추가해야하는 경우 _getIdentifier()을 구현하여 세션 ID 또는 필요한 것을 반환하십시오.

+0

Vinai - 트릭을했습니다. 정말 고마워요. – rlflow