Weblog

19/06: T3: tw_rssfeeds reloaded

Bereits früher habe ich Verbesserungen für diese TYPO3-Extension erläutert (http://gebloggt.ch/?p=368). Nun wurde die Extension völlig “nutzlos”, da mit ausgeschaltetem allow_url_fopen von PHP nichts mehr funktionierte.

Ich zitere das problematische Stück code aus der Datei pi1/class.tx_twrssfeeds_pi1.php:

function xml_file($file) {
if (!($fp = @fopen($file, “r”)))
$this->error(“Kann XML-Datei <b>”.$file.”</b> nicht öffnen”);

while ($data = fread($fp, 4096)) {
if (!(xml_parse($this->parser, $data)))
$this->error(“XML-Output: “.xml_error_string(xml_get_error_code($this->parser)));
}

xml_parser_free($this->parser);
}

Natürlich geht das mit der erwähnten PHP-Option nicht. Verbessert (ich weiss, wieder etwas workaround-mässig):

function xml_file($file) {
require_once(“HTTPRequest.php”);
$httpReq = new HTTPRequest($file);
$data = $httpReq->DownloadToString();

if (!(xml_parse($this->parser, $data))) {
$this->error(“XML-Output: “.xml_error_string(xml_get_error_code($this->parser)));
}

xml_parser_free($this->parser);

}

Die Klasse HTTPRequest.php ist etwas ähnliches wie die entsprechende PEAR-Klasse, jedoch etwas einfacher zu benutzen. Und man kann damit den Inhalt externer URLs abrufen, ohne dass allow_url_fopen auf true gesetzt sein muss. Quelle der Klasse: http://www.php-resource.de/forum/showthread/t-65376.html

Ich hab die Klasse auch schon bei anderen Applikationen gebraucht, um externe Files mit PHP zu öffnen. Hat bisher sehr gut funktioniert. Für eine schöne Lösung müsste man dies ev. in die Extension einbauen, da so eine externe Datei nicht so elegant ist.

Ausserdem hat der im Beitrag zitierte Code noch einen kleinen Bug. Die Variable response (in der Funktion DownlaodToString() wurde nicht deklariert und initialisiert. Das

$response.= fread(…)

erzeugt dadurch einen Notice von PHP.

Also kurz:

  1. pi1/class.tx_twrssfeeds_pi1.php anpassen, hochladen
  2. HTTPRequest.php erstellen und ins selbe Verzeichnis hochladen (ggf. $response noch deklarieren).

Damit sollte die Extension wieder funktionieren. Bei mir läuft die Sache prima.

24/02: T3: ml_links

Die TYPO3-Extension ml_links ermöglicht es, vor bzw. nach einem Link ein spezielles Symbol darzustellen. So habe ich auf einer Webpräsenz eingestellt, dass vor jedem externen Link eine kleine Weltkugel, vor jedem mailto-Link ein Brief und vor jedem PDF-Download das PDF-Symbol dargestellt wird. Weitere Informationen sind auf der Beschreibung der Extension: hier

Etwas habe ich jedoch vermisst: das mitgeben zusätzlicher Attribute für das img-Tag dieses Symbols. Die Extension wurde so umgebaut, dass man mit TSConfig den Wert image.params setzen kann. In der Datei class.tx_mllinks_pi1.php (im Ornder /ext/ml_links/p1/) wurde die erste Funktion insertImage wie folgt angepasst:

/**
* add image
*/
function insertImage ($data, $linkTag) {
$img = “”;
if (file_exists($data['image'])) {
// start img tag
$img .= ‘<img src=”‘ . $data['image'].’”‘;
if (isset($data['image.']['alt'])) {
$img .= ‘ alt=”‘ . $data['image.']['alt'].’”‘;
}
if (isset($data['image.']['params'])) {
$img .= $data['image.']['params'];
}
// end img tag
$img .= ‘/>’;
// surround img-tag with a link?
if (isset($data['image.']['link']) && $data['image.']['link'] == 1) {
$img = $linkTag . $img . ‘</a>’;
}
if (!empty($this->tag)) {
if (isset($data['separator'])) {
$img = $data['separator'] . $img;
}
else {
$img = $this->separator . $img;
}
}
$this->buildLink = true;
}
return ($img);
}

Die Funktion main(…) wurde im case URL ebenfalls geändert:

//add image
if (isset($data['image.'][$ext]) && file_exists($data['image.'][$ext])) {
$imageTag = ‘<img src=”‘ . $data['image.'][$ext].’”‘;
if (isset($data['image.'][$ext]['alt'])) {
$imageTag .= ‘ alt=”‘ . $data['image.'][$ext]['alt'] . ‘”‘;
}
if (isset($data['image.'][$ext]['params'])) {
$imageTag .= $data['image.'][$ext]['params'];
}
$imageTag .= ‘/>’;
}
elseif (file_exists($data['image'])) {
$imageTag = ‘<img src=”‘ . $data['image'].’”‘;
if (isset($data['image.']['alt'])) {
$imageTag .= ‘ alt=”‘ . $data['image.']['alt'] . ‘”‘;
}
if (isset($data['image.']['params'])) {
$imageTag .= $data['image.']['params'];
}
$imageTag .= ‘/>’;
}

Meine Konfiguration ( TSConfig) lautet nun (Vorlage von hier):

lib.ml_links_conf {
seperator = “”
external {
10.image = typo3conf/ext/ml_links/icon_globe.gif
10.image.alt = Externer Link
10.image.params = class=”mllinkimg”
10.image.link = 1
20.linkTag = 1
}
mailto {
10.image = typo3conf/ext/ml_links/icon_mailto.gif
10.image.alt = Mail Link
10.image.params = class=”mllinkimg”
10.image.link = 1
20.linkTag = 1
}
pdf {
10.image = typo3conf/ext/ml_links/icon_pdf.gif
10.image.alt = PDF
10.image.params = class=”mllinkimg”
10.image.link = 1
20.linkTag = 1
30.filesize = 1
}

}

# Links im normalen Text
# Text und Text m/Bild – RTE – normaler Textlink
tt_content.text.20.parseFunc.tags.link.postUserFunc = tx_mllinks_pi1->main
tt_content.text.20.parseFunc.tags.link.postUserFunc < lib.ml_links_conf

# Text und Text m/Bild – Link auf dem Bild
tt_content.text.20.parseFunc.tags.link.typolink.userFunc = tx_mllinks_pi1->getFiletype
tt_content.text.20.parseFunc.tags.link.typolink.userFunc < lib.ml_links_conf

# Links in Listen – GEHT NET ???
# Inhaltselemente Text und Text m/bild – RTE – Links in Listen
tt_content.text.20.parseFunc.tags.typolist.default.parseFunc.tags.link.postUserFunc = tx_mllinks_pi1->main
tt_content.text.20.parseFunc.tags.typolist.default.parseFunc.tags.link.postUserFunc < lib.ml_links_conf

tt_content.text.20.parseFunc.tags.typolist.default.parseFunc.tags.link.typolink.userFunc = tx_mllinks_pi1->getFiletype
tt_content.text.20.parseFunc.tags.typolist.default.parseFunc.tags.link.typolink.userFunc < lib.ml_links_conf

So weit so gut. Nur etwas funktioniert noch nicht wie gewünscht: Links, die in Listen (li) erscheinen, werden nicht geparst. Vielleicht finden wir auch da noch eine Lösung.

22/01: T3: tw_rssfeeds

Die TYPO3-Extension tw_rssfeeds liest einen RSS-Feed ein und stellt ihn an einem beliebigen Ort dar. Diese Extension ist sehr nützlich und mir ist zurzeit keine bessere Alternative bekannt, um RSS Feeds zu importieren und darzustellen (tt_news unabhängig). Trotzdem hat es etwas Nacharbeit gebraucht, damit die Sache für mich zufriedenstellend lief.

1. Encoding/Codierung
Im File class.tx_twrssfeeds_pi1.php wird ab Zeile 89 der charset mit der PHP-Funktion mb_convert_encoding festgelegt. Der zweite Parameter ($to_encoding) ist dabei immer auf UTF-8 gesetzt. Das bedeutet, dass immer davon ausgegangen wird, dass die Seite, auf der der importierte Feed dargestellt werden soll, in UTF-8 codiert ist. Ich habe das ‘quick’n'dirty’ einmal hart dort eincodiert und kurzerhand auf iso-8859-1 umgestellt:

case ‘UTF8′:
$content .= mb_convert_encoding($this->parseRSS($get_thefeed),”iso-8859-1″,”UTF-8″);
break;

So hat es bei mir funtioniert, wenn die Lösung auch nicht sonderlich schön ausgefallen ist ;-)

2. Publishing Date / Ausgabe erweitern
Eine weiteres kleines Feature, das ich vermisst habe, ist die Ausgabe des publishing datums des Feed Items. Dies habe ich ebenfalls hardcodiert in das entsprechende File (class.tx_twrssfeeds_pi1.php) eingefügt. Schön wäre natürlich eine Template-basierte Lösung. Aber eben ;-)
Zeile 279/280 sehen bei mir nun so aus:

