
Magento Enterprise: рдлреБрд▓ рдкреЗрдЬ рдХреИрд╢ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред
рдЬреЛ рд▓реЛрдЧ Magento рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдИ-рдХреЙрдорд░реНрд╕ рдЗрдВрдЬрди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреА рдХрд╛рдлреА рдорд╛рдВрдЧ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ "рддреНрд╡рд░рдХ" рдХреЗ рд╕рд╛рде рдЖрдП, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛, рд╢рд╛рдпрдж, рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдореИрдЧреЗрдВрдЯреЛ рдЗрдВрдЬрди рдкрд░ рдПрдХ рд╕реНрдЯреЛрд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ, Magento рдкреГрд╖реНрда рдХреЛ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реМрдВрдк рджреЗрдЧрд╛ред рдРрд╕реЗ "рддреНрд╡рд░рдХ" рдореЗрдВ рдХреИрд╢, рдЗрдВрдбреЗрдХреНрд╕, рд╕рдВрдХрд▓рди, рдЬреЗрдПрд╕ / рд╕реАрдПрд╕рдПрд╕ рдХреЛ рдПрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛, рдЖрджрд┐ рд╣реИрдВред
Magento Enterprise рдХреЗ рдореБрдЦреНрдп "рдЯреНрд░рд┐рдХ" рдореЗрдВ рд╕реЗ рдПрдХ рдлреБрд▓ рдкреЗрдЬ рдХреИрд╢ (рдЗрд╕рдХреЗ рдмрд╛рдж FPC) рд╣реИред рдпрд╣ "рдЯреНрд░рд┐рдХ" Enterprise_PageCache рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ Magento Enterprise рдкреИрдХреЗрдЬ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп рдореИрдЧреЗрдВрдЯреЛ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ: 1.13.1ред
рдПрдлрдкреАрд╕реА рдЖрдкрдХреЛ рдорд┐рд▓рд┐рд╕реЗрдХрдВрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЛ рдкреЗрдЬ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ред рдореИрдВрдиреЗ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рдж рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рд╕рдордп рдХрд╛ рдорд╛рдк рд▓рд┐рдпрд╛ рдерд╛ (рдЬрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ), рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:

