Textpattern

Mir fällt gerade kein Titel sein.

An den vergangene Abenden habe ich mal mein mein Photoblog in Angriff genommen und weg von Textpattern portiert. Nicht, dass ich irgendwas gegen Textpattern hätte, aber das Bearbeiten von Templates über ein Webinterface ist auf Dauer grausam. Nicht erst seit vbulletin habe ich da eine “leichte” Allergie entwickelt.

Also Smarty genommen und ein wenig Klassen drumherum. So sollte ich in den nächsten Abenden eher die Motivation finden, was an dem Layout zu machen. Die Fotoseiten werden wohl so bleiben, aber die Übersichtsseite könnte Einiges an Aufmerksamkeit vertragen:

  • eine saubere Trennung von Texteinträgen und Fotos
  • eine Contentspalte, die breiter ist als 320 Pixel
  • einen Photostream vielleicht mit jCarousel

Textpattern Thumbnail Quality

Nur am Rande erwähnt: Wem die JPG Qualität von 80 der Thumbnails von Textpattern zu artefakthaltig ist, kann die Qualität in der Datei /textpattern/lib/class.thumb.php anpassen. Einfach den Wert für die Eigenschaft $this->quality in Zeile 70 (oder in der Nähe) auf einen ansprechenden Wert ändern. Ich habe mich für 95 entschieden, also $this->quality = 95;

Ausserdem finde ich es schade, dass im Admin Dings die Einträge der Bildübersicht keine Checkboxen haben, wie eg. in der Artikelübersicht, denn dann könnte man relativ einfach eine Feature implementieren, dass für ausgewählte Bilder Thumbnails (neu) erzeugt.

neues Photoblog

Das Photoblog ist nun im Großen und Ganzen fertig. Ich habe mich für Textpattern als Antrieb entschieden. Überzeugt haben die einfache Handhabung und der Mangel an Feature, der dem Nutzer ganz gut als Understatement verkauft werden kann.

Naja, ganz so schlimm ist es nicht, sogar XML-RPC für Txp tut seinen Dienst, obwohl das für ein Photoblog eher nebensächlich ist. Das Artikelbild Feld hat dabei weit aus höhere Relevanz als der Body:)

Einzig am Feed musste Hand angelegt werden. Das Media RSS Module ist für ein Photoblog doch recht interessant und mit Hilfe von media:thumbnail kann ich Thumbnails an anderer Stelle einbinden, eg. in diesem Blog.

MS IIS und Textpattern

Vorhin habe ich Textpattern auf einem Microsoft Internet Information Server installiert und es klappte völlig reibungslos, sogar die Image Angelegenheiten funzen bis auf die Bearbeitung von GIFs.
Zur Zeit sind allerdings nur hässliche permanente Links mit Query möglich.

Wenn sich ein Verantwortlicher findet, der in der php.ini – ich habe keinen Zugriff auf’s Document Root – ‘cgi.fix_pathinfo’ auf 1 und ‘cgi.force_redirect’ auf 0 (Manual) setzt, sind wohl auch halbwegs akzeptable URLs möglich. Dazu muß man dann einfach unter Einstellungen/Webadresse noch ein ‘index.php’ an den bestehenden Wert anhängen und das gewünschte angenehme ‘Schema der URLs’ auswählen. Das Spielchen kann man auch treiben, wenn man bei einem Billighoster kostengünstigen Webspaceanbieter kein mod_rewrite zur Hand hat.

Im Endeffekt kommen dabei URLs wie ’/index.php/section/article’ oder ähnlich bei raus. Das ist auf jeden Fall schöner als ’/index.php?id=xyz’.

Im Großen und Ganzen bin ich über die einfach Installation sehr erfreut. Habe ja ein wenig gebangt sonstwas anstellen zu müssen.

Textpattern: Tagging

Ich glaube langsam fang ich an zu nerven. In letzter habe ich häufiger mal was mit Textpattern zu tun und es auch mal wieder lokal installiert, als internes Projektlog für mich.

Irgendeinen Sinn muß ich dem Mac mini doch geben:)

Gibt es eigentlich mittlerweile eine vernünftige Unterstützung für Tagging unter Txp? Falls nicht, kann es recht einfach nachgerüstet werden. In zwei Schritten:

Für einen praktischen, globalen Einsatz ändert man textpattern/publish.php an zwei Stellen, um Keywords als Tags zu nutzen.

case urldecode(strtolower(urlencode(gTxt('author')))):
    $out['author'] = (!empty($u2)) ? $u2 : ''; break;
    // AuthorID gets resolved from Name further down

case urldecode(strtolower(urlencode('tag'))):
    $out['tag'] = (!empty($u2)) ? $u2 : ''; break;

