Navigation
Suche
Nichts gefunden?Suche mit erweiterten Optionen.
Anzeigen
Werbung
Kfz Ersatzteile.CMS Software Preise.
Datenrettung.
SEO Beratung.
Baufinanzierung .
Anmeldung
Download
Zikula 1.0.2
Dt. Sprachpakete Download
SVN Nightly Builds
Zikula SVN Build
Artikel-Archiv
- nach Kategorie
- Buch-Tipps.
- CMS Allgemein.
- CMS Anleitungen.
- CMS Blöcke.
- CMS Interview.
- CMS Module.
- CMS Sicherheit.
- CMS Themes.
- pnMeeting.
- PostNuke e.V..
- Steering Committee.
- nach Datum
- August 2008.
- Juli 2008.
- Juni 2008.
- Mai 2008.
- April 2008.
- März 2008.
- Februar 2008.
- Januar 2008.
- Dezember 2007.
- November 2007.
- Oktober 2007.
- September 2007.
Tipps für .8 Modul-Entwickler VI: pnForm
Freitag, 01. Dezember 2006, 2 Kommentare
Meine Ansatzpunkt war der Beitrag zu pnForm im englischen Wiki. Das dortige Beispiel ist aber zur Zeit noch etwas knapp beschrieben. Vielleicht werde ich das nach diesem Artikel ändern.
Das Formularsystem besteht aus 3 Teilen:
1. In einer normalen Funktion wird ein neues Formular-Object instantiiert:
zurückgegeben wird das Object, dem ein Template und ein sogenannter Handler zugewiesen werden. In dem Template wird natürlich das Formular erstellt und der Handler ist eine Klasse, die die Benutzereingaben übernimmt, überprüft und erst speichert, wenn alles korrekt ist. Sind Fehler in der Eingabe, wird das Formular mit einem entsprechenden Hinweis erneut angezeigt. Um all das muss sich der Modul-Programmierer nicht mehr kümmern.
2. Das Formular-Template ist ein ganz normales pnRender-Template, in dem man HTML und alle bekannten pnRender-Funktionen benutzen kann. Dadurch aber, dass das Template weiß, dass es ein Formular sein soll, stehen auch die Plugins von pnForm zur Verfügung. Außerdem weiß das Template, wohin die Daten geschickt werden sollen, wenn das Formular abgeschickt wird.
Mit pnForm wird das Formular geöffnet und geschlossen.
pnFormValidationSummary gibt die Fehlermeldung aus, wenn Eingaben falsch waren.
Bei den anderen Plugins kann man schon so erkennen, dass damit ein Label ein Datumsfeld und die Buttons für Abbrechen und Speichern erzeugt werden.
Beim Datumsfeld sieht man aber schon den Vorteil von pnForm: Im Template steht nur ein kurzer Aufruf. pnRender erzeugt daraus nicht nur ein einfaches Input-Feld, sondern setzt dahinter ein kleines Kalender-Bildchen. Wenn man dort draufklickt, geht ein Popup mit einem JavaScript-Kalender auf, über den man bequem das Datum auswählen kann. Außerdem wird das Feld markiert, wenn der Handler zurückmeldet, dass das Datum falsch ist.
BTW: Die Plugin-Namen werden vor dem nächsten Milestone noch alle auf Kleinbuchstaben umgestellt, damit sie benannt sind, wie die anderen Core-Plugins auch.
3. Der Handler besteht aus 2 Funktionen in einer Klasse, die einfach in der selben Datei eingefügt werden kann, in der auch schon die oben genannte Funktion liegt.
In der initialize-Funktion können die Werte an das Formular übergeben werden, die im Formular vorgegeben sein sollen. In der Administration zum Beispiel ist es mehr als praktisch, wenn in den Formularen die Werten eingetragen sind, die bisher gespeichert wurden.
In der HandleCommand-Funktion werden dann die Aktionen durchgeführt, die ausgelöst werden, wenn das Formular abgeschickt wird. Wie man im Template sieht, hat der Absende-Button den Parameter commandName="Update" - dieser wird in dieser Funktion gesucht. Dann wird mit der Zeile $pnRender->pnFormIsValid() geschaut, ob die Eingaben valide sind (Ja! Mit einer Zeile!) - und nur wenn sie es sind, werden sie gespeichert. In diesem Fall in einer Modulvariablen. Aber man kann hier natürlich auch andere Datenbank Aktionen durchführen.
Bei der Arbeit mit pnForms ist mir aufgefallen, dass einige Dinge noch nicht ganz rund sind - das System funktioniert aber und wer schon jetzt damit arbeitet, wird vermutlich bis zum final Release von .8 nur wenige Sachen anpassen müssen.
Das Formularsystem besteht aus 3 Teilen:
1. In einer normalen Funktion wird ein neues Formular-Object instantiiert:
Code
function mymodule_user_edit($args)<br />
{<br />
$render = FormUtil::newpnForm('mymodule');<br />
return $render->pnFormExecute('mymodule_user_edit.html', new mymodule_user_editHandler());<br />
}<br />
{<br />
$render = FormUtil::newpnForm('mymodule');<br />
return $render->pnFormExecute('mymodule_user_edit.html', new mymodule_user_editHandler());<br />
}<br />
zurückgegeben wird das Object, dem ein Template und ein sogenannter Handler zugewiesen werden. In dem Template wird natürlich das Formular erstellt und der Handler ist eine Klasse, die die Benutzereingaben übernimmt, überprüft und erst speichert, wenn alles korrekt ist. Sind Fehler in der Eingabe, wird das Formular mit einem entsprechenden Hinweis erneut angezeigt. Um all das muss sich der Modul-Programmierer nicht mehr kümmern.
2. Das Formular-Template ist ein ganz normales pnRender-Template, in dem man HTML und alle bekannten pnRender-Funktionen benutzen kann. Dadurch aber, dass das Template weiß, dass es ein Formular sein soll, stehen auch die Plugins von pnForm zur Verfügung. Außerdem weiß das Template, wohin die Daten geschickt werden sollen, wenn das Formular abgeschickt wird.
Code
Mit pnForm wird das Formular geöffnet und geschlossen.
pnFormValidationSummary gibt die Fehlermeldung aus, wenn Eingaben falsch waren.
Bei den anderen Plugins kann man schon so erkennen, dass damit ein Label ein Datumsfeld und die Buttons für Abbrechen und Speichern erzeugt werden.
Beim Datumsfeld sieht man aber schon den Vorteil von pnForm: Im Template steht nur ein kurzer Aufruf. pnRender erzeugt daraus nicht nur ein einfaches Input-Feld, sondern setzt dahinter ein kleines Kalender-Bildchen. Wenn man dort draufklickt, geht ein Popup mit einem JavaScript-Kalender auf, über den man bequem das Datum auswählen kann. Außerdem wird das Feld markiert, wenn der Handler zurückmeldet, dass das Datum falsch ist.
BTW: Die Plugin-Namen werden vor dem nächsten Milestone noch alle auf Kleinbuchstaben umgestellt, damit sie benannt sind, wie die anderen Core-Plugins auch.
3. Der Handler besteht aus 2 Funktionen in einer Klasse, die einfach in der selben Datei eingefügt werden kann, in der auch schon die oben genannte Funktion liegt.
Code
class mymodule_admin_modifyconfigHandler<br />
{<br />
var $id;<br />
function initialize(&$pnRender)<br />
{<br />
$this->id = (int)FormUtil::getPassedValue('id', 0);<br />
$pnRender->assign('wert1', pnModGetVar('mymodule', 'wert1'));<br />
return true;<br />
}<br />
<br />
function handleCommand(&$pnRender, &$args)<br />
{<br />
if ($args['commandName'] == 'update')v
{<br />
if (!$pnRender->pnFormIsValid())<br />
return false;<br />
$data = $pnRender->pnFormGetValues();<br />
pnModSetVar('mymodule', 'wert1', $data[wert1]);<br />
}<br />
return true;<br />
} <br />
}<br />
{<br />
var $id;<br />
function initialize(&$pnRender)<br />
{<br />
$this->id = (int)FormUtil::getPassedValue('id', 0);<br />
$pnRender->assign('wert1', pnModGetVar('mymodule', 'wert1'));<br />
return true;<br />
}<br />
<br />
function handleCommand(&$pnRender, &$args)<br />
{<br />
if ($args['commandName'] == 'update')v
{<br />
if (!$pnRender->pnFormIsValid())<br />
return false;<br />
$data = $pnRender->pnFormGetValues();<br />
pnModSetVar('mymodule', 'wert1', $data[wert1]);<br />
}<br />
return true;<br />
} <br />
}<br />
In der initialize-Funktion können die Werte an das Formular übergeben werden, die im Formular vorgegeben sein sollen. In der Administration zum Beispiel ist es mehr als praktisch, wenn in den Formularen die Werten eingetragen sind, die bisher gespeichert wurden.
In der HandleCommand-Funktion werden dann die Aktionen durchgeführt, die ausgelöst werden, wenn das Formular abgeschickt wird. Wie man im Template sieht, hat der Absende-Button den Parameter commandName="Update" - dieser wird in dieser Funktion gesucht. Dann wird mit der Zeile $pnRender->pnFormIsValid() geschaut, ob die Eingaben valide sind (Ja! Mit einer Zeile!) - und nur wenn sie es sind, werden sie gespeichert. In diesem Fall in einer Modulvariablen. Aber man kann hier natürlich auch andere Datenbank Aktionen durchführen.
Bei der Arbeit mit pnForms ist mir aufgefallen, dass einige Dinge noch nicht ganz rund sind - das System funktioniert aber und wer schon jetzt damit arbeitet, wird vermutlich bis zum final Release von .8 nur wenige Sachen anpassen müssen.
Kommentare
Nur angemeldete Benutzer dürfen Kommentare verfassen.
ftree
am 01.12.2006 um 11:34 Uhr
rigo am 01.12.2006 um 17:06 UhrDanke für den Beitrag. Da macht es doch gleich viel mehr Spaß, alte .7x-Module anzupassen.