Cache von page x durch eigene EXT löschen

  • escapedPrisoner escapedPr...
    Jedi-Meister
    0 x
    266 Beiträge
    0 Hilfreiche Beiträge
    08. 03. 2005, 13:55

    Hallo!

    ich möchte eine eigene [b:bbf9aa16c9]Extension flotter machen[/b:bbf9aa16c9] 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 [b:bbf9aa16c9]tatsächlich[/b:bbf9aa16c9] 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 [b:bbf9aa16c9]API[/b:bbf9aa16c9] direkt aufrufen (Also eine 3.5-Installation, und eine 3.6.2-Installation).
    In welcher Typo3-Klasse steckt das denn?

    Please help :D

    Greetz
    Daniel


  • 1
  • Spyker Spyker
    Jedi-Meister
    0 x
    399 Beiträge
    0 Hilfreiche Beiträge
    08. 03. 2005, 15:46

    suchst du das hier?

    [code:1:6ab8a8cba1]/**
    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 }[/code:1:6ab8a8cba1]

    Aus der Datei class.t3lib_tcemain.php Zeilen stehen ja vor :-)

    MfG Tim

  • escapedPrisoner escapedPr...
    Jedi-Meister
    0 x
    266 Beiträge
    0 Hilfreiche Beiträge
    08. 03. 2005, 16:27

    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):
    [code:1:6646af2093]$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'][/code:1:6646af2093]

    Pech nur, wenn die Umgebung für eine Frontend-EXT doch nicht ganz da ist (denn t3lib_BEfunc::getTSCpid riecht nach Backend).

    Greetz
    Daniel

  • escapedPrisoner escapedPr...
    Jedi-Meister
    0 x
    266 Beiträge
    0 Hilfreiche Beiträge
    09. 03. 2005, 18:30

    So, also wenn jemand den GANZEN cache löschen will [url=http://typo3.org/documentation/document-library/doc_core_api/Using_t3lib_TCEmain/?encryptionKey=&cHash=0d6d450369]klappt das damit[/url]:
    [code:1:4717def75e]
    // 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');
    [/code:1:4717def75e]

    Um den [b:4717def75e]cache für page 123 also zu löschen[/b:4717def75e] macht man das so (eigentlich recht cool!!):
    [code:1:4717def75e]
    // 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);
    [/code:1:4717def75e]

    => 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.

    [b:4717def75e]Super wäre also[/b:4717def75e] die pibase um so eine cache-Ansteuerung zu erweitern.

    Oder hab ich da nen Denkfehler drin?
    Greetz
    Daniel

  • 1