case urldecode(strtolower(urlencode(gTxt('file_download')))):
    $out['s'] = 'file_download';
    $out['id'] = (!empty($u2)) ? $u2 : ''; break;

Den mittleren Case ab Zeile 259 ergänzen.

//Allow keywords for no-custom articles.
$keywords = "";
if ($keywords) {
    $keys = split(',',$keywords);
    foreach ($keys as $key) {
        $keyparts[] = " Keywords like '%" .
            doSlash(trim($key))."%'";
    }
    $keywords = " and (" . join(' or ',$keyparts) . ")";
}

//Allow tags for no-custom articles.
if ($tag) {
    $keywords .= " and Keywords REGEXP '[[:<:]]" .
        doSlash(trim($tag)) .
        "[[:>:]]'";
}

Ab ca. Zeile 580 den unteren Codeabsatz ergänzen.

Dazu gibt es dann noch zwei Plugins, um eine Tagcloud zu erzeugen und bei jedem Eintrag benutzte Tags anzuzeigen.

Den Änderungen für publish.php ist es egal, welches Trennzeichen zwischen Tags benutzt wird. Den Plugins wird das Trennzeichen mit Hilfe des Attributs ’separater‘ mitgeteilt. Default ist ein Leerzichen.

Das Attribut ‚base‘ gibt die Linkbasis für Tags an. Default ist ‚tag‘. Falls eine andere Basis gewünscht wird, muß das auch in der publish.php angepasst werden, eg. case urldecode(strtolower(urlencode('basis-fuer-tags'))):

Mit den Attributen ‚threshold‘ und ’scale‘ kann man Einfluß auf die Tagscloud nehmen. ‚threshold‘ gibt ein Mindestauskommen von Tags an. ’scale‘ hat ein Fluß auf die Skalierung.

Hinweis: Der Aufbau der Tagscloud liest alle Einträge mit Keywords und durchläuft zwei Schleifen um die Wolke zu erzeugen. Mit der Zahl der Einträge wird der Vorgang rechenintensiv und je nach Hosting sollte man evtl. darauf verzichten die Wolke auf jeder Seite anzuzeigen.

Eine Weiterentwicklung ist evtl. nicht ausgeschlossen. 🙂

Textpattern: Suchergebnis hervorheben

Um bei der Textpatternsuche die Suchworte in den Ergebnissen nicht mit dem Tag STRONG sondern alternativ hervorzuheben, kann man in der Datei publish/taghandlers.php in Zeile 1246 den Wert für den Schlüssel ‚hilight‘ anpassen:

extract(lAtts(array(
    'hilight'     => 'strong style="color:red"',
),$atts));

würde die gesuchten Schlüsselwörter mit STRONG und in rot darstellen.

Das ist insofern bemerkenswert, da mein erster Ansatz der Funktion search() in der Datei public/search.php galt.

Nachtrag: Vergessen sie das Ganze:) Dirk hat recht. Im Seitenbaustein ’search_results‘ wird standardmäßig die Funktion ’search_result_excerpt()‘ benutzt und dort kann man mit dem Attribut ‚hilight‘ das Markup zum Hervorheben ändern.

Danke Dirk:)

Textpattern: Guestbook

Nun gut, Gästebücher sind mit den ausgehenden 90er Jahren Gott sein Dank auch ’ausgegangen‘. Aber warum soll man jemanden davon abhalten eins zu haben, wenn er es unbedingt haben möchte.

Mit der Textpattern Erweiterung mk_guestbook ist das schnell gemacht.

  • Es werden zwei Bausteine benötigt: ‚guestbook_form‘ und ‚guestbook_entry‘. Beide sind exemplarisch im Quelltext abgebildet.
  • Kommentare werden in der gleichen Datenbanktabelle wie Kommentare abgelegt. Als parent_id wird die ‚0‘ benutzt. Es ist also darauf zu achten, daß es keinen Blogeintrag mit dieser ID gibt.
  • Der Tag <txp:mk_guestbook /> wird in einer eigens dafür angelegt Sektion mit eigener Seitenvorlage untergebracht. Weitere Parameter gibt es derzeit nicht.
  • Die Form Action in ‚guestbook_form‘ sollte der Basisurl, der benutzen Sektion entsprechen, damit der Besucher nach Absenden des Formulars wieder im Gästebuch landet. Das Hinzufügen klappt allerdings auch auf anderen URLs, die zu der Textpattern Installation gehören.
  • Wenn die Moderation für Kommentare aktiviert ist, wirkt sich das auch auf das Gästebuch aus.
  • Mit den beiden Variabeln ‚$guestbook_info_mail_to‘ und ‚$guestbook_info_mail_from‘ lassen sich Absender und Empfänger der Beanchrichtugsmail für neue Gästebucheinträge anpassen.

