Hallo!
ich möchte eine eigene Extension flotter machen und das Typo3-Caching NICHT mehr abschalten. Dazu hätte ich gern Euren Rat.
Wenn ein Benutzer die Seite ansieht, haben sich die Daten meist nicht geändert, ich würde deshalb gern den Cache selbst löschen, wenn tatsächlich Daten geUPDATet bzw. geINSERTet 8-) wurden.
Man könnte es "händisch" machen, in dem man wohl ein
* DELETE FROM cache_pages where page_id = x und ein
* DELETE FROM cache_pagesection where page_id = x abschickt.
Aber ich würde natürlich lieber die API direkt aufrufen (Also eine 3.5-Installation, und eine 3.6.2-Installation).
In welcher Typo3-Klasse steckt das denn?
Please help 😃
Greetz
Daniel
suchst du das hier?
/**
02338 * Clearing the cache based on a page being updated
02339 * If the $table is 'pages' then cache is cleared for all pages on the same level (and subsequent?)
02340 * Else just clear the cache for the parent page of the record.
02341 *
02342 * @param string Table name of record that was just updated.
02343 * @param integer UID of updated / inserted record
02344 * @return void
02345 */
02346 function clear_cache($table,$uid) {
02347 global $TCA;
02348
02349 $uid = intval($uid);
02350 if (is_array($TCA[$table]) && $uid > 0) {
02351
02352 // If table is "pages":
02353 if (t3lib_extMgm::isLoaded('cms')) {
02354 if ($table=='pages') {
02355
02356 // Builds list of pages on the SAME level as this page:
02357 $res_tmp = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
02358 'A.pid AS pid, B.uid AS uid, B.title AS title',
02359 $table.' AS A, '.$table.' AS B',
02360 'A.uid='.intval($uid).' AND B.pid=A.pid'
02361 );
02362
02363 $list_cache = array();
02364 $pid_tmp = 0;
02365 while ($row_tmp = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_tmp)) {
02366 $list_cache[] = $row_tmp['uid'];
02367 $pid_tmp = $row_tmp['pid'];
02368 }
02369 $list_cache[] = $pid_tmp;
02370
02371 // Delete cache for selected pages:
02372 $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pages','page_id IN ('.implode(',',$GLOBALS['TYPO3_DB']->cleanIntArray($list_cache)).')');
02373 $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pagesection', 'page_id IN ('.implode(',',$GLOBALS['TYPO3_DB']->cleanIntArray($list_cache)).')');
02374 } else { // For other tables than "pages", delete cache for the records "parent page".
02375 $uid_page = $this->getPID($table,$uid);
02376 if ($uid_page>0) {
02377 $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pages', 'page_id='.intval($uid_page));
02378 $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pagesection', 'page_id='.intval($uid_page));
02379 }
02380 }
02381 }
02382
02383 // Clear cache for pages entered in TSconfig:
02384 list($tscPID) = t3lib_BEfunc::getTSCpid($table,$uid,'');
02385 $TSConfig = $this->getTCEMAIN_TSconfig($tscPID);
02386 if ($TSConfig['clearCacheCmd']) {
02387 $Commands = t3lib_div::trimExplode(',',strtolower($TSConfig['clearCacheCmd']),1);
02388 $Commands = array_unique($Commands);
02389 foreach($Commands as $cmdPart) {
02390 $this->clear_cacheCmd($cmdPart);
02391 }
02392 }
02393
02394 // Call post processing function for clear-cache:
02395 global $TYPO3_CONF_VARS;
02396 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearCachePostProc'])) {
02397 $_params = array('table' => $table,'uid' => $uid,'uid_page' => $uid_page);
02398 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearCachePostProc'] as $_funcRef) {
02399 t3lib_div::callUserFunction($_funcRef,$_params,$this);
02400 }
02401 }
02402 }
02403 }
Aus der Datei class.t3lib_tcemain.php Zeilen stehen ja vor :-)
MfG Tim
Thanx! :-)
das ist ein harter Brocken. :o Hm, hoffentlich ist die Nutzung nicht auf die CoreEngine beschränkt.
Hat das denn schon mal jemand in ner EXT angesprochen?
Hab mal kurz reingespickt - Also eigentlich müssten die folgen Dinge ja während dem Extension-Abarbeiten schon korrekt gesetzt sein (hoffe ich):
$TCA und $GLOBALS['TYPO3_DB']
t3lib_BEfunc::getTSCpid($table,$uid,'') // for pages entered in TSconfig
$TSConfig['clearCacheCmd']
$TYPO3_CONF_VARS
$TYPO3_CONF_VARS['SC_OPTIONS']
Pech nur, wenn die Umgebung für eine Frontend-EXT doch nicht ganz da ist (denn t3lib_BEfunc::getTSCpid riecht nach Backend).
Greetz
Daniel
So, also wenn jemand den GANZEN cache löschen will klappt das damit:
// man muss aber in dem Moment als Admin eingeloggt sein!
// oder als ein BE-User der den cache löschen darf
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->start(Array(),Array());
$tce->clear_cacheCmd('all');
Um den cache für page 123 also zu löschen macht man das so (eigentlich recht cool!!):
// man muss aber in dem Moment als Admin eingeloggt sein!
// oder als ein BE-User der den cache löschen darf
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->start(Array(),Array());
$tce->clear_cacheCmd(123);
=> Tja, und wenn man es vom FE her tun möchte bleibt also momentan nur der "händische" Weg. Denn selbst WENN es momentan möglich sein sollte wäre das ein "verstecktes Feature" auf das deshalb nicht setzen kann. Denn die Sicherheitsbeschränkung die Kasper eigentlich möchte (Admin-Rechte) wären umgangen. Tja, schade.
Super wäre also die pibase um so eine cache-Ansteuerung zu erweitern.
Oder hab ich da nen Denkfehler drin?
Greetz
Daniel