/** * Generate the ESI block * * @param Varien_Object $esiData * @return Mage_Core_Block_Template|null */ protected function _getEsiBlock($esiData) { $block = null; Varien_Profiler::start('turpentine::controller::esi::_getEsiBlock'); foreach ($esiData->getSimpleRegistry() as $key => $value) { Mage::register($key, $value, true); } foreach ($esiData->getComplexRegistry() as $key => $data) { $value = Mage::getModel($data['model']); if (!is_object($value)) { Mage::helper('turpentine/debug')->logWarn('Failed to register key/model: %s as %s(%s)', $key, $data['model'], $data['id']); continue; } else { $value->load($data['id']); Mage::register($key, $value, true); } } $layout = Mage::getSingleton('core/layout'); Mage::getSingleton('core/design_package')->setPackageName($esiData->getDesignPackage())->setTheme($esiData->getDesignTheme()); // dispatch event for adding handles to layout update Mage::dispatchEvent('controller_action_layout_load_before', array('action' => $this, 'layout' => $layout)); $layoutUpdate = $layout->getUpdate(); $layoutUpdate->load($this->_swapCustomerHandles($esiData->getLayoutHandles())); foreach ($esiData->getDummyBlocks() as $blockName) { $layout->createBlock('Mage_Core_Block_Template', $blockName); } if (!$this->getFlag('', self::FLAG_NO_DISPATCH_BLOCK_EVENT)) { Mage::dispatchEvent('controller_action_layout_generate_xml_before', array('action' => $this, 'layout' => $layout)); } $layout->generateXml(); /** @var Nexcessnet_Turpentine_Helper_Data $turpentineHelper */ $turpentineHelper = Mage::helper('turpentine/data')->setLayout($layout); $blockNode = current($layout->getNode()->xpath(sprintf('//block[@name=\'%s\']', $esiData->getNameInLayout()))); if (!$blockNode instanceof Mage_Core_Model_Layout_Element) { Mage::helper('turpentine/debug')->logWarn('No block node found with @name="%s"', $esiData->getNameInLayout()); return null; } $nodesToGenerate = $turpentineHelper->getChildBlockNames($blockNode); Mage::getModel('turpentine/shim_mage_core_layout')->shim_generateFullBlock($blockNode); //find addional blocks that aren't defined in the <block/> but via <reference name="%s"> $referenceNodes = $layout->getNode()->xpath(sprintf('//reference[@name=\'%s\']', $esiData->getNameInLayout())); if ($referenceNodes) { foreach ($referenceNodes as $referenceNode) { if ($referenceNode instanceof Mage_Core_Model_Layout_Element) { $referencesToGenerate = $turpentineHelper->getChildBlockNames($referenceNode); $nodesToGenerate = array_merge($nodesToGenerate, $referencesToGenerate); } } } // dispatch event for adding xml layout elements if (!$this->getFlag('', self::FLAG_NO_DISPATCH_BLOCK_EVENT)) { Mage::dispatchEvent('controller_action_layout_generate_blocks_before', array('action' => $this, 'layout' => $layout)); } foreach (array_unique($nodesToGenerate) as $nodeName) { foreach ($layout->getNode()->xpath(sprintf('//reference[@name=\'%s\']', $nodeName)) as $node) { $layout->generateBlocks($node); } } $block = $layout->getBlock($esiData->getNameInLayout()); if (!$this->getFlag('', self::FLAG_NO_DISPATCH_BLOCK_EVENT)) { Mage::dispatchEvent('controller_action_layout_generate_blocks_after', array('action' => $this, 'layout' => $layout)); } $this->_isLayoutLoaded = true; Varien_Profiler::stop('turpentine::controller::esi::_getEsiBlock'); return $block; }
/** * Generate the ESI block * * @param Varien_Object $esiData * @return Mage_Core_Block_Template */ protected function _getEsiBlock($esiData) { $block = null; Varien_Profiler::start('turpentine::controller::esi::_getEsiBlock'); foreach ($esiData->getSimpleRegistry() as $key => $value) { Mage::register($key, $value, true); } foreach ($esiData->getComplexRegistry() as $key => $data) { $value = Mage::getModel($data['model']); if (!is_object($value)) { Mage::helper('turpentine/debug')->logWarn('Failed to register key/model: %s as %s(%s)', $key, $data['model'], $data['id']); continue; } else { $value->load($data['id']); Mage::register($key, $value, true); } } $layout = Mage::getSingleton('core/layout'); Mage::getSingleton('core/design_package')->setPackageName($esiData->getDesignPackage())->setTheme($esiData->getDesignTheme()); $layoutUpdate = $layout->getUpdate(); $layoutUpdate->load($this->_swapCustomerHandles($esiData->getLayoutHandles())); foreach ($esiData->getDummyBlocks() as $blockName) { $layout->createBlock('Mage_Core_Block_Template', $blockName); } $layout->generateXml(); $blockNode = current($layout->getNode()->xpath(sprintf('//block[@name=\'%s\']', $esiData->getNameInLayout()))); if ($blockNode instanceof Varien_Simplexml_Element) { $nodesToGenerate = Mage::helper('turpentine/data')->setLayout($layout)->getChildBlockNames($blockNode); Mage::getModel('turpentine/shim_mage_core_layout')->shim_generateFullBlock($blockNode); foreach ($nodesToGenerate as $nodeName) { foreach ($layout->getNode()->xpath(sprintf('//reference[@name=\'%s\']', $nodeName)) as $node) { $layout->generateBlocks($node); } } $block = $layout->getBlock($esiData->getNameInLayout()); } else { Mage::helper('turpentine/debug')->logWarn('No block node found with @name="%s"', $esiData->getNameInLayout()); } Varien_Profiler::stop('turpentine::controller::esi::_getEsiBlock'); return $block; }