www.bimminger.at

Tipps / Internet / Typo3

Typo3

Typo3: Eigene Extension mit Cache-Steuerung und Indexed Search


Sobald man in Typo3 eine eigene Extension erstellt die nicht komplett dem typischen Typo3-Muster entspricht muss man sich ein wenig mehr Gedanken über den Cache machen. Besonders wenn man auch auf indexed_search zurückgreifen möchte. Diese Lösung hier ist nicht als Allheilmittel gedacht, soll interessierten aber einen Weg weisen.

Meine Problemstellung - indexed_search:

Aus einer eigenen Datenbank sollten Inhalte als Teil der Typo3-Seite angezeigt werden. Das bedeutet eine Ausgabe von eigenen und nicht von Typo3 gewarteten Daten anhand von unterschiedlichen Übergabeparametern. Diese Daten sollen im Kontext einer vordefinierten Typo3 Page ausgegeben werden. Die unterschiedlichen Inhalte sollten auch in der indexed_search Struktur von Typo3 aufscheinen.

Das bedeutet die einzelne Typo3-Page soll nicht nur einmal sondern gleich mehrmals im Cache und im Index abgelegt werden.

Meine Lösung mit cHash und set_no_cache():


Kurz skizziert ein Lösungsansatz für dieses Problem.


1. Typo3 Core


Einstellungen im Typo3-Template der Seite (Setup):

config {
  #Cache-Steuerung
  no_cache = 0
  cache = 1

  #Site Index
  index_enable = 1
  index_metatags = 0
}

Generell habe ich auch in meinem HTML-Seitenkonstrukt indexed_search auf den eigentlichen Content eingeschränkt - kurz schematisch skizziert:

Kopfzeile mit Logo
Menu
<!--TYPO3SEARCH_begin-->
CONTENT
<!--TYPO3SEARCH_end-->
Fußzeile

2. Die eigene Extension selbst


Als Beispiel zur Erklärung setze ich hier auf eine Art News-Extension (abNews) mit hierarchischen Bereichen und darunterliegenden Artikeln.

Wenn eine Seite mehrmals gecached werden soll, muss in der Extension schon mal
$this->pi_USER_INT_obj=0
gesetzt werden um überhaupt die Wahl zwischen cachen und nicht cachen zu haben.

Typo3 fordert einen cHash-Wert damit nicht jemand mit den Übergabeparametern spielt (Angriffsmöglichkeit auf die Seite - Stichwort: Datenbank volllaufen lassen) und die Seite lahm legt. Dieser Parameter muss jetzt bei jedem Link der innerhalb der eigenen Extension erzeugt wird auch eingesetzt werden. Ich hab das gleich mal kurz in eine eigene Funktion innerhalb der Extension-Klasse ausgelagert:

function createHashLink($bereich, $artikel) {
	/* Parameter vordefinieren:
	 *  - $bereich ... ist eine Hierarchische Ebene bei mir
	 *  - $artikel ... ist ein der Artikel innerhalb der Ebene
	 */ 

	$overrulePIvars = array("bereich" => $bereich, "artikel" => $artikel);
	$cache = 1;
	$clearAnyway = 1;
	$pageID = 2;   //In meinem Fall ist alles auf eine PAGE-ID gebunden

	$link = $this->pi_linkTP_keepPIvars_url($overrulePIvars, $cache, $clearAnyway, $pageID);
	return $link;
}


Wenn jeder Link so erzeugt wird erhält er bei der Ausgabe den fürs cachen erforderlichen cHash-Wert.

Also im Beispeil würde statt
/index.php?id=2&abNews[bereich]=10&abNews[artikel]=13
der Link
/index.php?id=2&abNews[bereich]=10&abNews[artikel]=13&cHash=<Typo3Hashwert>
generiert.

Nun zur Ausgabe, der Einfachheit halber gleich nur der Link eingebunden unter main()

function main($content, $conf) {
	$this->pi_USER_INT_obj=0;
	
	//Wenn kein cHash-Wert übergeben wurde, dann Cachen verhindern - dann können wir eine Startseite zur Extension genereieren:
	$cHash = t3lib_div::_GP("cHash");
	if(!$cHash) {
		$GLOBALS['TSFE']->set_no_cache();
	}

	$bereich = 10;
	$artikel = 13;
	$linktext = "test";

	//Link erstellen und einbauen
	$link = $this->createHashLink($bereich, $artikel);
	$content = "<a href=\"".$link."\">".$linktext."</a>";

	//Zurück an Typo3
	return $this->pi_wrapInBaseClass($content);
}


Mit diesem Beispiel wird die aufgerufene Seite
/index.php?id=2
nicht gecached und nicht in den Index übernommen. Wenn aber auf den darin generierten Link
/index.php?id=2&abNews[bereich]=10&abNews[artikel]=13&cHash=<Typo3Hashwert>
geklickt wird, wird diese Seite hinter dem Link sowohl im Cache als auch im Index abgelegt.


Eigene Extension mit RealURl, Cache und indexed_search

Dieses Beispiel ist natürlich auch mit der aktivierten Extension RealURL lösbar.


Index regelmäßig leeren und neu aufbauen

Hier noch ein Hinweis zu einem Cron-Job um den Index regelmäßig zurück zu setzen und neu aufzubauen.