Das war es auch schon. Zu sehen ist eine Installation in dem kleinen Familienprojekt. Den Quellcode gibt es natürlich auch frei haus.

Wen in der Kommentarübersicht der Verweis ‚gelöschter Eintrag‘ stört, kann in textpattern/includes/txp_discuss.php Zeile 103 folgende Zeile einfügen:

$parent = $parentid==0?'Gästebuch':$parent;

WordPress oder Textpattern

Nach den ganzen Lobgesängen auf WordPress 2 konnte ich nicht anders als es mal lokal zu installieren.

Wow! Das vorweg. Das letzte Mal habe ich mir WordPress vor Jahren angeschaut und die Entwicklung bis Heute ist gewaltig. Verglichen mit Textpattern, dem letzten System von der Stange, das ich mal benutzt habe, ist WordPress ein Fortschritt. Gerade für Spielkinder wie mich ist WordPress sehr interessant:

  • Das Anpassen oder Erstellen von Themes ist unter WordPress eine wahre Wohltat. Die relevanten Dateien können im Texteditor der Wahl bearbeitet werden. Kein nerviges herumgedaddel in Textareas. Ein Punkte, der mich bei Textpattern zur Weißglut gebracht hat.
  • Das Webinterface ist im Vergleich zu dem von Textpattern wesentlich moderner und durchdachter. Ich find das Tablemassaker von Txp mittlerweile mehr als unangebracht.

    Das Tiger WordPress Administration Design möbelt das Webinterface auch noch mal gewaltig auf.

  • Eine WeblogAPI gehört bei WordPress zum Standardumfang und muß nicht erst nachträglich installiert werden. Eg. das XML-RPC-Interface von Pixelmeadow. Wobei Chris McLeod mittlerweile selbst auch auf WP umgestiegen ist. Gleiches gilt auch für Trackback, das wie bei den meisten Systemen zum „Lieferumfang“ gehört.
  • Und da ich nur einen Abend benötigt habe, um mich in WP einzuarbeiten scheint die Dokumentation auch ganz passabel zu sein 😉

Wenn ich in Zukunft mal ein schnelles System von der Stange benötige, werde ich wohl zu WP greifen, da es in jeder Hinsicht unproblematischer ist als Txp. Und mit einem so töften Theme wie K2 macht das Eintauchen in WP gleich noch mehr Spaß. Wenn ich bedenke, welches Theater ich veranstalten musste, damit die Freitäglichen Fünf halbwegs annehmbar werden. Mit WP wäre das nur ein Fingerschnippen gewesen.

Allerdings sieht man auch schnell einen Nachteil. Während ich es gewohnt bin fertig kodierten XHTML Code der Einträge neben dem Originaltext in der Datenbank zu speichern – wie es Txp auch macht – werden bei WP Einträge zur Laufzeit mit Markdown oder Textile (als Plugin zu installieren) kodiert. Ich könnte mir vorstellen, daß ein „Shared Server“ ab einer gewissen Last schon mal ins Schwitzen kommen könnte. Vielleicht gibt es da noch eine Erweiterung oder Lösung, die ich bisher noch nicht entdeckt habe.

Textpattern, Lust und Frust

Vor einer Weile habe ich mich reichlich frustriert bei meinem Zweitblog von Textpattern verabschiedet und nun habe ich es für die freitäglichen Fünf in aktueller Version erneut installiert. Und ich habe nicht das Gefühl, daß es sich sonderlich weiter entwickelt hätte.

Und ich hatte auch schon meine erste Negativerfahrung. Zeilenumbrüche bei Kommentaren werden mit einem doppelten <br /> ausgestattet. Das macht Sinn, davon kann man nie genug haben. Sieht vielleicht etwas seltsam aus, aber wozu gibt\’s CSS…

In erstetr Linie gibt es bei Txp drei Punkte, sie mich mit einem großen warum im Gesicht stehen lassen:

  • Sehr spannend wäre auch ein Ausbau des Loggings um eine Maßnahmen die eigenen Zugriffe nicht mitzuzählen. Die interessieren nunmal reichlich wenig.
  • Ich hatte noch nie verstanden warum die Entwickler nicht auf ein bewährtes und vor allem bekanntes Templatesystem wie bspw. Smarty setzen, da könnte sowohl im Admininterface als auch im Front End Einsatz finden. Klappt auf dieser Seite ganz gut:) Da hätte man sich die TAB-Bespaßung (/lib/txplib_html.php) größtenteils ersparen können.
  • Wir alle kennen Normalformen. Warum benutzen wir sie nicht.

