[TYPO3-german] Timer für tt_News

Markus Deckmann Markus.Deckmann79 at web.de
Fri Apr 24 11:48:16 CEST 2009


Hi Jörg,

> das scheint mir eine interessante Idee zu sein. Ich habe zwar nicht sehr 
> viel Erfahrung mit Typo3-Programmierung, mir leuchtet das Prinzip aber 
> ein und dein Skript kann mir sicherlich weiterhelfen. Ich werde mal 
> einen Versuch unternehmen und bedanke mich sehr.

Der Ablauf ist eigentlich ganz einfach um so etwas zu erreichen. Ich 
versuche in Kürze mal das ganze ein bisschen zu erklären:

1. Zusätzliche Codes hinzufügen
-------------------------------
Um in der Auswahl von tt_news neue CODES hinzuzufügen brauchst du die 
folgende Zeile:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['what_to_display'][] = 
array(0 => "LIST_BY_AUTHOR", 1 => "LIST_BY_AUTHOR");

Das fügt z.B. einen neuen CODE mit der Bezeichnung "LIST_BY_AUTHOR" 
hinzu. Es dürfen in dem Namen aber keine Umlaute oder Leerzeichen 
enthalten sein, der Einheitlichkeit wegen solltest du außerdem die 
Bezeichnung groß schreiben.

Wenn du mehrere hinzufügen willst, einfach die Zeile entsprechend 
wiederholen:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['what_to_display'][] = 
array(0 => "LIST_BY_AUTHOR", 1 => "LIST_BY_AUTHOR");
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['what_to_display'][] = 
array(0 => "LIST_BY_TEAM", 1 => "LIST_BY_TEAM");

Damit hättest du zwei neue CODES im tt_news-Plugin zur Auswahl die du zu 
einem späteren Zeitpunkt verarbeiten kannst.

2. Code für zusätzliche DB-Abfrage
----------------------------------
Um die neu angelegten Codes verarbeiten zu können brauchst du jetzt noch 
einen zweiten Hook in die tt_news-Klasse. Diesen initialisierst du mit 
der folgenden Zeile:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['extraCodesHook'][] = 
'EXT:{ext_key}/class.tx_news_extend.php:tx_news_extend';

{ext_key} ersetzt du dabei gegen den Namen deiner eigenen Extension die 
du dir über den Kickstarter vor Schritt 1 erstellt hast. Solltest du 
diese Änderung direkt in einer bestehenden Extension durchführen muss 
{ext_key} entsprechend diesen Namen besitzen.

Als PHP-Klassenname verwendest du eine von dir gewählte Datei mit einer 
herkömmlichen Klassen-Definition und setzt den Namen der Klasse (im 
Normalfall der selbe wie die Datei selbst ohne class. und .php) hinter 
den Doppelpunkt in obiger Initialisierung.

Dadurch wird beim Aufruf einer Seite mit tt_news-Plugin immer diese 
Datei und diese Klasse aufgerufen und dort die folgende Funktion:

function extraCodesProcessor($newsObject) {}

Diese Funktion sorgt dafür das man zusätzliche Hooks in tt_news 
verarbeiten kann und erlaubt dir deine zusätzlichen CODES aus Schritt 1 
zu verarbeiten. In deine neu erstellte Klasse muss also die folgende 
Code-Definition inkl. des Parameters. Der Name ist dabei egal, es muss 
allerdings ein Parameter vorhanden sein an den der Hook von tt_news 
seine Werte übergeben kann. In dieser Funktion erhältst du ein Objekt 
vom Typ tt_news, was später evtl. für die Datenbankabfragen noch 
nützlich sein kann.

Innerhalb der Funktion kannst du jetzt ziemlich einfach über folgendes 
Konstrukt deine Codes verarbeiten:

switch ($newsObject->theCode) {
   case 'LIST_BY_AUTHOR':
     $content .= $newsObject->displayList();
     break;
   default:
     $content .= "CODE unbekannt!";
     break;
}

Für jeden neuen Code kannst du über $newsObject->theCode und einen 
entsprechenden CASE-Fall deinen speziellen Quellcode für die 
Verarbeitung angeben.

3. DB-Abfrage absetzen
----------------------
In deinem Fall wirst du um eine kleine DB-Abfrage der Datensätze nicht 
rumkommen, die richtigen Felder usw. kannst du dir ja über phpMyAdmin 
raussuchen.

Über folgende Zeile kannst du eine Abfrage an die Datenbank absetzen und 
erhältst als Ergebnis die Datensätze die auf diese Anfrage passen.

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery("*", "tt_news_cat_mm", " 
uid_foreign=".$cat_uid[0]);

Ähnlich wie bei PHP kannst du das Resultat dann mit folgendem Konstrukt 
für jede einzelne Ergebniszeile verarbeiten:

while ($rows = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
   ...
}

Innerhalb der while-Schleife baust du dir jetzt deine Liste aus 
Datensätzen zusammen die bei der Auswahl nicht erscheinen dürfen. Dabei 
ist bspw. im Plugin eingestellt das alle Datensätze angezeigt werden 
sollen welche die Kategorie "Jeden Montag" enthalten. Das gibt in beiden 
Ansichten (List- und Detail-) eine Menge an Elementen die angezeigt 
werden sollen, bis jetzt noch völlig unabhängig davon ob es Montag ist 
oder nicht.

Durch den zusätzlichen Code und die Datenbankabfrage kannst du jetzt 
deine entsprechenden Anforderungen prüfen und darauf basierend die Liste 
an Elementen aus der Datenbank auslesen die zwar zu der gewählten 
Kategorie passen allerdings aufgrund deiner anderen Kriterien doch nicht 
dargestellt werden sollen. In deinem Fall alle Elemente die zwar der 
Kategorie angehören an dem heutigen Tag aber nicht passen weil der 
falsche Tag ist.

Nachdem du deine Ausschlussliste generiert hast kannst du über den 
folgenden Aufruf die List- Ansicht der tt_news-Klasse aufrufen und als 
Parameter deine Ausschlussliste übergeben. Damit erhältst du die 
eingeschränkte Liste als Ausgabe im FE und dürftest damit dann bspw. 
auch solche Sachen wie "Jeden Montag" auch wirklich nur jeden Montag sehen.

$content .= $newsObject->displayList($excludeListSeperated);

Ganz am Ende der Funktion gibst du mit folgender Zeile den generierten 
Content wieder an tt_news zurück und tt_news generiert wie gewohnt über 
das eingefügte Plugin und einen der neuen CODES die LIST-Ansicht.

return $content;

Ich hoffe die Ausführung hilft einigen hier die ähnliches vorhaben oder 
ebenfalls tt_news aus irgendeinem Grund um CODES erweitern wollen.

Ciao Markus


More information about the TYPO3-german mailing list