Custom Tags definieren

Wir zeigen die Erzeugung von nofollow-Links, Links auf andere Sprachen und auf Datensätze von tt_news.

nofollow-Link

Wer sich mit dem Thema Suchmaschinenoptimierung — insbesondere mit der Suchmaschine Google — auseinandersetzt, kommt recht bald mit dem Begriff PageRank in Berührung. Das ist ein Wert im Bereich von 1 bis 10, den Google für jede einzelne Seite einer Website berechnet. Kurz gesagt, gibt dieser Wert Googles Einschätzung der Bedeutung einer Seite wider.

Jeder Link (intern oder extern), der von einer Seite zu einer anderen gesetzt wird, gibt einen winzigen Teil des PageRank der verlinkenden an die verlinkte Seite weiter. Dieser Prozess wird oft als Linkjuice (engl. "juice" bedeutet "Saft") bezeichnet, da durch den Link Wert von einer zur anderen Seite "fließt". Möchte man nun verhindern, dass die verlinkende Seite an Wert verliert, so kann man einem Link das nofollow-Attribut zuweisen.

Wir erweitern nun den TYPO3 Link Tag um das Attribut rel="nofollow" und nennen den neuen Tag link_nf:

nofollow-Link in TypoScript TypoScript, Bereich SETUP
tt_content.text.20.parseFunc.tags {
  link_nf < lib.parseFunc.tags.link
  link_nf.typolink.ATagParams = rel="nofollow"
}
lib.parseFunc.tags.link_nf < tt_content.text.20.parseFunc.tags.link_nf

Das Prinzip der Custom Tags ist immer das Selbe: Zuerst werden die Eigenschaften des "normalen" TYPO3-Links übernommen (Zeile 2). Danach folgt die eigentliche Definition des neuen Linktyps. Die letzte Zeile bewirkt, dass der neue Linktyp auch in Inhaltselementen wie z.B. Aufzählungslisten funktioniert.

Sobald Sie diesen Code in Ihr TypoScript-Template eingebaut haben, steht Ihnen in allen Inhaltselementen der neue Link in TYPO3 zur Verfügung. Die Syntax ist analog zum Standard-Link, nur eben mit dem Tag <link_nf>...</link_nf> statt <link>...</link>.

Link auf eine Seite in anderer Sprache

Dieser spezielle Link löst bei einer mehrsprachigen Website, die mit einem einzigen Seitenbaum erstellt wurde ("One-tree-Konzept"), das Problem, dass Links zwischen den verschiedenen Sprachen nicht richtig aufgelöst werden.

Angenommen, eine Website hat die zwei Sprachversionen Deutsch (sys_language_uid 0) und Englisch (sys_language_uid 1). Setzt man nun in einem Inhaltselement der deutschen Website einen Link mit dem TYPO3 Link-Tag, so verweist dieser immer auf die deutsche Version der velinkten Seite. Der zur Identifizierung der Sprache notwendige GET-Parameter "L" (Abkürzung für das englische "language", Sprache) wird nicht übergeben.

Mit einem Custom Tag für jede Sprache können wir eine Verlinkung der unterschiedlichen Sprachen erreichen. Die beiden Tags, die wir definieren, heissen link_de (für Links auf die deutsche Sprachversion) und link_en (für Links auf die englische Sprachversion).

Link mit L-Parameter TypoScript, Bereich SETUP
tt_content.text.20.parseFunc.tags {
# Sprach-UID 0 = deutsch
  link_de < lib.parseFunc.tags.link
  link_de.typolink.additionalParams = &L=0
# Sprach-UID 1 = englisch
  link_en < lib.parseFunc.tags.link
  link_en.typolink.additionalParams = &L=1
}
lib.parseFunc.tags.link_de < tt_content.text.20.parseFunc.tags.link_de
lib.parseFunc.tags.link_en < tt_content.text.20.parseFunc.tags.link_en

Link auf einen tt_news-Datensatz

