Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like Nexcessnet_Turpentine_Model_Observer_Esi often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Nexcessnet_Turpentine_Model_Observer_Esi, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 22 | class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer { |
||
|
|
|||
| 23 | /** |
||
| 24 | * Set a cookie with the customer group id when customer logs in |
||
| 25 | * |
||
| 26 | * Events: customer_login |
||
| 27 | * |
||
| 28 | * @param Varien_Object $eventObject |
||
| 29 | * @return null |
||
| 30 | */ |
||
| 31 | public function setCustomerGroupCookie($eventObject) { |
||
| 32 | $customer = $eventObject->getCustomer(); |
||
| 33 | $cookie = Mage::getSingleton('core/cookie'); |
||
| 34 | if (Mage::getStoreConfig('persistent/options/enabled')) { |
||
| 35 | $cookie->set('customer_group', $customer->getGroupId(), Mage::getStoreConfig('persistent/options/lifetime')); |
||
| 36 | } else { |
||
| 37 | $cookie->set('customer_group', $customer->getGroupId()); |
||
| 38 | } |
||
| 39 | } |
||
| 40 | |||
| 41 | /** |
||
| 42 | * Destroy the cookie with the customer group when customer logs out |
||
| 43 | * |
||
| 44 | * Events: customer_logout |
||
| 45 | * |
||
| 46 | * @param Varien_Object $eventObject |
||
| 47 | * @return null |
||
| 48 | */ |
||
| 49 | public function removeCustomerGroupCookie($eventObject) { |
||
| 52 | |||
| 53 | /** |
||
| 54 | * Check the ESI flag and set the ESI header if needed |
||
| 55 | * |
||
| 56 | * Events: http_response_send_before |
||
| 57 | * |
||
| 58 | * @param Varien_Object $eventObject |
||
| 59 | * @return null |
||
| 60 | */ |
||
| 61 | View Code Duplication | public function setFlagHeaders($eventObject) { |
|
| 71 | |||
| 72 | /** |
||
| 73 | * Allows disabling page-caching by setting the cache flag on a controller |
||
| 74 | * |
||
| 75 | * <customer_account> |
||
| 76 | * <turpentine_cache_flag value="0" /> |
||
| 77 | * </customer_account> |
||
| 78 | * |
||
| 79 | * Events: controller_action_layout_generate_blocks_after |
||
| 80 | * |
||
| 81 | * @param Varien_Object $eventObject |
||
| 82 | * @return null |
||
| 83 | */ |
||
| 84 | public function checkCacheFlag($eventObject) { |
||
| 85 | if (Mage::helper('turpentine/varnish')->shouldResponseUseVarnish()) { |
||
| 86 | $layoutXml = $eventObject->getLayout()->getUpdate()->asSimplexml(); |
||
| 87 | foreach ($layoutXml->xpath('//turpentine_cache_flag') as $node) { |
||
| 88 | foreach ($node->attributes() as $attr => $value) { |
||
| 89 | if ($attr == 'value') { |
||
| 90 | if ( ! (string) $value) { |
||
| 91 | Mage::register('turpentine_nocache_flag', true, true); |
||
| 92 | return; //only need to set the flag once |
||
| 93 | } |
||
| 94 | } |
||
| 95 | } |
||
| 96 | } |
||
| 97 | } |
||
| 98 | } |
||
| 99 | |||
| 100 | /** |
||
| 101 | * On controller redirects, check the target URL and set to home page |
||
| 102 | * if it would otherwise go to a getBlock URL |
||
| 103 | * |
||
| 104 | * @param Varien_Object $eventObject |
||
| 105 | * @return null |
||
| 106 | */ |
||
| 107 | public function checkRedirectUrl($eventObject) { |
||
| 108 | $esiHelper = Mage::helper('turpentine/esi'); |
||
| 109 | $url = $eventObject->getTransport()->getUrl(); |
||
| 110 | $referer = Mage::helper('core/http')->getHttpReferer(); |
||
| 111 | $dummyUrl = $esiHelper->getDummyUrl(); |
||
| 112 | $reqUenc = Mage::helper('core')->urlDecode( |
||
| 113 | Mage::app()->getRequest()->getParam('uenc') ); |
||
| 114 | |||
| 115 | if ($this->_checkIsEsiUrl($url)) { |
||
| 116 | if ($this->_checkIsNotEsiUrl($reqUenc) && |
||
| 117 | Mage::getBaseUrl() == $url) { |
||
| 118 | $newUrl = $this->_fixupUencUrl($reqUenc); |
||
| 119 | } elseif ($this->_checkIsNotEsiUrl($referer)) { |
||
| 120 | $newUrl = $referer; |
||
| 121 | } else { |
||
| 122 | $newUrl = $dummyUrl; |
||
| 123 | } |
||
| 124 | // TODO: make sure this actually looks like a URL |
||
| 125 | $eventObject->getTransport()->setUrl($newUrl); |
||
| 126 | } |
||
| 127 | |||
| 128 | if ($eventObject->getTransport()->getUrl() != $url) { |
||
| 129 | Mage::helper('turpentine/debug')->logDebug( |
||
| 130 | 'Detected redirect to ESI URL, changing: %s => %s', |
||
| 131 | $url, $eventObject->getTransport()->getUrl() ); |
||
| 132 | } |
||
| 133 | } |
||
| 134 | |||
| 135 | /** |
||
| 136 | * Load the cache clear events from stored config |
||
| 137 | * |
||
| 138 | * @param Varien_Object $eventObject |
||
| 139 | * @return null |
||
| 140 | */ |
||
| 141 | public function loadCacheClearEvents($eventObject) { |
||
| 142 | Varien_Profiler::start('turpentine::observer::esi::loadCacheClearEvents'); |
||
| 143 | $events = Mage::helper('turpentine/esi')->getCacheClearEvents(); |
||
| 144 | $appShim = Mage::getSingleton('turpentine/shim_mage_core_app'); |
||
| 145 | foreach ($events as $ccEvent) { |
||
| 146 | $appShim->shim_addEventObserver('global', $ccEvent, |
||
| 147 | 'turpentine_ban_'.$ccEvent, 'singleton', |
||
| 148 | 'turpentine/observer_ban', 'banClientEsiCache'); |
||
| 149 | } |
||
| 150 | Varien_Profiler::stop('turpentine::observer::esi::loadCacheClearEvents'); |
||
| 151 | } |
||
| 152 | |||
| 153 | /** |
||
| 154 | * Add the core/messages block rewrite if the flash message fix is enabled |
||
| 155 | * |
||
| 156 | * The core/messages block is rewritten because it doesn't use a template |
||
| 157 | * we can replace with an ESI include tag, just dumps out a block of |
||
| 158 | * hard-coded HTML and also frequently skips the toHtml method |
||
| 159 | * |
||
| 160 | * @param Varien_Object $eventObject |
||
| 161 | * @return null |
||
| 162 | */ |
||
| 163 | public function addMessagesBlockRewrite($eventObject) { |
||
| 164 | if (Mage::helper('turpentine/esi')->shouldFixFlashMessages()) { |
||
| 165 | Varien_Profiler::start('turpentine::observer::esi::addMessagesBlockRewrite'); |
||
| 166 | Mage::getSingleton('turpentine/shim_mage_core_app') |
||
| 167 | ->shim_addClassRewrite('block', 'core', 'messages', |
||
| 168 | 'Nexcessnet_Turpentine_Block_Core_Messages'); |
||
| 169 | Varien_Profiler::stop('turpentine::observer::esi::addMessagesBlockRewrite'); |
||
| 170 | } |
||
| 171 | } |
||
| 172 | |||
| 173 | /** |
||
| 174 | * Check the magento version and runtime env and set the replace_form_key |
||
| 175 | * flag if needed |
||
| 176 | * |
||
| 177 | * @param Varien_Object $eventObject |
||
| 178 | * @return null |
||
| 179 | */ |
||
| 180 | public function setReplaceFormKeyFlag($eventObject) { |
||
| 190 | |||
| 191 | /** |
||
| 192 | * Replace the form key placeholder with the ESI include fragment |
||
| 193 | * |
||
| 194 | * @param Varien_Object $eventObject |
||
| 195 | * @return null |
||
| 196 | */ |
||
| 197 | public function replaceFormKeyPlaceholder($eventObject) { |
||
| 198 | if (Mage::registry('replace_form_key')) { |
||
| 199 | $esiHelper = Mage::helper('turpentine/esi'); |
||
| 200 | $response = $eventObject->getResponse(); |
||
| 201 | $responseBody = $response->getBody(); |
||
| 202 | $responseBody = str_replace('{{form_key_esi_placeholder}}', |
||
| 203 | $esiHelper->buildEsiIncludeFragment( |
||
| 204 | $esiHelper->getFormKeyEsiUrl() ), |
||
| 205 | $responseBody); |
||
| 206 | $response->setBody($responseBody); |
||
| 207 | } |
||
| 208 | } |
||
| 209 | |||
| 210 | /** |
||
| 211 | * Encode block data in URL then replace with ESI template |
||
| 212 | * |
||
| 213 | * @link https://github.com/nexcess/magento-turpentine/wiki/ESI_Cache_Policy |
||
| 214 | * |
||
| 215 | * Events: core_block_abstract_to_html_before |
||
| 216 | * |
||
| 217 | * @param Varien_Object $eventObject |
||
| 218 | * @return null |
||
| 219 | */ |
||
| 220 | public function injectEsi($eventObject) { |
||
| 221 | $blockObject = $eventObject->getBlock(); |
||
| 222 | $dataHelper = Mage::helper('turpentine/data'); |
||
| 223 | $esiHelper = Mage::helper('turpentine/esi'); |
||
| 224 | $debugHelper = Mage::helper('turpentine/debug'); |
||
| 225 | if ($esiHelper->getEsiBlockLogEnabled()) { |
||
| 226 | $debugHelper->logInfo( |
||
| 227 | 'Checking ESI block candidate: %s', |
||
| 228 | $blockObject->getNameInLayout() ? $blockObject->getNameInLayout() : $blockObject->getModuleName() ); |
||
| 229 | } |
||
| 230 | if ($esiHelper->shouldResponseUseEsi() && |
||
| 231 | $blockObject instanceof Mage_Core_Block_Template && |
||
| 232 | $esiOptions = $blockObject->getEsiOptions()) { |
||
| 233 | |||
| 234 | if ((isset($esiOptions['disableEsiInjection'])) && ($esiOptions['disableEsiInjection'] == 1)) { |
||
| 235 | return; |
||
| 236 | } |
||
| 237 | |||
| 238 | if (Mage::app()->getStore()->getCode() == 'admin') { |
||
| 239 | // admin blocks are not allowed to be cached for now |
||
| 240 | $debugHelper->logWarn( |
||
| 241 | 'Ignoring attempt to inject adminhtml block: %s', |
||
| 242 | $blockObject->getNameInLayout() ? $blockObject->getNameInLayout() : $blockObject->getModuleName() ); |
||
| 243 | return; |
||
| 244 | } elseif ($esiHelper->getEsiBlockLogEnabled()) { |
||
| 245 | $debugHelper->logInfo('Block check passed, injecting block: %s', |
||
| 246 | $blockObject->getNameInLayout() ? $blockObject->getNameInLayout() : $blockObject->getModuleName()); |
||
| 247 | } |
||
| 248 | Varien_Profiler::start('turpentine::observer::esi::injectEsi'); |
||
| 249 | $ttlParam = $esiHelper->getEsiTtlParam(); |
||
| 250 | $cacheTypeParam = $esiHelper->getEsiCacheTypeParam(); |
||
| 251 | $dataParam = $esiHelper->getEsiDataParam(); |
||
| 252 | $methodParam = $esiHelper->getEsiMethodParam(); |
||
| 253 | $hmacParam = $esiHelper->getEsiHmacParam(); |
||
| 254 | $scopeParam = $esiHelper->getEsiScopeParam(); |
||
| 255 | $referrerParam = $esiHelper->getEsiReferrerParam(); |
||
| 256 | |||
| 257 | $esiOptions = $this->_getDefaultEsiOptions($esiOptions); |
||
| 258 | |||
| 259 | // change the block's template to the stripped down ESI template |
||
| 260 | switch ($esiOptions[$methodParam]) { |
||
| 261 | case 'ajax': |
||
| 262 | $blockObject->setTemplate('turpentine/ajax.phtml'); |
||
| 263 | break; |
||
| 264 | |||
| 265 | case 'esi': |
||
| 266 | default: |
||
| 267 | $blockObject->setTemplate('turpentine/esi.phtml'); |
||
| 268 | // flag request for ESI processing |
||
| 269 | Mage::register('turpentine_esi_flag', true, true); |
||
| 270 | } |
||
| 271 | |||
| 272 | // esi data is the data needed to regenerate the ESI'd block |
||
| 273 | $esiData = $this->_getEsiData($blockObject, $esiOptions)->toArray(); |
||
| 274 | ksort($esiData); |
||
| 275 | $frozenData = $dataHelper->freeze($esiData); |
||
| 276 | $urlOptions = array( |
||
| 277 | $methodParam => $esiOptions[$methodParam], |
||
| 278 | $cacheTypeParam => $esiOptions[$cacheTypeParam], |
||
| 279 | $ttlParam => $esiOptions[$ttlParam], |
||
| 280 | $hmacParam => $dataHelper->getHmac($frozenData), |
||
| 281 | $dataParam => $frozenData, |
||
| 282 | ); |
||
| 283 | if ($esiOptions[$methodParam] == 'ajax') { |
||
| 284 | $urlOptions['_secure'] = Mage::app()->getStore() |
||
| 285 | ->isCurrentlySecure(); |
||
| 286 | } |
||
| 287 | if ($esiOptions[$scopeParam] == 'page') { |
||
| 288 | $urlOptions[$referrerParam] = Mage::helper('core')->urlEncode( |
||
| 289 | Mage::getUrl('*/*/*', array('_use_rewrite' => true, '_current' => true)) |
||
| 290 | ); |
||
| 291 | } |
||
| 292 | |||
| 293 | $esiUrl = Mage::getUrl('turpentine/esi/getBlock', $urlOptions); |
||
| 294 | if ($esiOptions[$methodParam] == 'esi') { |
||
| 295 | // setting [web/unsecure/base_url] can be https://... but ESI can never be HTTPS |
||
| 296 | $esiUrl = preg_replace('|^https://|i', 'http://', $esiUrl); |
||
| 297 | } |
||
| 298 | $blockObject->setEsiUrl($esiUrl); |
||
| 299 | // avoid caching the ESI template output to prevent the double-esi- |
||
| 300 | // include/"ESI processing not enabled" bug |
||
| 301 | foreach (array('lifetime', 'tags', 'key') as $dataKey) { |
||
| 302 | $blockObject->unsetData('cache_'.$dataKey); |
||
| 303 | } |
||
| 304 | if (strlen($esiUrl) > 2047) { |
||
| 305 | Mage::helper('turpentine/debug')->logWarn( |
||
| 306 | 'ESI url is probably too long (%d > 2047 characters): %s', |
||
| 307 | strlen($esiUrl), $esiUrl ); |
||
| 308 | } |
||
| 309 | Varien_Profiler::stop('turpentine::observer::esi::injectEsi'); |
||
| 310 | } // else handle the block like normal and cache it inline with the page |
||
| 311 | } |
||
| 312 | |||
| 313 | /** |
||
| 314 | * Generate ESI data to be encoded in URL |
||
| 315 | * |
||
| 316 | * @param Mage_Core_Block_Template $blockObject |
||
| 317 | * @param array $esiOptions |
||
| 318 | * @return Varien_Object |
||
| 319 | */ |
||
| 320 | protected function _getEsiData($blockObject, $esiOptions) { |
||
| 321 | Varien_Profiler::start('turpentine::observer::esi::_getEsiData'); |
||
| 322 | $esiHelper = Mage::helper('turpentine/esi'); |
||
| 323 | $cacheTypeParam = $esiHelper->getEsiCacheTypeParam(); |
||
| 324 | $scopeParam = $esiHelper->getEsiScopeParam(); |
||
| 325 | $methodParam = $esiHelper->getEsiMethodParam(); |
||
| 326 | $esiData = new Varien_Object(); |
||
| 327 | $esiData->setStoreId(Mage::app()->getStore()->getId()); |
||
| 328 | $esiData->setNameInLayout($blockObject->getNameInLayout()); |
||
| 329 | $esiData->setBlockType(get_class($blockObject)); |
||
| 330 | $esiData->setLayoutHandles($this->_getBlockLayoutHandles($blockObject)); |
||
| 331 | $esiData->setEsiMethod($esiOptions[$methodParam]); |
||
| 332 | if ($esiOptions[$cacheTypeParam] == 'private' || $esiOptions[$cacheTypeParam] == 'customer_group') { |
||
| 333 | if (is_array(@$esiOptions['flush_events'])) { |
||
| 334 | $esiData->setFlushEvents(array_merge( |
||
| 335 | $esiHelper->getDefaultCacheClearEvents(), |
||
| 336 | array_keys($esiOptions['flush_events']) )); |
||
| 337 | } else { |
||
| 338 | $esiData->setFlushEvents( |
||
| 339 | $esiHelper->getDefaultCacheClearEvents() ); |
||
| 340 | } |
||
| 341 | } |
||
| 342 | if ($esiOptions[$scopeParam] == 'page') { |
||
| 343 | $esiData->setParentUrl(Mage::app()->getRequest()->getRequestString()); |
||
| 344 | } |
||
| 345 | if (is_array($esiOptions['dummy_blocks'])) { |
||
| 346 | $dummyBlocks = array(); |
||
| 347 | foreach ($esiOptions['dummy_blocks'] as $key => $value) { |
||
| 348 | $dummyBlocks[] = (empty($value) && ! is_numeric($key)) ? $key : $value; |
||
| 349 | } |
||
| 350 | $esiData->setDummyBlocks($dummyBlocks); |
||
| 351 | } else { |
||
| 352 | Mage::helper('turpentine/debug')->logWarn( |
||
| 353 | 'Invalid dummy_blocks for block: %s', |
||
| 354 | $blockObject->getNameInLayout() ); |
||
| 355 | } |
||
| 356 | $simpleRegistry = array(); |
||
| 357 | $complexRegistry = array(); |
||
| 358 | if (is_array($esiOptions['registry_keys'])) { |
||
| 359 | foreach ($esiOptions['registry_keys'] as $key => $options) { |
||
| 360 | $value = Mage::registry($key); |
||
| 361 | if ($value) { |
||
| 362 | if (is_object($value) && |
||
| 363 | $value instanceof Mage_Core_Model_Abstract) { |
||
| 364 | $complexRegistry[$key] = |
||
| 365 | $this->_getComplexRegistryData($options, $value); |
||
| 366 | } else { |
||
| 367 | $simpleRegistry[$key] = $value; |
||
| 368 | } |
||
| 369 | } |
||
| 370 | } |
||
| 371 | } else { |
||
| 372 | Mage::helper('turpentine/debug')->logWarn( |
||
| 373 | 'Invalid registry_keys for block: %s', |
||
| 374 | $blockObject->getNameInLayout() ); |
||
| 375 | } |
||
| 376 | $esiData->setSimpleRegistry($simpleRegistry); |
||
| 377 | $esiData->setComplexRegistry($complexRegistry); |
||
| 378 | Varien_Profiler::stop('turpentine::observer::esi::_getEsiData'); |
||
| 379 | return $esiData; |
||
| 380 | } |
||
| 381 | |||
| 382 | /** |
||
| 383 | * Get the active layout handles for this block and any child blocks |
||
| 384 | * |
||
| 385 | * This is probably kind of slow since it uses a bunch of xpath searches |
||
| 386 | * but this was the easiest way to get the info needed. Should be a target |
||
| 387 | * for future optimization |
||
| 388 | * |
||
| 389 | * There is an issue with encoding the used handles in the URL, if the used |
||
| 390 | * handles change (ex customer logs in), the cached version of the page will |
||
| 391 | * still have the old handles encoded in it's ESI url. This can lead to |
||
| 392 | * weirdness like the "Log in" link displaying for already logged in |
||
| 393 | * visitors on pages that were initially visited by not-logged-in visitors. |
||
| 394 | * Not sure of a solution for this yet. |
||
| 395 | * |
||
| 396 | * Above problem is currently solved by EsiController::_swapCustomerHandles() |
||
| 397 | * but it would be best to find a more general solution to this. |
||
| 398 | * |
||
| 399 | * @param Mage_Core_Block_Template $block |
||
| 400 | * @return array |
||
| 401 | */ |
||
| 402 | protected function _getBlockLayoutHandles($block) { |
||
| 403 | Varien_Profiler::start('turpentine::observer::esi::_getBlockLayoutHandles'); |
||
| 404 | $layout = $block->getLayout(); |
||
| 405 | $layoutXml = Mage::helper('turpentine/esi')->getLayoutXml(); |
||
| 406 | $activeHandles = array(); |
||
| 407 | // get the xml node representing the block we're working on (from the |
||
| 408 | // default handle probably) |
||
| 409 | $blockNode = current($layout->getNode()->xpath(sprintf( |
||
| 410 | '//block[@name=\'%s\']', |
||
| 411 | $block->getNameInLayout() ))); |
||
| 412 | $childBlocks = Mage::helper('turpentine/data') |
||
| 413 | ->getChildBlockNames($blockNode); |
||
| 414 | foreach ($childBlocks as $blockName) { |
||
| 415 | foreach ($layout->getUpdate()->getHandles() as $handle) { |
||
| 416 | // check if this handle has any block or reference tags that |
||
| 417 | // refer to this block or a child block, unless the handle name |
||
| 418 | // is blank |
||
| 419 | if ($handle !== '' && (strpos($handle, 'THEME') === 0 || |
||
| 420 | $layoutXml->xpath(sprintf( |
||
| 421 | '//%s//*[@name=\'%s\']', $handle, $blockName )))) { |
||
| 422 | $activeHandles[] = $handle; |
||
| 423 | } |
||
| 424 | } |
||
| 425 | } |
||
| 426 | if ( ! $activeHandles) { |
||
| 427 | $activeHandles[] = 'default'; |
||
| 428 | } |
||
| 429 | Varien_Profiler::stop('turpentine::observer::esi::_getBlockLayoutHandles'); |
||
| 430 | return array_unique($activeHandles); |
||
| 431 | } |
||
| 432 | |||
| 433 | /** |
||
| 434 | * Get the default ESI options |
||
| 435 | * |
||
| 436 | * @return array |
||
| 437 | */ |
||
| 438 | protected function _getDefaultEsiOptions($options) { |
||
| 439 | $esiHelper = Mage::helper('turpentine/esi'); |
||
| 440 | $ttlParam = $esiHelper->getEsiTtlParam(); |
||
| 441 | $methodParam = $esiHelper->getEsiMethodParam(); |
||
| 442 | $cacheTypeParam = $esiHelper->getEsiCacheTypeParam(); |
||
| 443 | $defaults = array( |
||
| 444 | $esiHelper->getEsiMethodParam() => 'esi', |
||
| 445 | $esiHelper->getEsiScopeParam() => 'global', |
||
| 446 | $esiHelper->getEsiCacheTypeParam() => 'public', |
||
| 447 | 'dummy_blocks' => array(), |
||
| 448 | 'registry_keys' => array(), |
||
| 449 | ); |
||
| 450 | $options = array_merge($defaults, $options); |
||
| 451 | |||
| 452 | // set the default TTL |
||
| 453 | if ( ! isset($options[$ttlParam])) { |
||
| 454 | if ($options[$cacheTypeParam] == 'private' || $options[$cacheTypeParam] == 'customer_group') { |
||
| 455 | switch ($options[$methodParam]) { |
||
| 456 | case 'ajax': |
||
| 457 | $options[$ttlParam] = '0'; |
||
| 458 | break; |
||
| 459 | |||
| 460 | case 'esi': |
||
| 461 | default: |
||
| 462 | $options[$ttlParam] = $esiHelper->getDefaultEsiTtl(); |
||
| 463 | break; |
||
| 464 | } |
||
| 465 | } else { |
||
| 466 | $options[$ttlParam] = Mage::helper('turpentine/varnish') |
||
| 467 | ->getDefaultTtl(); |
||
| 468 | } |
||
| 469 | } |
||
| 470 | |||
| 471 | return $options; |
||
| 472 | } |
||
| 473 | |||
| 474 | /** |
||
| 475 | * Get the complex registry entry data |
||
| 476 | * |
||
| 477 | * @param array $valueOptions |
||
| 478 | * @param mixed $value |
||
| 479 | * @return array |
||
| 480 | */ |
||
| 481 | protected function _getComplexRegistryData($valueOptions, $value) { |
||
| 482 | $idMethod = @$valueOptions['id_method'] ? |
||
| 483 | $valueOptions['id_method'] : 'getId'; |
||
| 484 | $model = @$valueOptions['model'] ? |
||
| 485 | $valueOptions['model'] : Mage::helper('turpentine/data') |
||
| 486 | ->getModelName($value); |
||
| 487 | $data = array( |
||
| 488 | 'model' => $model, |
||
| 489 | 'id' => $value->{$idMethod}(), |
||
| 490 | ); |
||
| 491 | return $data; |
||
| 492 | } |
||
| 493 | |||
| 494 | /** |
||
| 495 | * Fix a URL to ensure it uses Magento's base URL instead of the backend |
||
| 496 | * URL |
||
| 497 | * |
||
| 498 | * @param string $uencUrl |
||
| 499 | * @return string |
||
| 500 | */ |
||
| 501 | protected function _fixupUencUrl($uencUrl) { |
||
| 502 | $esiHelper = Mage::helper('turpentine/esi'); |
||
| 503 | $corsOrigin = $esiHelper->getCorsOrigin(); |
||
| 504 | if ($corsOrigin != $esiHelper->getCorsOrigin($uencUrl)) { |
||
| 505 | return $corsOrigin.parse_url($uencUrl, PHP_URL_PATH); |
||
| 506 | } else { |
||
| 507 | return $uencUrl; |
||
| 508 | } |
||
| 509 | } |
||
| 510 | |||
| 511 | /** |
||
| 512 | * Check if a URL *is not* for the /turpentine/esi/getBlock/ action |
||
| 513 | * |
||
| 514 | * @param string $url |
||
| 515 | * @return bool |
||
| 516 | */ |
||
| 517 | protected function _checkIsNotEsiUrl($url) { |
||
| 520 | |||
| 521 | /** |
||
| 522 | * Check if a URL *is* for the /turpentine/esi/getBlock/ action |
||
| 523 | * |
||
| 524 | * @param string $url |
||
| 525 | * @return bool |
||
| 526 | */ |
||
| 527 | protected function _checkIsEsiUrl($url) { |
||
| 530 | |||
| 531 | /** |
||
| 532 | * Add form key on add-to-cart, unless VCL fix is enabled |
||
| 533 | * @param $observer |
||
| 534 | * @return Nexcessnet_Turpentine_Model_Observer_Esi |
||
| 535 | */ |
||
| 536 | public function hookToAddToCartBefore($observer) { |
||
| 537 | if (Mage::helper('turpentine/data')->getVclFix() == 0) { |
||
| 538 | $key = Mage::getSingleton('core/session')->getFormKey(); |
||
| 539 | $observer->getControllerAction()->getRequest()->setParam('form_key', $key); |
||
| 540 | } |
||
| 541 | return $this; |
||
| 542 | } |
||
| 543 | |||
| 544 | /** |
||
| 545 | * Add the form key to the wishlist page request |
||
| 546 | * |
||
| 547 | * @param $observer |
||
| 548 | * @return Nexcessnet_Turpentine_Model_Observer_Esi |
||
| 549 | */ |
||
| 550 | public function hookToAddToWishlistBefore($observer) |
||
| 556 | } |
||
| 557 |
You can fix this by adding a namespace to your class:
When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.