Index: typo3/sysext/cms/tslib/interfaces/interface.tslib_fe_setpagecachecontenthook.php =================================================================== --- typo3/sysext/cms/tslib/interfaces/interface.tslib_fe_setpagecachecontenthook.php (revision 0) +++ typo3/sysext/cms/tslib/interfaces/interface.tslib_fe_setpagecachecontenthook.php (revision 0) @@ -0,0 +1,51 @@ + +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* A copy is found in the textfile GPL.txt and important notices to the license +* from the author is found in LICENSE.txt distributed with these scripts. +* +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * interface for classes which hook into tslib_fe for changing the cache expires timestamp + * + * @author Martin Holtz + * @package TYPO3 + * @subpackage t3lib + */ +interface tslib_fe_setPageCacheContentHook { + + /** + * expiresTimestamp which is be used to store the cache-page + * can be altered from extensions + * + * @param int Timestamp, which defines when the page-cache is outdated + * @param int Page ID + * @param mixed The additional cache_data array, fx. $this->config + * @return int new Timestamp + */ + public function getCacheExpiresTimestamp($contentObjectName, array $configuration, $TypoScriptKey, tslib_cObj &$parentObject); + +} + +?>\ No newline at end of file Index: typo3/sysext/cms/tslib/class.tslib_fe.php =================================================================== --- typo3/sysext/cms/tslib/class.tslib_fe.php (revision 4068) +++ typo3/sysext/cms/tslib/class.tslib_fe.php (working copy) @@ -2689,7 +2689,6 @@ } } } - /** * Sets cache content; Inserts the content string into the cache_pages table. * @@ -2699,8 +2698,80 @@ * @return void * @see realPageCacheContent(), tempPageCacheContent() */ - function setPageCacheContent($content,$data,$tstamp) { + function setPageCacheContent($content, $data, $tstamp) { $this->clearPageCacheContent(); + + // only if content is not "message_page_is_being_generated" + // which expires after 30 seconds + if (!$this->tempContent) { + // can be changed from an extension via $GLOBALS['TSFE']->cacheExpires + if ($this->cacheExpires > 0 && $this->cacheExpires < $tstamp) { + $tstamp = $this->cacheExpires; + } + + // Call hook for $tstamp calculation + if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['setPageCacheContent'])) { + foreach($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['setPageCacheContent'] as $classData) { + $hookObject = &t3lib_div::getUserObj($classData); + + if(!($hookObject instanceof tslib_fe_setPageCacheContentHook)) { + throw new UnexpectedValueException( + '$hookObject must implement interface tslib_content_tslib_fe_setPageCacheContentHook', + 1220839864 + ); + } + $modifiedTimestamp = $hookObject->getCacheExpiresTimestamp($tstamp, $this->id, $data); + + if ($modifiedTimestamp > 0 && $modifiedTimestamp < $tstamp) { + $tstamp = $modifiedTimestamp; + } + } + } + + $pageSelect = t3lib_div::makeInstance('t3lib_pageSelect'); + + // Workspace does not matter, because they are on an different page + // so whe can use $this-id to check for content elements on this page + // Versioning does not matter, because they got pid = -1 + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( + '*', + 'tt_content', + 'tt_content.pid = '.intval($this->id) + . ' AND ( + (tt_content.starttime > '.$GLOBALS['EXEC_TIME'].' AND tt_content.starttime < '.$tstamp.') + OR (tt_content.endtime > '.$GLOBALS['EXEC_TIME'].' AND tt_content.endtime < '.$tstamp.') + ) ' + . $pageSelect->enableFields( + 'tt_content', + 0, + array('starttime' => true, 'endtime' => true), + FALSE + ) + ); + + while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { + // $tstamp is the orignial expire-date of that page + // usually it is calculated by cache-expiredate and + // $GLOBALS['EXEC_TIME'] + // the page starttime/endtime is checked before + // it is requested from cache. So we do not have to care + // of starttime/endtime of the page itself + + // we want to respect the starttime / endtime of the + // content elements + // + // we have to check for each content element only, if it has a starttime + // or an endtime which takes effect betwwen $GLOBALS['EXEC_TIME'] + // and the default-expire date ($tstamp). + if ($row['starttime'] < $tstamp && $row['starttime'] > $GLOBALS['EXEC_TIME']) { + $tstamp = $row['starttime']; + } + if ($row['endtime'] < $tstamp && $row['endtime'] > $GLOBALS['EXEC_TIME']) { + $tstamp = $row['endtime']; + } + } + } + $insertFields = array( 'hash' => $this->newHash, 'page_id' => $this->id,