git-svn-id: https://192.168.0.254/svn/Proyectos.FundacionLQDVI_WebCongresos/trunk@2 94ccb1af-fd9d-d947-8d90-7f70ea60afc8
151 lines
4.3 KiB
PHP
151 lines
4.3 KiB
PHP
<?php
|
|
/**
|
|
* @version $Id: view.php 14401 2010-01-26 14:10:00Z louis $
|
|
* @package Joomla.Framework
|
|
* @subpackage Cache
|
|
* @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
|
|
* @license GNU/GPL, see LICENSE.php
|
|
* Joomla! is free software. This version may have been modified pursuant
|
|
* to the GNU General Public License, and as distributed it includes or
|
|
* is derivative of works licensed under the GNU General Public License or
|
|
* other free or open source software licenses.
|
|
* See COPYRIGHT.php for copyright notices and details.
|
|
*/
|
|
|
|
// Check to ensure this file is within the rest of the framework
|
|
defined('JPATH_BASE') or die();
|
|
|
|
/**
|
|
* Joomla! Cache view type object
|
|
*
|
|
* @package Joomla.Framework
|
|
* @subpackage Cache
|
|
* @since 1.5
|
|
*/
|
|
class JCacheView extends JCache
|
|
{
|
|
/**
|
|
* Get the cached view data
|
|
*
|
|
* @access public
|
|
* @param object $view The view object to cache output for
|
|
* @param string $method The method name of the view method to cache output for
|
|
* @param string $group The cache data group
|
|
* @param string $id The cache data id
|
|
* @return boolean True if the cache is hit (false else)
|
|
* @since 1.5
|
|
*/
|
|
function get( &$view, $method, $id=false )
|
|
{
|
|
global $mainframe;
|
|
|
|
// Initialize variables
|
|
$data = false;
|
|
|
|
// If an id is not given generate it from the request
|
|
if ($id == false) {
|
|
$id = $this->_makeId($view, $method);
|
|
}
|
|
|
|
$data = parent::get($id);
|
|
if ($data !== false) {
|
|
$data = unserialize($data);
|
|
$document = &JFactory::getDocument();
|
|
|
|
// Get the document head out of the cache.
|
|
$document->setHeadData((isset($data['head'])) ? $data['head'] : array());
|
|
|
|
// If the pathway buffer is set in the cache data, get it.
|
|
if (isset($data['pathway']) && is_array($data['pathway']))
|
|
{
|
|
// Push the pathway data into the pathway object.
|
|
$pathway = &$mainframe->getPathWay();
|
|
$pathway->setPathway($data['pathway']);
|
|
}
|
|
|
|
// If a module buffer is set in the cache data, get it.
|
|
if (isset($data['module']) && is_array($data['module']))
|
|
{
|
|
// Iterate through the module positions and push them into the document buffer.
|
|
foreach ($data['module'] as $name => $contents) {
|
|
$document->setBuffer($contents, 'module', $name);
|
|
}
|
|
}
|
|
|
|
// Get the document body out of the cache.
|
|
echo (isset($data['body'])) ? $data['body'] : null;
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* No hit so we have to execute the view
|
|
*/
|
|
if (method_exists($view, $method))
|
|
{
|
|
$document = &JFactory::getDocument();
|
|
|
|
// Get the modules buffer before component execution.
|
|
$buffer1 = $document->getBuffer();
|
|
|
|
// Make sure the module buffer is an array.
|
|
if (!isset($buffer1['module']) || !is_array($buffer1['module'])) {
|
|
$buffer1['module'] = array();
|
|
}
|
|
|
|
// 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 = array();
|
|
|
|
// View body data
|
|
$cached['body'] = $data;
|
|
|
|
// Document head data
|
|
$cached['head'] = $document->getHeadData();
|
|
|
|
// Pathway data
|
|
$pathway = &$mainframe->getPathWay();
|
|
$cached['pathway'] = $pathway->getPathway();
|
|
|
|
// Get the module buffer after component execution.
|
|
$buffer2 = $document->getBuffer();
|
|
|
|
// Make sure the module buffer is an array.
|
|
if (!isset($buffer2['module']) || !is_array($buffer2['module'])) {
|
|
$buffer2['module'] = array();
|
|
}
|
|
|
|
// Compare the second module buffer against the first buffer.
|
|
$cached['module'] = array_diff_assoc($buffer2['module'], $buffer1['module']);
|
|
|
|
// Store the cache data
|
|
$this->store(serialize($cached), $id);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Generate a view cache id
|
|
*
|
|
* @access private
|
|
* @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 1.5
|
|
*/
|
|
function _makeId(&$view, $method)
|
|
{
|
|
return md5(serialize(array(JRequest::getURI(), get_class($view), $method)));
|
|
}
|
|
}
|