Aber wer wird denn in der Vorweihnachtszeit so rumnörgeln. Ich fand es lediglich etwas ärgerlich, daß Txp wohl kein System out of the box ist, da ich auf das og. genannten Problem bei den Kommentaren gestoßen bin und Hand an den Quellcode legen mußte, da ich absolute keinen Schimmer hatte, ob es eine andere Möglichketi gibt, das abzustellen. Mich mit Quelltext auseinanderzusetzen wollte ich mit der Installation eines “fertigen“ System eigentlich vermeiden.

So! Und jetzt gehe ich in Ruhe die letzten Weihnachtsgeschenke kaufen.

ab ins Archiv

Wie es aussieht, hat sich das Kapitel Textpattern für mich ein für alle Mal geschlossen.

Nachdem ich nun selbst keine Textpatternseiten mehr betreibe und auch keine mehr verwalte, gibt es keine Chance auf Updates für meine alten Plugins. Ich habe die Seiten mangels Bezugs auf aktuelle Versionen von Textpattern vom Netz genommen und die Skripte und Plugins ins Archiv geworfen.

txp mit Textile und Markdown

Mich hat hat schon des öfteren Mal geärgert, daß ich bei einer Textpatterninstallation entweder Textile oder Markdown nutzen kann. Ich kann mich ja nie so richtig entscheiden und steh auf Optionen.

Abhilfe erscheint ganz einfach:

  1. markdown.php im Verzeichnis /textpattern/lib/ abladen
  2. /textpattern/include/txp_article.php durch diese Version ersetzen. Evtl. erstmal ein Backup des Original machen. Ich benutze 1.0rc1, bei neueren Versionen kann es zu Konflikten kommen.
  3. zum Abschluß noch ein Feld zur Textpattern Tabelle hinzufügen: ALTER TABLE textpattern ADD text_type ENUM('textile','markdown') NOT NULL Falls der Name der Tabelle von ’textpattern‘ abweicht ist dieser natürlich anzupassen.
  4. fertig

Einfacher würde das mit rc3 und einem Plugin laufen, aber ich habe einfach keine Lust eine aktuellere Version zu installieren.

Textpattern Monatsarchiv rev.

OK, es tut ja nicht weh. Da mittlerweile zwei Fragen zur Installation des Montasarchiv Plugin für Txp eingetroffen sind, gibt es das Plugin nun als base64 encodeten Hash den man einfach über das Textpattern Interface installieren kann.

Vormals habe ich Plugins idR. innerhalb der Datei /textpattern/publish.php eingebunden, da ich diese gerade in der Testphase dann locker-flockig im besten Editor der Welt direkt auf dem Webspace bearbeiten konnte ohne mit einer beschissenen Textarea zu kämpfen. Aber ich muß zugeben, die Webinstallation in einem weiteren Blog ist dann doch etwas einfacher…

Textpattern Monatsarchive

Noch mehr Textpattern. Als ob mich das Fieber wieder gepackt hätte. Aber was soll man an einem verregnete Samstagmorgen auch sonst tun, wenn die Gedanken an gemütliches Shoppen von Windstärke 9 und entsprechendem Regen zunichte gemacht werden.

Vor einige Wochen habe ich schon mal angefangen ein Plugin zur automatischen Darstellung von Monatsarchiven für Textpattern zu schreiben. Heute habe ich es überarbeitet und ich denke, man kann es auf die Menschheit loslassen.

Bei Anmerkungen oder Nörgeleien eine kleine Info an mich.

LiveSearch für Textpattern

Eine Livesearch Implementierung mit dem BitFlux Javascript ist auch für Textpattern relativ zügig gemacht.

Mit folgender livesearch.php erhält man den text/xml Output. Die Datei wird ähnlich wie der RSS oder ATOM Feed in /textpattern/publish.php innerhalb der Funktion preText() eingebunden. Etwa ab Zeile 106, nach dem include von /publish/atom.php folgende Zeilen einfügen:

if( gps('ls') ) {
  include txpath.'/publish/livesearch.php';
  exit(livesearch( gps('ls'),20 ));
}

Jetzt bleibt noch der Aufruf aus dem Javascript heraus anzupassen. Etwa in Zeile 134 in der Datei livesearch.js findet man eine Zeichenkette wie livesearch.php?s=, die einfach durch /?ls= ersetzt wird. Noch ein geeignetes Suchformular wie auf der Wikiseite erläutert im gewünschten Template einfügen und der Drops ist gelutscht.

Falls ein Auszug aus dem Body der gefunden Artikel gewünscht ist, kann die Varibale $doExc in livesearch.php:26 auf TRUE gesetzt werden.

Live anzusehen in meinem Txp Blog.