Pear Praxis 1 oder "Früher ins Wochenende"

13

Click here to load reader

description

Vorstellung einer PEAR Klassen bei der PHP Usergroup Hannover am 2.12.2004

Transcript of Pear Praxis 1 oder "Früher ins Wochenende"

Page 1: Pear Praxis 1 oder "Früher ins Wochenende"

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 <[email protected]>

Page 2: Pear Praxis 1 oder "Früher ins Wochenende"

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

Page 3: Pear Praxis 1 oder "Früher ins Wochenende"

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

Page 4: Pear Praxis 1 oder "Früher ins Wochenende"

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.

Page 5: Pear Praxis 1 oder "Früher ins Wochenende"

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.

Page 6: Pear Praxis 1 oder "Früher ins Wochenende"

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.

Page 7: Pear Praxis 1 oder "Früher ins Wochenende"

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.

Page 8: Pear Praxis 1 oder "Früher ins Wochenende"

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');

Page 9: Pear Praxis 1 oder "Früher ins Wochenende"

9

$form->registerRule('ownrule', 'callback', 'myrule');

$form->addRule('url', 'Bitte eine gültige Webadresse eingeben', 'ownrule');

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/

Page 10: Pear Praxis 1 oder "Früher ins Wochenende"

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();

Page 11: Pear Praxis 1 oder "Früher ins Wochenende"

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

Page 12: Pear Praxis 1 oder "Früher ins Wochenende"

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: [email protected] 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

Page 13: Pear Praxis 1 oder "Früher ins Wochenende"

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