Navigation


Suche



Nichts gefunden?
Suche mit erweiterten Optionen.

Anzeigen



Werbung

Kfz Ersatzteile
CMS Software Preise
Datenrettung
SEO Beratung
Baufinanzierung

Tipps für .8 Modul-Entwickler VI: pnForm

Freitag, 01. Dezember 2006, 2 Kommentare

geschrieben von
CMS Anleitungen : pnForm ist eine Erweiterung für pnRender, mit der sich ab Postnuke .8 Formulare erzeugen und die Eingaben der Benutzer validieren lassen. Für die Arbeit an Publish! habe ich ein wenig mit diesem System herumgespielt und vermutlich nur an der Oberfläche gekratzt. Es handelt sich aber offenbar um ein feines System, das einem die nervige Arbeit der Eingabevalidierung komplett abnimmt.
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:

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 />

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

<!--[pnForm]--><br />
  <!--[pnFormValidationSummary]--><br />
  <!--[pnFormLabel for=date text="Date"]-->:<br />
  <!--[pnFormDateInput id=date]--><br/>
  <!--[pnFormButton commandName="update" text="Update"]--><br />
  <!--[pnFormButton commandName="cancel" text="Cancel"]--><br />
<!--[/pnForm]--><br />

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 />

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.
Mister Wong iconTechnorati iconDigg icondel.icio.us iconma.gnolia iconFurl iconNewsvine iconReddit iconYahoo MyWeb iconBlinkbits iconGoogle iconSimpy iconBlogmarks icon

Kommentare

Nur angemeldete Benutzer dürfen Kommentare verfassen.

Zur Registrierung/Anmeldung

 

Super auf so etwas hab ich schon lange gewartet.

Werd ich in meinem neuem Modul gleich mal ausprobieren.

ftree am 01.12.2006 um 11:34 Uhr
 

Danke für den Beitrag. Da macht es doch gleich viel mehr Spaß, alte .7x-Module anzupassen.

rigo am 01.12.2006 um 17:06 Uhr