$dt = strftime(“%d. %B %Y”, strtotime($this->data['ITEM'][$i]['PUBDATE']));
$content .= ‘<p class=”bodytext_news”>’.$dt.’<br />’;

Ich habe dem Autor der Extension einmal ein Mail mit meinen Anregungen geschrieben. Vielleicht könnten wir für diese beiden Probleme noch schöne Lösungen finden. Im Rahmen meiner Möglichkeiten wäre ich bereit, meinen Beitrag zu leisten. Die tw_rssfeeds ist jedenfalls bereits auf mehreren Seiten produktiv im Einsatz.

6/01: tt_news: Archiv-Konfiguration

Habe mich mit der Konfiguration einer Archiv-Seite beschäftigt (TYPO3, Extension tt_news). Standardmässig wird um die Jahre herum ein <li></li> gewrappt. Anpassen kann man dies in der Datei news_amenuUserFunc2.php, die sich unter exttt_newsres befindet.

Zeile 65 bei mir neu:

$tmpl = ‘<div class=”news-amenu-item-year”>###ARCHIVE_YEAR###</div>’;

Damit ist eine Auflistung und Anzeige nach Jahr möglich, die nicht als Liste formatiert ist.

Quelle: typo3forum.net

6/02: GMENU mit Umlauten

Das Problem hat mich schon einige Wochen beschäftigt, jetzt ist es gelöst. TYPO3 hat mit Version 4 Umlaute in einem GMENU nicht richtig gerendert. Herausgekommen sind nur Quadrate. Ein klares Encoding-Problem. Doch die Lösung war nicht so einfach.