- 65 рдПрдордПрд╕ рдПрдлрдкреАрд╕реА рд╕рдХреНрд╖рдо (рдЬрдм рд╕рднреА рдмреНрд▓реЙрдХ рдХреИрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВ) рдХреЗ рд╕рд╛рде;
- 1250 рдПрдордПрд╕ рдЬрдм рдПрдлрдкреАрд╕реА рдмрдВрдж рд╣реИ (рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреИрд╢ рд╕рдХреНрд╖рдо рд╣реИрдВ);
- рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреИрд╢ рдХреЗ рд╕рд╛рде 2500 рдПрдордПрд╕ рдЕрдХреНрд╖рдоред
рдЕрдВрддрд░ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
рдПрдлрдкреАрд╕реА рдХреИрд╢ рдХреНрдпрд╛ рдФрд░ рдХрдм рдХрд░рддрд╛ рд╣реИ
рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдлреБрд▓ рдкреЗрдЬ рдХреИрд╢ рдкреВрд░реЗ рдкреЗрдЬ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рднреА рдкреЗрдЬ рдХреИрд╢ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдХрдо рд╕реЗ рдХрдо рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рдЙрддреНрдкрд╛рдж рдкреГрд╖реНрда, рд╢реНрд░реЗрдгреА рдкреГрд╖реНрда, CMS рдкреГрд╖реНрда рдФрд░ 404 рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреГрд╖реНрда рдирд╣реАрдВ рдорд┐рд▓рд╛)ред рдЖрдк рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (config.xml) рдХреЛ рджреЗрдЦрдХрд░ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<frontend> <cache> <requests> <_no_route>enterprise_pagecache/processor_noroute</_no_route> <cms>enterprise_pagecache/processor_default</cms> <catalog> <category> <view>enterprise_pagecache/processor_category</view> </category> </catalog> <catalog> <product> <view>enterprise_pagecache/processor_product</view> </product> </catalog> </requests> </cache> </frontend>
рдлреНрд░рдВрдЯреЗрдВрдб / рдХреИрд╢ / рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдлреНрд░рдВрдЯрдиреЗрдо рдпрд╣рд╛рдБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЗрд╕рдХрд╛ рдорд╛рди рдкрде рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ: рдлреНрд░рдВрдЯреЗрдВрдб / рд░рд╛рдЙрдЯрд░ / рд░реВрдЯ_рдирд╛рдо / рдЖрд░реНрдЧреНрд╕ / рдлреНрд░рдВрдЯрдиреЗрдо), рдлрд┐рд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдФрд░ рдПрдХреНрд╢рди (рдХрдВрдЯреНрд░реЛрд▓рд░ рдФрд░ рдПрдХреНрд╢рди рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ)ред рдФрд░ рдкреНрд░реЗрд╖рд┐рдд рдореВрд▓реНрдп рдЕрдиреБрд░реЛрдз (рдЕрдиреБрд░реЛрдз) рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред
рдЖрдк рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / рдирд┐рдпрдВрддреНрд░рдХ / рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЙрд╕реА рддрд░рд╣ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ Enterprise_PageCache рдореЙрдбреНрдпреВрд▓ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реА рддрд░рд╣ рд╡рд╛рдВрдЫрд┐рдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
<frontend> <cache> <requests> <productinfo> <index>enterprise_pagecache/processor_default</index> </productinfo> </requests> </cache> </frontend>
рдРрд╕реА рдХрдИ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдЕрдВрддрд░реНрдЧрдд FPC рдкреГрд╖реНрдареЛрдВ рдХреЛ рдХреИрд╢ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HTTPS рдкреГрд╖реНрда, no_cache GET рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рдХреИрд╢ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред CanProcessRequest рдФрд░ Enterprise_PageCache_Model_Processor рд╡рд░реНрдЧ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ:
public function canProcessRequest(Zend_Controller_Request_Http $request) { $res = $this->isAllowed(); $res = $res && Mage::app()->useCache('full_page'); if ($request->getParam('no_cache')) { $res = false; } if ($res) { $maxDepth = Mage::getStoreConfig(self::XML_PATH_ALLOWED_DEPTH); $queryParams = $request->getQuery(); unset($queryParams[Enterprise_PageCache_Model_Cache::REQUEST_MESSAGE_GET_PARAM]); $res = count($queryParams)<=$maxDepth; } if ($res) { $multicurrency = Mage::getStoreConfig(self::XML_PATH_CACHE_MULTICURRENCY); if (!$multicurrency && !empty($_COOKIE['currency'])) { $res = false; } } return $res; }
public function isAllowed() { if (!$this->_requestId) { return false; } if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { return false; } if (isset($_COOKIE['NO_CACHE'])) { return false; } if (isset($_GET['no_cache'])) { return false; } if (isset($_GET[Mage_Core_Model_Session_Abstract::SESSION_ID_QUERY_PARAM])) { return false; } if (!Mage::app()->useCache('full_page')) { return false; } return true; }
FPC рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ?
рдпрджрд┐ рдкреГрд╖реНрда FPC рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХреИрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ FPC рдорд╛рдирдХ рдмреНрд▓реЙрдХ рдХреИрд╢ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред Enterprise_PageCache_Model_Observer рд╡рд░реНрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рдзрд┐ рджреЗрдЦреЗрдВ, рдЬреЛ рддрдм рдШрдЯрд┐рдд рд╣реЛрддреА рд╣реИ рдЬрдм рдШрдЯрдирд╛ (рдШрдЯрдирд╛) рдХрдВрдЯреНрд░реЛрд▓рд░_рдЕрдкреНрд░реЗрд╢рди_рдкреНрд░рджрд░реНрд╢рдиреА рдШрдЯрдирд╛ рдШрдЯрд┐рдд рд╣реЛрддреА рд╣реИ:
public function processPreDispatch(Varien_Event_Observer $observer) { if (!$this->isCacheEnabled()) { return $this; } $action = $observer->getEvent()->getControllerAction(); $request = $action->getRequest(); $noCache = $this->_getCookie()->get(Enterprise_PageCache_Model_Processor::NO_CACHE_COOKIE); if ($noCache) { Mage::getSingleton('catalog/session')->setParamsMemorizeDisabled(false); $this->_getCookie()->renew(Enterprise_PageCache_Model_Processor::NO_CACHE_COOKIE); } elseif ($action) { Mage::getSingleton('catalog/session')->setParamsMemorizeDisabled(true); } if ($this->_processor->canProcessRequest($request)) { Mage::app()->getCacheInstance()->banUse(Mage_Core_Block_Abstract::CACHE_GROUP); } $this->_getCookie()->updateCustomerCookies(); return $this; }
рдкреНрд░рддреНрдпреЗрдХ HTTP рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдПрдлрдкреАрд╕реА рдЕрдкрдирд╛ рдХреИрд╢ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╢ рдореЗрдВ рдкреЗрдЬ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреИрд╢ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдХрд╕реНрдЯрдо рдореАрдЯрд░ рдЕрдзрд┐рдХреГрдд рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдХрд┐рд╕ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдХрд┐рд╕ рд╕рдореВрд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЖрджрд┐ред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд╣рдЪрд╛рди рдХреИрд╕реЗ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝ рдХреЗ _createRequestIds рдкрджреНрдзрддрд┐ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рд╣реИред PageCache_Model_Processor рд╡рд░реНрдЧ:
protected function _createRequestIds() { $uri = $this->_getFullPageUrl();
рдПрдлрдкреАрд╕реА рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрджрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ cache.xml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Magento рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЛ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рдХрдВрдЯреЗрдирд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдХрдВрдЯреЗрдирд░ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ FPC рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛ (рдПрдХ FPC рдХреИрд╢ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗ рдЕрд▓рдЧ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг cache.xml рдлрд╝рд╛рдЗрд▓:
<?xml version="1.0" encoding="UTF-8"?> <config> <placeholders> <turnkeye_popup> <block>turnkeye_popup/popup</block> <placeholder>POPUP</placeholder> <container>Turnkeye_Popup_Model_PageCache_Container_Popup</container> <cache_lifetime>86400</cache_lifetime> </turnkeye_popup> </placeholders> </config>
рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
- рдмреНрд▓реЙрдХ - рдмреНрд▓реЙрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд░реНрдЧ
- рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ - рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдирд╛рдо
- рдХрдВрдЯреЗрдирд░ - рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд░реНрдЧ
- рдХреИрд╢_рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо - рдХреИрд╢ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо
рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдЬрдм FPC рд╕рдХреНрд╖рдо рд╣реЛрддреА рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдФрд░ рдХреИрд╢реНрдб рджреНрд╡рд╛рд░рд╛ рд▓рдкреЗрдЯреА рдЬрд╛рддреА рд╣реИ: рдЬрдм core_block_abameter_to_html_after рдШрдЯрдирд╛ рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Enterprise_ageCache_Model_Observer рд╡рд░реНрдЧ рдХреЗ рд░реЗрдВрдбрд░рдмреНрд▓реЙрдХрдкреНрд▓реЗрд╣реЛрд▓реНрдбрд░ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
public function renderBlockPlaceholder(Varien_Event_Observer $observer) { if (!$this->_isEnabled) { return $this; } $block = $observer->getEvent()->getBlock(); $transport = $observer->getEvent()->getTransport(); $placeholder = $this->_config->getBlockPlaceholder($block); if ($transport && $placeholder && !$block->getSkipRenderTag()) { $blockHtml = $transport->getHtml(); $request = Mage::app()->getFrontController()->getRequest(); $processor = $this->_processor->getRequestProcessor($request); if ($processor && $processor->allowCache($request)) { $container = $placeholder->getContainerClass(); if ($container && !Mage::getIsDeveloperMode()) { $container = new $container($placeholder); $container->setProcessor(Mage::getSingleton('enterprise_pagecache/processor')); $container->setPlaceholderBlock($block); $container->saveCache($blockHtml); } } $blockHtml = $placeholder->getStartTag() . $blockHtml . $placeholder->getEndTag(); $transport->setHtml($blockHtml); } return $this; }
рдпрд╣рд╛рдБ $ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ Enterprise_PageCache_Model_Config getBlockPlaceholder рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛:
public function getBlockPlaceholder($block) { $this->_initPlaceholders(); $type = $block->getType(); if (isset($this->_placeholders[$type])) { $placeholderData = false; foreach ($this->_placeholders[$type] as $placeholderInfo) { if (!empty($placeholderInfo['name'])) { if ($placeholderInfo['name'] == $block->getNameInLayout()) { $placeholderData = $placeholderInfo; } } else { $placeholderData = $placeholderInfo; } } if (!$placeholderData) { return false; } $placeholder = $placeholderData['code'] . ' container="' . $placeholderData['container'] . '"' . ' block="' . get_class($block) . '"'; $placeholder.= ' cache_id="' . $block->getCacheKey() . '"'; if (!empty($placeholderData['cache_lifetime'])) { $placeholder .= ' cache_lifetime="' . $placeholderData['cache_lifetime'] . '"'; } foreach ($block->getCacheKeyInfo() as $k => $v) { if (is_string($k) && !empty($k)) { $placeholder .= ' ' . $k . '="' . $v . '"'; } } $placeholder = Mage::getModel('enterprise_pagecache/container_placeholder', $placeholder); return $placeholder; } return false; }
Enterprise_PageCache_Model_Container_Placeholder рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛:
public function __construct($definition) { if ($definition && array_key_exists($definition, self::$_definitionMap)) { $definition = self::$_definitionMap[$definition]; } $this->_definition = $definition; $definition = explode(' ', $definition); $this->_name = $definition[0]; $count = count($definition); if ($count>1) { for ($i=1; $i_attributes[$info[0]] = isset($info[1]) ? trim($info[1], '"\'') : null; } } }
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдХрдВрдЯреЗрдирд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЧреЗрдЯрдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреНрд▓реЙрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛:
public function getAttribute($code) { return isset($this->_attributes[$code]) ? $this->_attributes[$code] : null; }
рд╕рд╛рдордЧреНрд░реА рдмреНрд▓реЙрдХ рдореЗрдВ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рддрд░реАрдХреЗ:
protected function _getDefinitionHash() { $definition = $this->getDefinition(); $result = array_search($definition, self::$_definitionMap); if ($result === false) { $result = $this->getName() . '_' . md5($definition); self::$_definitionMap[$result] = $definition; } return $result; } public function getStartTag() { return '<!--{' . $this->_getDefinitionHash() . '}-->'; } public function getEndTag() { return '<!--/{' . $this->_getDefinitionHash() . '}-->'; }
рдмреНрд▓реЙрдХ рд╕рд╛рдордЧреНрд░реА рд▓рдкреЗрдЯрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
< !--{TOPMENU_21c7f778e21d072d331836703b6295f5}--> < div class="nav-container"> < ul id="nav"> < li class="level0 nav-1 first last level-top"> < a class="level-top" href="http://example.com/test-category.html"> < span>Test category</span> </a> </li> </ul> </div> < !--/{TOPMENU_21c7f778e21d072d331836703b6295f5}-->
рдЕрдиреБрд░реЛрдз рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХрдВрдЯреНрд░реЛрд▓рд░_рдлреНрд░рдВрдЯ_рд╕реЗрдВрдб_рд░рд╕реНрдкреЙрдиреНрд╕_рдмреЗрдлрд░реНрд╕ рдЗрд╡реЗрдВрдЯ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ_рдкреЗрдЬреЗрдЬ_рдореЙрдбрд▓_рдСрдмреНрдЬрд░реНрд╡рд░ рдХреНрд▓рд╛рд╕ рдХреА рдХреИрд╢ рд░реАрд╕реЗрдВрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдВрдЬрд╛рдо рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдХреИрд╢ рдореЗрдВ рдкреЗрдЬ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред CacheResponse рд╡рд┐рдзрд┐ рдХреЛрдб:
public function cacheResponse(Varien_Event_Observer $observer) { if (!$this->isCacheEnabled()) { return $this; } $frontController = $observer->getEvent()->getFront(); $request = $frontController->getRequest(); $response = $frontController->getResponse(); $this->_saveDesignException(); $this->_processor->processRequestResponse($request, $response); return $this; }
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╣рд╛рдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдкреНрд░рдХрд╛рд╢рд╛рддреНрдордХ рд╡рд┐рдзрд┐ рдкреВрд░реЗ рдкреГрд╖реНрда рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдореЗрдВ рд╕рд╣реЗрдЬрддреА рд╣реИ:
public function processRequestResponse(Zend_Controller_Request_Http $request, Zend_Controller_Response_Http $response ) {
рдпрд╣рд╛рдВ, рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдХреИрд╢ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмреНрд▓реЙрдХ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: $ рд╕рд╛рдордЧреНрд░реА = $ рдкреНрд░реЛрд╕реЗрд╕рд░-> рддреИрдпрд╛рд░рдХрдВрдЯреЗрдВрдЯ ($ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛); рддреИрдпрд╛рд░ рд╡рд┐рдзрд┐:
public function prepareContent(Zend_Controller_Response_Http $response) { return $this->replaceContentToPlaceholderReplacer($response->getBody()); }
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдирдХрдВрдЯрдкреВрд▓рд░ рдзрд╛рд░рдХрдкреБрд▓рд┐рд╕ рд╡рд┐рдзрд┐:
public function replaceContentToPlaceholderReplacer($content) { $placeholders = array(); preg_match_all( Enterprise_PageCache_Model_Container_Placeholder::HTML_NAME_PATTERN, $content, $placeholders, PREG_PATTERN_ORDER ); $placeholders = array_unique($placeholders[1]); try { foreach ($placeholders as $definition) { $this->_placeholder = Mage::getModel('enterprise_pagecache/container_placeholder', $definition); $content = preg_replace_callback($this->_placeholder->getPattern(), array($this, '_getPlaceholderReplacer'), $content); } $this->_placeholder = null; } catch (Exception $e) { $this->_placeholder = null; throw $e; } return $content; }
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреГрд╖реНрда рдХреИрд╢ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрдЬрд╛рдп рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ FPC рдЕрдкрдиреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдмрджрд▓реЗрдЧреА:
< !--{POPUP container="Turnkeye_Popup_Model_PageCache_Container_Popup" block="Turnkeye_Popup_Block_Popup" cache_id="c3b32091a1ebd3b276a8fd70496a8e6da20865d0" cache_lifetime="86400" template="turnkeye/popup/popup.phtml" handles="a:2:{i:0;s:15:"cms_index_index";i:1;s:8:"cms_page";}" customer_segment_ids="a:1:{i:0;i:0;}" popup_ids="a:1:{i:0;s:1:"1";}" excluded_popup_ids="a:1:{i:0;i:1;}"}-->
рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдпрд╣ рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛрдЧрд╛, рддреЛ Magento рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рдХреИрд╢ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдЧрд╛ (рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝_рдкреЗрдЬрдХреЙрдЪ_рдореЙрдбрд▓_рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд░реНрдЧ рдХрд╛ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рд╡рд┐рдзрд┐) рджреЗрдЦреЗрдВред рдпрджрд┐ рдХреИрд╢ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реЗрдВрдбрд░ рдореИрдЧреЗрдВрдЯреЛ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рдПрдлрдкреАрд╕реА рдирд╣реАрдВ рдерд╛) рдФрд░ рдлрд┐рд░ рдкреЗрдЬ рдХреИрд╢ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ред рдпрджрд┐ рдкреЗрдЬ рдХреИрд╢ рдореЗрдВ рд╣реИ, рддреЛ рдПрдлрдкреАрд╕реА рдЗрд╕ рдХреИрд╢ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред
_ProcessContent рдФрд░ _processContainers рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдХреЗ рддрд░реАрдХреЗ_рдкреЗрдЬ Cache_Model_Processor рд╡рд░реНрдЧ:
protected function _processContent($content) { $containers = $this->_processContainers($content); $isProcessed = empty($containers);
protected function _processContainers(&$content) { $placeholders = array(); preg_match_all( Enterprise_PageCache_Model_Container_Placeholder::HTML_NAME_PATTERN, $content, $placeholders, PREG_PATTERN_ORDER ); $placeholders = array_unique($placeholders[1]); $containers = array(); foreach ($placeholders as $definition) { $placeholder = new Enterprise_PageCache_Model_Container_Placeholder($definition); $container = $placeholder->getContainerClass(); if (!$container) { continue; } $container = new $container($placeholder); $container->setProcessor($this); if (!$container->applyWithoutApp($content)) { $containers[] = $container; } else { preg_match($placeholder->getPattern(), $content, $matches); if (array_key_exists(1,$matches)) { $containers = array_merge($this->_processContainers($matches[1]), $containers); $content = preg_replace($placeholder->getPattern(), str_replace('$', '\\$', $matches[1]), $content); } } } return $containers; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд╡реЗ рдмреНрд▓реЙрдХ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╣реИрдВ рд╡реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рдмрджрд▓реА рдЬрд╛рдПрдЧреАред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рддреЗ рдмреНрд▓реЙрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдкрд╣рд▓реЗ applyWithoutApp рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдХреИрд╢ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИред ApplicationWithoutApp рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, Enterprise_PageCache_Model_Container_Abstract рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░:
public function applyWithoutApp(&$content) { $cacheId = $this->_getCacheId(); if ($cacheId === false) { $this->_applyToContent($content, ''); return true; } $block = $this->_loadCache($cacheId); if ($block === false) { return false; } $block = Enterprise_PageCache_Helper_Url::replaceUenc($block); $this->_applyToContent($content, $block); return true; }
рдХреЛрдб рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдмреНрд▓реЙрдХ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдмреНрд▓реЙрдХ рдХреЗ рддрд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдВрдЯреЗрдирд░ рдХрд╛ рддрд░реАрдХрд╛ _getCacheId рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (applyWithoutApp рдЭреВрдареЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ), рддреЛ рдЗрд╕реЗ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝_рдкреЗрдЬрдХреЙрдЪ_рдореЙрдбрд▓_рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд░реНрдЧ рдХреЗ _processContent рд╡рд┐рдзрд┐ рджреЗрдЦреЗрдВ), рдФрд░ Magento рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (Mage :: app () рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрдиреБрд░реЛрдз рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд╕рд╛рде Enterprise_PageCache_RequestController рдирд┐рдпрдВрддреНрд░рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛ рдХреЛрдб:
public function processAction() { $processor = Mage::getSingleton('enterprise_pagecache/processor'); $content = Mage::registry('cached_page_content'); $containers = Mage::registry('cached_page_containers'); $cacheInstance = Enterprise_PageCache_Model_Cache::getCacheInstance(); foreach ($containers as $container) { $container->applyInApp($content); } $this->getResponse()->appendBody($content);
рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрдкрдЪрд╛рд░рд┐рдд рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП, applyInApp рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХреА рдЧрдИ рд╣реИ, рдЬрд┐рд╕реЗ рдмреНрд▓реЙрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред Enterprise_PageCache_Model_Container_Abstract рд╡рд░реНрдЧ рдХреЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП applyInApp рд╡рд┐рдзрд┐ рд╕рд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб:
public function applyInApp(&$content) { $blockContent = $this->_renderBlock(); if ($blockContent === false) { return false; } if (Mage::getStoreConfig(Enterprise_PageCache_Model_Processor::XML_PATH_CACHE_DEBUG)) { $debugBlock = new Enterprise_PageCache_Block_Debug(); $debugBlock->setDynamicBlockContent($blockContent); $debugBlock->setTags($this->_getPlaceHolderBlock()->getCacheTags()); $debugBlock->setType($this->_placeholder->getName()); $this->_applyToContent($content, $debugBlock->toHtml()); } else { $this->_applyToContent($content, $blockContent); } $subprocessor = $this->_processor->getSubprocessor(); if ($subprocessor) { $contentWithoutNestedBlocks = $subprocessor->replaceContentToPlaceholderReplacer($blockContent); $this->saveCache($contentWithoutNestedBlocks); } return true; }
рдпрд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рд╛рдордЧреНрд░реА рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдХреЗ _renderBlock рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ Enterprise_PageCache_Model_Container_Abstract рдореЗрдВ, рдпрд╣ рд╡рд┐рдзрд┐ рдЧрд▓рдд рд╣реИред рдХрд┐ рдпрд╣ рдмреНрд▓реЙрдХ рдХреА HTML рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓реМрдЯрд╛ рджреЗред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдХрдВрдЯреЗрдирд░ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП, рдкреЗрд░реЗрдВрдЯ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрддреНрдкрд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ: $ рдЙрддреНрдкрд╛рдж = рджрд╛рдирд╛ :: рд░рдЬрд┐рд╕реНрдЯреНрд░реА ('current_product'), рдпрд╛ рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдореВрд▓ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ: $ рдпрд╣-> getChild ('block_alias') -> setProduct ($ _ рдЙрддреНрдкрд╛рдж))ред
рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдПрдлрдкреАрд╕реА рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдиреЗ рдмрдЪрдд рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдмреНрд▓реЙрдХ рдХреЗ getCacheKeyInfo рдкрджреНрдзрддрд┐ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛рд░рд┐рдд рдХреА рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ FPC рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ _renderBlock рд╡рд┐рдзрд┐ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдореЗрдВ _getPlaceHolderBlock рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмреНрд▓реЙрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
protected function _getPlaceHolderBlock() { if (null === $this->_placeholderBlock) { $blockName = $this->_placeholder->getAttribute('block'); $this->_placeholderBlock = new $blockName; $this->_placeholderBlock->setTemplate($this->_placeholder->getAttribute('template')); $this->_placeholderBlock->setLayout(Mage::app()->getLayout()); $this->_placeholderBlock->setSkipRenderTag(true); } return $this->_placeholderBlock; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИред _RenderBlock рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
protected function _renderBlock() { $block = $this->_getPlaceHolderBlock(); $placeholder = $this->_placeholder; $serializedParameters = array('handles', 'popup_ids'); foreach ($serializedParameters as $parameter) { $value = unserialize($placeholder->getAttribute($parameter)); $block->setDataUsingMethod($parameter, $value); } return $block->toHtml(); }
рдпрд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реИрдВрдбрд▓ рдФрд░ рдкреЙрдкрдЕрдк_рд┐рдб рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдП рд╣реИрдВред рдЙрд╕реА рдмреНрд▓реЙрдХ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public function getPopupIds() { if (!$this->hasData('popup_ids')) { $popupIds = ... ... $this->setData('popup_ids', $popupIds); } return $this->getData('popup_ids'); }
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдПрдлрдкреАрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдЧреЛрдкрдиреАрдпрддрд╛ рдХрд╛ рдкрд░реНрджрд╛ рдЙрдард╛ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдПрдлрдкреАрд╕реА рддрдВрддреНрд░ рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдХреИрд╢ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрд╢рд▓ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд▓реЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдЙрдЪреНрдЪ рдпрд╛рддрд╛рдпрд╛рдд рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╕реНрдЯреЛрд░ рдХреЗ рддреЗрдЬреА рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдПрдлрдкреАрд╕реА рдкрд░ рдЕрдкрдиреЗ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдПрдлрдкреАрд╕реА рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрддрд┐рд╢реАрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдореИрдЧреЗрдВрдЯреЛ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдмреНрд▓реЙрдХ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВред