Entwickelt man ein eigenes Drupal 6.x Modul sind einige Dinge wirklich seeehr nervig:
- Modul-Entwicklung ist langwierig: ist der Code fehlerhaft gibts nur eine weisse Seite
- Drupal "cached sich einen Wolf". Selbst bei einem Filter der bei "no cache" true returned. Bei einigen Hooks (z.B. menu) muss man explizit den jeweiligen Cache leeren.
- Beispiele sind entweder veraltet (v4.7/v5.x) oder fuer das Problem ueberdimensioniert
Probleme und Loesungen werde ich im Folgenden genauer beschreiben:
Dann wollen wir mal dem Drupal Moduldschungel unser eigenes Modul hinzufuegen. Zunaechst eine moegliche .info fuer unser Modul:
== myfilter.info ==
name = myfilter
description = myfilter
package = Filters
version = 0.1
core = 6.x
Beispiel fuer einen Filter, der ::filterme:: im Body Text eines Nodes durch "I was filtered!" in h1 tags ersetzt.
Filter einschalten durch Aktivieren des Moduls und Anhaken des Filters bei einem Input Format (z.B. FULL HTML)
== myfilter.module ==
PHP:
<?php
function myfilter_filter($op, $delta = 0, $format = -1, $text = '') {
switch ($op) {
case 'list': return array('my filter name');
case 'description': return t('description of my filter');
case 'process': $text = preg_replace('@::filterme::@',' <h1>I was filtered! (but being cached after last node edit!)</h1>', $text); return $text;
case 'no cache': return TRUE; // when developing: true, else false
default: return $text;
}
}
?>
(sorry the php syntax highlighting plugin seems to have some problems with newlines at the moment, will fix it later)
Fortan wird jetzt ::filterme:: ersetzt, aber - und das ist wichtig - jeweils direkt nur nach dem Speichern nach einem EDIT des Nodes. Danach kommt es aus dem Cache!
Hier darf man also z.B. kein " global $user; echo 'Your Name is: '.$user->name; " fabrizieren, sonst wird z.B. der User Hase als User Fuchs bezeichnet
Wie umgeht man dies nun? Hierzu gibt es einen hook in der nodeapi mit der $op="alter". vereinfacht gesagt: dies ist einer der letzten schliffe die angelegt werden, bevor der node an den browser ausgegeben wird. und besonders wichtig: die ausgabe erfolgt NICHT gecached, eignet sich also zur anzeige sehr dynamischer Inhalte.
== myfilter.module ==
PHP:
<?php
function myfilter_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'alter':
global $user;
print_r("currently logged in user name is: ".$user->name);
$node->body = preg_replace('@::filterdynamic::@','
<h1>always uncached dynamic value</h1>', $node->body);
break;
}
?>
Den Artikel feile ich ggf. noch weiter aus, sofern Interesse besteht
Ggf. auch ueber die ersten Drupal mit Ajax Erfolgserlebnisse. Es gibt zwar ein Modul was angebl. alle Caches leert, dem ist aber nicht so. Falls das arg nervt (mich schon): das administration module installieren und oben links auf das Icon klicken. Hooks ins Menue System z.B. kann man dort via "flush menu cache" auffrischen.
Anregungen und Kritik sind natuerlich gerne als Kommentar zu diesem Beitrag gesehen.