Mein temporärer Workaround (Eingabe der Umlaute in Unicode) kann man den Usern nicht zumuten. Jetzt ist die Lösung da (Danke Christian und Sven):

http://lists.netfielders.de/pipermail/typo3-german/2007-February/028235.html

Also folgende Schritte:

Datei user_convchar.php erstellen:

2. In das Setup des Templates folgendes schreiben (mit Pfad zur PHP-Datei):

includeLibs.convchar_script = fileadmin/libs/user_convchar.php

3. Folgende Zeile auf das Element anwenden:

10.text.postUserFunc = user_convchar->encode

20/01: Suchmaschinentest

Unfreiwillig habe ich heute Suchmaschinen getestet. Ich suche die Antwort auf ein Problem (in TYPO3 werden Umlaute in meinem GMENU nicht sauber gerendert sondern nur mit einem Quadrat dargestellt). Google bringt mir “ungefähr 589″ Ergebnisse. Darunter auf den ersten Seiten Brauchbares (sprich: Links zu Foren und Seiten, auf denen mein Problem behandelt wird; leider nirgends mit einer guten Lösung :-( ).

In meiner Not habe ich gedacht, ich gebe den “anderen” Suchmaschinen einmal eine Chance. Doch ich bin enttäuscht. Yahoo, Altavista und (ja, ich habe mich überwunden) MSN bringen alle nur ca 7-8 Ergebnisse. Und brauchbar sind sie allesamt nicht. Andere Suchmaschinen sind mir nicht gerade spontan in den Sinn gekommen.

Kein Wunder, hat Google ein faktisches Monopol auf der Websuche. Warum auch nicht, wenn die Konkurrenz so schwach ist? In diesem Business ist, wie (fast) überall, immer noch die Qualität entscheidend.

« Vorherige Seite