1. PEAR Praxis, Teil 1
Oder
„Früher ins Wochenende“
Heute: über Formulare, FTP und RSS
Vortrag vom 02.12.2004 bei der PHP-Usergroup Hannover
von Frank Staude <staude@trilos.de>
2. Einleitung ................................................................................................................................... 3
HTML_QuickForm.................................................................................................................... 3
Voraussetzung ........................................................................................................................ 3
Los geht’s ............................................................................................................................... 4
Sonstiges................................................................................................................................. 9
RSS............................................................................................................................................. 9
Voraussetzung ........................................................................................................................ 9
Alle an die Pumpen .............................................................................................................. 10
FTP........................................................................................................................................... 11
Voraussetzung ...................................................................................................................... 11
Machen ................................................................................................................................. 11
Der Author................................................................................................................................ 12
Links......................................................................................................................................... 12
2
3. 3
Einleitung
Immer wieder hört man von PEAR. Auch in der PHPG Hannover hatten wir schon Vorträge
dazu („Einführung in PEAR“1 von Sebastian (bereits vor 2 Jahren)) und auch danach
geisterte die Birne wieder und wieder durch die Diskussionen und die Mailingliste. Aber
außer dem Hinweis, dass es etwas wie PEAR gibt fehlt den meisten der Praktische Bezug
bzw. der Praktische Ansatz um sich endlich einmal damit zu befassen.
Dass man durch die Objektorientiertheit in PHP Zeit sparen kann, dadurch dass man Code so
schreibt dass er wieder verwertbar ist, ist klar (siehe auch Vortrag. „Die Containerfrachter"2
von Uli (12.6.2003)). Wenn das viele tun und sie sich vorher auf Coding Standards3 geeinigt
haben, dann bekommt man eine große Sammlung von Code mit dem man Quasi sofort
umgehen kann und den man lesen und warten kann. Eine solche Objektbibliothek ist PEAR.
Und gerade für viele „Standart Anwendungsfälle“ die einen sonst immer viel Zeit kosten, gibt
es sehr leistungsfähige Klassen.
In der Reihe „Pear Praxis“ werde ich in unregelmäßigen Abständen immer mal wieder
interessante, nützliche Klassen aus dem PEAR vorstellen.
HTML_QuickForm
Formulare sind meines Erachtens diejenigen Dinge, mit denen man
wahnsinnig viel Zeit verbringen kann. Des weiteren sind sie das Bindeglied
zwischen Anwender und Anwendung. Wenn dann noch Dinge wie
Pflichtfelder, Überprüfung der Eingaben usw. dazukommen, kann das bei
vielen oder komplexen Formularen schon richtig Arbeit werden. Wenn dann
der Kunde an einem Freitag Nachmittag für die Präsentation am
Montagmorgen noch Änderungen haben will kann man sich das Wochenende abschminken –
muss aber nicht so sein.
Genau genommen sind es doch die immer gleichen wiederkehrenden Arbeitsschritte:
Ein Formular wird mit Daten gefüllt, der Benutzer bekommt es angezeigt, die Änderungen
des Benutzers kommen zurück und müssen überprüft werden und wenn alles in Ordnung ist
kann man die Daten weiterverarbeiten. Meistens baut man das mehr oder weniger jedes Mal
neu mit entsprechend viel Aufwand. Hier kann uns das Paket HTML_QuickForm sehr viel
Arbeit ersparen.
Voraussetzung
Außer dem PEAR Paket benötigt HTML_QuickForm lediglich noch das Paket
HTML_Common in Version >= 1.2.1.
Downloaden kann man es unter: http://pear.php.net/package/HTML_QuickForm/download
HTML_QuickForm ist sehr mächtig und es bedarf einiges an Zeit, um es vollständig nutzen
zu können.
1 http://www.sebastian-r.de/phpug/pear.pdf
2 http://www.hacke.net/php/containerfrachter/
3 http://pear.php.net/manual/en/standards.php
4. 4
Los geht’s
Als erstes bauen wir ein einfaches Formular das folgendermaßen aussieht.
Als erstes wird eine neue Formularinstanz erzeugt.
// QuickForm laden
require_once('HTML/QuickForm.php');
// Neues Formular erzeugen
$form = new HTML_QuickForm('mainForm', 'post');
Der QuickForm Konstruktor hat 3 Parameter. Der erste ist der Name des Formulars, wie er im
HTML FormTag verwendet wird. Der zweite Parameter legt fest wie das Formular versendet
wird (get oder post) und der dritte, optionale Parameter legt die Adresse fest, an die die
Formulardaten gesendet werden. Wenn man diesen Parameter weglässt wird die aktuelle Seite
erneut mit den Formulardaten aufgerufen.
Nun werden wir mir addElement einzelne Elemente an das Formular anfügen.
$form->addElement('header', null, 'Mein Formular');
$form->addElement('text', 'firstName', 'Vorname:', array('size' => 20,
'maxlength' => 255));
$form->addElement('text', 'lastName', 'Nachname:');
Die Parameter von addElement sind: 1. Typ des Elements. 2. eindeutiger Name, 3.
Beschriftung und 4. (optional) weitere Parameter als Array.
Als Elementtyp kann jedes von HTML Formularen bekanntes Element verwendet werden, so
wie in diesem Beispiel ‚text’. Header’ ist ein Pseudoelement und dient als Überschrift.
5. 5
Für das Datumsfeld verwenden wir den Typen ‚date’.
$form->addElement('date', 'birthday', 'Geboren am:', array('format'=>'d-F-Y',
'language'=>'de', 'minYear'=>1900, 'maxYear'=>2000));
Das Format wird beschrieben wie auch beim Date Befehl von PHP.
Anschließend noch die beiden Felder Email und URL , den Submit-Button und dann noch den
Code um das Formular darzustellen.
$form->addElement('text', 'mail', 'Email:');
$form->addElement('text', 'url', 'URL:');
$form->addElement('submit', null, 'ok');
if ($form->validate()) {
$form->process('speichern', false);
} else {
$form->display();
}
Mit validate() wird überprüft ob das Formular gültig ist. Dazu muss es sowohl überhaupt
Daten empfangen haben und diese Daten müssen den festgelegten Regeln für die Felder
entsprechen. Wenn das beides der Fall ist wird über process() eine von uns festzulegende
Funktion (hier ‚speichern’) aufgerufen die sich um die Verarbeitung der Daten kümmert
Der Vorteil ist, dass die Verarbeitungsroutine davon ausgehen kann Immer gültige Daten zu
bekommen. Andernfalls, wenn die Formulardaten nicht gültig sind oder noch keine Daten
eingegeben worden, wird über display() das Formular dargestellt.
Nun haben wir zwar das obrige Formular, aber noch keinen echten Vorteil. Ich schrieb ja eben
davon dass Formulare bestimmten Regeln entsprechen müssen, damit sie gültig sind.
Sehr oft werden ja die Eingaben aus Formularen einfach ungeprüft verarbeitet. Im einfachsten
Fall hat dann nur schlechte Daten, im schlimmsten Fall ein Sicherheitsproblem (Ausführung
von Code, SQLinjection)
Als erstes legen wir also fest das Nachname, Email und URL Pflichtfelder sind.
$form->addRule('lastName', 'Bitte den Nachnamen eingeben:', 'required');
$form->addRule('mail', 'Bitte die Emailadresse eingeben', 'required');
$form->addRule('url', 'Bitte die Webadresse eingeben', 'required');
Diese addRule Aufrufe vor der Überprüfung mit validate() sorgen dafür, dass die Felder als
Pflichtfelder markiert werden.
6. 6
Schicke ich das Formular nur halb ausgefüllt zurück bekomme ich von den weiteren
Pflichtfeldern einen entsprechenden Hinweis.
Nun ist zwar Email ein Pflichtfeld, aber noch nicht automatisch eine echte Emailadresse.
Dazu kann man QuickForm anweisen es auf eine Emailadresse zu überprüfen.
7. 7
$form->addRule('mail', 'Bitte die gültige Emailadresse eingeben',
'email');
Weitere eingebaute Regeln sind:
required Feld darf nicht leer sein
maxlength Maximale Länge des Feldes
minlength Minimale Länge des Feldes
rangelength
Länge des Feldes darf nur im angegebenen Intervall
liegen
email Feld ist syntaktisch eine gültige eMail Adresse
regex Feld passt zu dem angegebenen Regulären Ausdruck
lettersonly Feld darf nur aus Buchstaben bestehen
alphanumeric Feld darf nur aus Buchstaben und Zahlen bestehen
numeric Feld muss eine Zahl sein
Und da das nicht ausreicht kann man auch eigene Funktionen als Regeln definieren. So wäre
es denkbar bei einer Email zu überprüfen ob der zu einer Domain gehörige MX-Server auch
Emails für diesen Benutzer annimmt.
Für das Feld URL wollen wir überprüfen ob von der Adresse überhaupt Daten gesendet
werden.
Dazu brauchen wir eine Funktion die die Prüfung vornimmt und entsprechend true oder false
zurückliefert und die neue Regel muss bekannt gemacht werden.
function myrule($value)
{
// code der etwas überprüft.
return false;
}
$form->registerRule('ownrule', 'callback', 'myrule');
$form->addRule('url', 'Bitte eine gültige Webadresse eingeben', 'ownrule');
Momentan liefert myrule() immer false. Was zur folge hat, dass immer wenn das Feld URL
Inhalt hat, die Meldung „Bitte eine gültige Webadresse eingeben“ ausgegeben wird.
In der myrule() Funktion müsste natürlich versucht werden eine Verbindung zu der URL
aufzunehmen und entsprechend ob Daten zurückkommen oder nicht true oder false
zurückgeliefert werden.
8. 8
Der vollständige Code sieht nun so aus:
<?
// Bei lokaler PEAR-Installation include-Pfad umbiegen
ini_set ("include_path", "./PEAR");
// QuickForm laden
require_once('HTML/QuickForm.php');
// Neues Formular erzeugen
$form = new HTML_QuickForm('mainForm', 'post');
function myrule($value)
{
return false;
}
$form->addElement('header', null, 'Mein Formular');
$form->addElement('text', 'firstName', 'Vorname:', array('size' => 20,
'maxlength' => 255));
$form->addElement('text', 'lastName', 'Nachname:');
$form->addElement('date', 'birthday', 'Geboren am:', array('format'=>'d-F-Y',
'language'=>'de', 'minYear'=>1900, 'maxYear'=>2000));
$form->addElement('text', 'mail', 'Email:');
$form->addElement('text', 'url', 'URL:');
$form->addElement('submit', null, 'ok');
$form->addRule('lastName', 'Bitte den Nachnamen eingeben:', 'required');
$form->addRule('mail', 'Bitte die Emailadresse eingeben', 'required');
$form->addRule('mail', 'Bitte die gültige Emailadresse eingeben',
'email');
$form->addRule('url', 'Bitte die Webadresse eingeben', 'required');
9. $form->registerRule('ownrule', 'callback', 'myrule');
$form->addRule('url', 'Bitte eine gültige Webadresse eingeben', 'ownrule');
9
if ($form->validate()) {
$form->process('speichern', false);
} else {
$form->display();
}
?>
Sonstiges
Die englische Meldung „denotes required field“ überschreibt man mit der Funktion
setRequiredNote()
Dies ist eine erste, kleine Einführung in QuickForm um einen Einstieg zu finden. QuickForm
ist mächtig, braucht aber auch Zeit um verstanden zu werden. Außer den eigenen
Outputrenderer kann es auch mit Smarty, HTML_Template_Sigma, HTML_Template_IT,
HTML_Template_Flexy reden. Man kann die eingebauten Regeln sowohl serverseitig als
auch im Browser (Javascript) ablaufen lassen und natürlich kann man auch die Felder mit
Defaultwerten versehen.
Und dann gibt es noch Klassen die wiederum auf QuickForm aufbauen.
QuickForm_Controller4 ist so eine.
RSS
An RSS-feeds kommt man ja fast nirgends mehr vorbei. Aber auch ohne
gleich Tagebücher in der Öffentlichkeit zu führen, kann es ja ganz
nützlich sein, Content untereinander auszutauschen. Und da bietet sich
RSS wiederum an, da fest jedes CMS irgendwie in der Lage ist einen
solchen feed zu erzeugen.
Wie aber kriegen wir die Daten rein und können sie möglichst einfach und bequem
verarbeiten? Wie nicht anders vermutet gibt es ein PEAR Paket XML_RSS5
Voraussetzung
Außer dem PEAR Paket benötigt XML_RSS lediglich noch die Pakete XML_Tree6 und
XML_Parser7
Downloaden kann man es unter: http://pear.php.net/package/XML_RSS/download
Wenn der RSS-feed den man einlesen möchte auf einem entfernten Rechner ist muss
allow_url_fopen erlaubt sein. Man kann es auch per ini_set() in seinem Script setzen.
<?
if (ini_get("allow_url_fopen") == 0) {
ini_set("allow_url_fopen", 1);
}
4 http://pear.php.net/manual/de/package.html.html-quickform-controller.php
5 http://pear.php.net/package/XML_RSS/
6 http://pear.php.net/package/XML_Tree/
7 http://pear.php.net/package/XML_Parser/
10. 10
?>
Außerdem muss sichergestellt sein, dass man nicht durch eine Firewall geblockt wird.
Alle an die Pumpen
Beispielhaft holen wir einmal die aktuellen Nachrichten des RSS-Feeds von Kristian
Köhntopp der unter der URL http://blog.koehntopp.de/rss.php?version=2.0
liegt und geben Sie als einfache Linkliste aus.
Das dazugehörige Script sieht so aus:
<?
// Bei lokaler PEAR-Installation include-Pfad umbiegen
ini_set ("include_path", "./PEAR");
require_once "XML/RSS.php";
$rss =& new XML_RSS("http://blog.koehntopp.de/rss.php?version=2.0");
$rss->parse();
11. 11
echo "<h1>Die wunderbare Welt von <a
href="http://blog.koehntopp.de">Isotopp</a></h1>n";
echo "<ul>n";
foreach ($rss->getItems() as $item) {
echo "<li><a href="" . $item['link'] . "">" . $item['title'] .
"</a></li>n";
}
echo "</ul>n";
?>
Die URL des Feeds wird dem XML_RSS Konstruktor übergeben welcher mit parse()
aufgefordert wird den feed zu holen und den XML Inhalt zu parsen.
Danach steht der Inhalt zur Verfügung und man kann mit getItems() gemütlich in einer
foreach Schleife durch die Meldungen steppen und den Inhalt verarbeiten.
Natürlich kann die RSS Klasse noch ein wenig mehr. Die Dokumentation unter
http://pear.php.net/manual/en/package.xml.xml-rss.php hilft da weiter.
Die Funktion getChannelInfo() liefert ein Array zurück mit den Angaben title, link und
description des Feeds. Mit getStructure() kann man die Struktur des Feeds in einem Array
bekommen.
Viel mehr gibt es auch nicht zu sagen. Einfach, Praktisch, Funktioniert.
FTP
Zwar hat PHP von Haus aus FTP Funktionen, aber irgendwie sind die ja doch
eher rudimentär und eine handliche Klasse ist da doch um Klassen besser. PEAR
kann uns auch da weiterhelfen und stellt uns mit dem Paket Net_FTP8 genau so
etwas zur Verfügung.
Voraussetzung
Außer dem PEAR Paket benötigt NET_FTP keine weiteren Klassen. Lediglich der FTP-Support
muss im PHP aktiviert sein.
Downloaden kann man es unter: http://pear.php.net/package/Net_FTP/download
Machen
Um eine lokale Datei per FTP auf einen entfernten Server zu kopieren genügen die folgenden
Zeilen Code.
$ftp = new Net_FTP($server, 21);
Neues FTP Objekt erzeugen (Servername und Portnummer im Konstruktor übergeben)
$ftp->connect();
Mit dem Server verbinden
8 http://pear.php.net/package/Net_FTP
12. 12
$ftp->login($user, $kennwort);
Zum Anmelden die Userdaten (Username, Kennwort) senden.
$ftp->cd($dir);
Auf dem Server in das Zielverzeichnis wechseln.
$ftp->put ($filename, $remotefilename);
Transfer starten. $filename ist der locale Dateiname inkl. Pfad und $remotefilename ist der
Dateiname auf dem Server.
$ftp->disconnect();
Und die Verbindung beenden.
Und das war es. Damit wurde eine Datei per FTP auf den anderen Server übertragen.
Das schöne an der FTP Klasse ist, dass sie auch Dinge wie rekursives get und put unterstützt.
Ein einfacher, gut handhabbarer Wrapper um die PHP-FTP-Funktionen.
Die weiterführende Dokumentation findet sich unter
http://pear.php.net/manual/en/package.networking.net-ftp.php
Der Author
1970 geboren. Gründer und Geschäftsführender Gesellschafter der Trilos9
IT-Dienstleistungen GbR.
Frank Staude
Landwehrstr. 75
30519 Hannover
E-Mail: frank@staude.net
Webseite: http://www.staude.net
PocketPC-Software: http://www.pocketguy.de
PGP-Fingerprint: 1504 336A D8ED A2FD F189 996D DBBE 5A79 A9F2
E6C0
Links
• http://www.phpug-hannover.de/material.php
Alle Vorträge zum Download
• http://pear.php.net/
PHP Extension and Application Repository
• http://pear.php.net/manual/index.php
PEAR Dokumentation
• http://pear.php.net/packages.php
Übersicht PEAR Pakete
9 www.trilos.de
13. 13
• http://smarty.php.net/
Startseite Smarty
• http://smarty.php.net/manual/de/
Deutsche Smarty Dokumentation
• http://pear.php.net/package/HTML_QuickForm
PearPaket HTML_QuickForm
• http://pear.php.net/package/XML_RSS/
RSS Parser
• http://pear.php.net/package/XML_Parser/
XML Parser
• http://pear.php.net/package/XML_Tree/
XML Tree
• http://pear.php.net/package/Net_FTP
FTP Paket