TYPO3 – Suche erweitern

Wer des öfteren mal die Funktionalität von TYPO3 mit eigenen Extensions erweitert, wird des Öfteren auf das Problem stoßen, dass bei der Erweiterung von Tabellen oder beim anlegen von Extension-spezifischen Datenbanktabellen bei der hauseigenen Suche außen vor bleiben.
Hier ist es sinnvoll, der Suche mitzuteilen, es möge doch bei der Suche auch zusätzliche Felder berücksichtigen. Dies lässt sich einfach und – im Gegensatz zu IF-Abfragen – einfach über TypoScript lösen.

Um der Suche die neuen Datenbank-Tabellen und/oder Felder mitzuteilen, geht man folgendermaßen vor.

Standard-Wert für "Überschriften und Schlagwörter": 
tt_content.search.30.dataArray.20.valueArray.10.value = pages.title-subtitle-keywords-description
Standard-Wert für "Seiteninhalt": 
tt_content.search.30.dataArray.20.valueArray.20.value = pages.title-subtitle-keywords-description : tt_content.header-bodytext-imagecaption

Zur neuen Definition leert man diese zuerst:

tt_content.search.30.dataArray.20.valueArray.10.value >
tt_content.search.30.dataArray.20.valueArray.20.value >

Danach definiert man den Wert neu indem man dem Standard die jeweiligen Felder anhängt:

tt_content.search.30.dataArray.20.valueArray.10.value = pages.title-subtitle-keywords-description-[zusätzliche Werte in der Tabelle "pages"]:[eine zusätzliche Tabelle]-[zusätzliche Felder dieser Tabelle]
tt_content.search.30.dataArray.20.valueArray.20.value = pages.title-subtitle-keywords-description:tt_content.header-bodytext-imagecaption-[zusätzliche Werte in der Tabelle "pages"] : [eine zusätzliche Tabelle]-[zusätzliche Felder dieser Tabelle]

Damit wird auch der Mechanismus klar, wie die zu durchsuchenden Felder definiert werden. Tabellen werden mit Doppelpunkt getrennt, die in der jeweiligen Tabelle zu durchsuchenden Spalten werden mit Dashes („-„) angehängt.

Abschließend muss man die Felder noch als zulässige Suchfelder definieren:

tt_content.search.20.allowedCols = [sämtliche Felder, die als Suchfelder definiert wurden, müssen hier im selben Schema eingetragen werden]

Zusätzlich zur Erweiterung der vorhandenen Filter („Überschriften und Schlagwörter“ und „Seiteninhalt“) ist es ebenso möglich, zusätzliche Filter einzufügen. Dazu fügt man dem Array

tt_content.search.30.dataArray.20.valueArray

einfach ein neues Element hinzu:

tt_content.search.30.dataArray.20.valueArray.30{
    label = Eine neue Option im Selectfeld
    value = [die mit dieser Option zu durchsuchenden Datenbank-Tabellen und Felder, Schema identisch]
}

Natürlich kann man analog auch Optionen entfernen.

jQuery smoothDivScroll – Problem mit flackernden Bildern

Die smoothDivScroll Erweiterung fuer das jQuery Framework nimmt den Browser durch sehr kurze Intervalle ziemlich in Anspruch. Wenn man mit etwas langsameren Bewegungen leben kann, setzt man am besten in der Datei jquery.smoothDivScroll-0.9.js in Zeile 180 den setInterval Wert etwas nach oben. 6 ms sind auch fuer schnelle Browser ein harter Brocken…

// start scrolling automatically
if(options.autoScroll !== "") {
    $mom.autoScrollInterval = setInterval(autoScroll, 85); // z.B. 85 ms.
}

In der Datei sind noch weitere setInterval() auf 6 ms gesetzt, allerdings sollte man dort ausprobieren ob die Reaktionszeit der Erweiterung bei MouseOver, etc… nicht zu sehr darunter leidet wenn die Werte hoeher gesetzt werden.

Caching Framework in Extensions

Extensions sollten um horizontal zu skalieren, Caches nicht in eigens gebauten $_SESSION Arrays oder Temporaeren SQL Tabellen halten, sondern das ab TYPO3 4.3.0 eingebaute und ab 4.3.1 vollstaendig umgesetzte Caching Framework (ein Backport aus der FLOW3 Entwicklung) verwenden.

Ein guter Artikel ist:

Bei der Entwicklung der Extensions ist natuerlich darauf zu achten, dass diese in der Form auch erst ab 4.3.1 korrekt arbeiten, und auf aelteren Installationen nicht funktionieren werden.

In kurzen Auszuegen:
In die ext_localconf.php folgendes hinzufuegen, wenn Memcached verwendet werden soll:

// If cache is not already defined, define it
if (!is_array($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['my_extension'])) {
   $TYPO3_CONF_VARS['SYS']['caching'] ['cacheConfigurations']['my_extension'] = array(
      'backend' => 't3lib_cache_backend_MemcachedBackend', 'options' => array( 'servers' => array('localhost:11211'), ))
   );
}

In der Extension muss das cache Object erzeugt und initialisiert werden:

if (TYPO3_UseCachingFramework) {
   // Create the cache
   try {
      $GLOBALS['typo3CacheFactory']->create(
         'my_extension',
         't3lib_cache_frontend_VariableFrontend',
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['my_extension']['backend'],
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['my_extension']['options']
      );
   } catch(t3lib_cache_exception_DuplicateIdentifier $e) {
      // do nothing, the cache already exists
   }
   // Initialize the cache
   try {
      $this->cache = $GLOBALS['typo3CacheManager']->getCache(
         'my_extension'
      );
   } catch(t3lib_cache_exception_NoSuchCache $e) {
      // Unable to load
   }
}

Um jetzt mit dem Cache arbeiten zu koennen sind folgende Methoden vorhanden:

$this->cache->has($id);
$this->cache->get($id);
$this->cache->set($id, $content, $tags, $lifetime);

Um id, content, tags und lifetime muss man sich selber kuemmern…

Bei MemcacheBackend gilt zu beachten: Idealerweise keine $id laenger als 255 Byte und idealerweise keinen $content mit mehr als 1MByte … das TYPO3 Caching Framework bricht diese Grenzwerte zwar auf, allerdings ist die Performance dann so im Keller, dass man den Zwischenspeicher auch gleich auf Pergament schreiben kann.

Extbase & Fluid

Die Basis für Extensions in TYPO3 v5 wird das PHP-Framework FLOW3 und die Template-Engine Fluid bilden. Daher sollten langsam aber sicher Extension aufwärstkompartibel programmiert werden. Seit TYPO3 4.3 stehen mit den Extensions extbase und fluid die passenden Rahmenbedingungen bereit.

Lesenswertes und weiterführende Infos: