_makeId($view, $method); } $data = $this->cache->get($id); $locktest = new stdClass; $locktest->locked = null; $locktest->locklooped = null; if ($data === false) { $locktest = $this->cache->lock($id, null); // If the loop is completed and returned true it means the lock has been set. // If looped is true try to get the cached data again; it could exist now. if ($locktest->locked == true && $locktest->locklooped == true) { $data = $this->cache->get($id); } // False means that locking is either turned off or maxtime has been exceeded. // Execute the view. } if ($data !== false) { $data = unserialize(trim($data)); if ($wrkarounds === true) { echo JCache::getWorkarounds($data); } else { // No workarounds, so all data is stored in one piece echo (isset($data)) ? $data : null; } if ($locktest->locked == true) { $this->cache->unlock($id); } return true; } /* * No hit so we have to execute the view */ if (method_exists($view, $method)) { // If previous lock failed try again if ($locktest->locked == false) { $locktest = $this->cache->lock($id); } // Capture and echo output ob_start(); ob_implicit_flush(false); $view->$method(); $data = ob_get_contents(); ob_end_clean(); echo $data; /* * For a view we have a special case. We need to cache not only the output from the view, but the state * of the document head after the view has been rendered. This will allow us to properly cache any attached * scripts or stylesheets or links or any other modifications that the view has made to the document object */ $cached = $wrkarounds == true ? JCache::setWorkarounds($data) : $data; // Store the cache data $this->cache->store(serialize($cached), $id); if ($locktest->locked == true) { $this->cache->unlock($id); } } return false; } /** * Generate a view cache id. * * @param object &$view The view object to cache output for * @param string $method The method name to cache for the view object * * @return string MD5 Hash : view cache id * * @since 11.1 */ protected function _makeId(&$view, $method) { return md5(serialize(array(JCache::makeId(), get_class($view), $method))); } }