Der nächste Linktyp, den wir definieren wollen, ist etwas komplexer: Er bietet die Möglichkeit, aus einem Inhaltselement in TYPO3 direkt einen Datensatz aus der Extension tt_news zu verlinken. Als Linkparameter wird dabei die eindeutige ID (uid) des tt_news-Datensatzes verwendet. Dieser Tag lässt sich nicht allein mit TypoScript definieren, sondern benötigt ein externes PHP-Skript, das im TypoScript-Template aufgerufen wird.

Unser Tag nennt sich link_ttnews und akzeptiert im Gegensatz zum standardmäßigen TYPO3-Linktag den ersten übergebenen Parameter als UID des Ziels und alle weiteren Angaben als 'title'-Attribut. Der Link wird folgendermaßen definiert:

Link auf tt_news TypoScript, Bereich SETUP
tt_content.text.20.parseFunc.tags {
  link_ttnews < lib.parseFunc.tags.link
  link_ttnews = PHP_SCRIPT 
  link_ttnews {
    stripNL = 0
# Parameter von Typoscript an PHP-Skript übergeben:
# UID der Seite mit SINGLE-View von tt_news
    id_singleView = 18
# PHP-Skript aufrufen
    file = fileadmin/scripts/link_ttnews_parser.php
  }
}
lib.parseFunc.tags.link_ttnews < tt_content.text.20.parseFunc.tags.link_ttnews

Im TypoScript wird das PHP-Skript /fileadmin/scripts/link_ttnews_parser.php aufgerufen. Diesem wird im Parameter id_singleView die UID (hier: 18) der Seite übergeben, die das tt_news-Plugin mit der Einzelansicht (SINGLE) enthält.

Der zweite Teil unserer Linkdefinition findet sich im PHP-Skript:

PHP-Skript zum Parsen von tt_news-Links
<?php
/**
 * Parser für 'link_ttnews' tag
 * ( /fileadmin/scripts/link_ttnews_parser.php )
 */
$parameters = explode(' ', $this->parameters['allParams']); 
$num_params = count($parameters);

if ($num_params > 0 && !empty($parameters[0])) {
	// tt_news Datensatz mit übergebener UID suchen
	$records = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
		'*', 'tt_news',
		'uid = ' . intval($parameters[0])
		. ' AND hidden=0 AND deleted=0'
		. $GLOBALS['TSFE']->sys_page->enableFields('tt_news'),
		'', '', 1
	);

	// wenn Datensatz in tt_news gefunden, Link-Parameter setzen
	if (count($records) > 0) {
		require_once(PATH_tslib.'class.tslib_content.php');
		$this->cObj = t3lib_div::makeInstance('tslib_cObj');
		
		// Link erzeugen
		$link['parameter'] =  $this->cObj->getTypoLink_URL(
			$conf['id_singleView'],
			array('tx_ttnews[tt_news]' => urlencode($parameters[0]))
		);

		// Wenn weitere Parameter übergeben wurden,
		// dann diese als 'title'-Attribut verwenden
		if ($num_params > 1) {
			// Ersten Parameter (UID) entfernen
			array_shift($parameters);
			// title-Attribut setzen
			$link['ATagParams'] = 'title="' . implode(' ', $parameters) . '"';
		}
		
		// Fertigen Link zurückliefern		 
		$content .= $this->typolink($this->getCurrentVal(), $link);
	} else {
		// wenn kein Datensatz gefunden => Linktext zurückgeben
		$content .= $this->getCurrentVal();
	}
} else {
	// wenn kein Parameter übergeben => Linktext zurückgeben
	$content .= $this->getCurrentVal();
}
?>

Wird in der tt_news-Tabelle ein gültiger Datensatz mit der übergebenen UID (erster Parameter des link_ttnews-Tags) gefunden, so wird ein a href Tag erzeugt und mit einem 'title'-Attribut versehen (sofern weitere Parameter übergeben wurden). Wird kein valider tt_news-Datensatz gefunden, so wird der Linktext (Text zwischen <link_ttnews> und </link_ttnews>) unverändert zurück gegeben.

Das waren einige Beispiele für die Erzeugung eigener Custom Tags in TYPO3. Auf diese Art und Weise lassen sich Links für die verschiedensten Anforderungen definieren. Durch die Verwendung von TypoScript in Verbindung mit PHP sind einem bei der Erzeugung von Links so gut wie keine Grenzen gesetzt.