SlideShare ist ein Scribd-Unternehmen logo
1 von 13
Downloaden Sie, um offline zu lesen
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>
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 
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 
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 
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 
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 
$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 
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');
$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 
?> 
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 
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 
$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 
• 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

Weitere ähnliche Inhalte

Andere mochten auch

Warum studiere ich Geschichte
Warum studiere ich GeschichteWarum studiere ich Geschichte
Warum studiere ich Geschichte
yoni456
 
Informe escuela estruturalista copiaClase Dra Ana Chavez
Informe escuela estruturalista   copiaClase Dra Ana ChavezInforme escuela estruturalista   copiaClase Dra Ana Chavez
Informe escuela estruturalista copiaClase Dra Ana Chavez
Mely Bustillos
 
Roboterwettbewerb 2011: Teilnahmebedingungen
Roboterwettbewerb 2011: TeilnahmebedingungenRoboterwettbewerb 2011: Teilnahmebedingungen
Roboterwettbewerb 2011: Teilnahmebedingungen
zukunft-durch-innovation
 
Elíxir- CONTROL DE CALIDAD
Elíxir- CONTROL DE CALIDADElíxir- CONTROL DE CALIDAD
Elíxir- CONTROL DE CALIDAD
May Román
 
E Xe Leraning Plus 100327 K O E V1
E Xe Leraning Plus 100327  K O E  V1E Xe Leraning Plus 100327  K O E  V1
E Xe Leraning Plus 100327 K O E V1
Dietmar Köb
 

Andere mochten auch (18)

Warum studiere ich Geschichte
Warum studiere ich GeschichteWarum studiere ich Geschichte
Warum studiere ich Geschichte
 
Instituto universitario de tecnología
Instituto universitario de tecnologíaInstituto universitario de tecnología
Instituto universitario de tecnología
 
3 a+familias bueno
3 a+familias bueno3 a+familias bueno
3 a+familias bueno
 
D figuras
D figurasD figuras
D figuras
 
Informe escuela estruturalista copiaClase Dra Ana Chavez
Informe escuela estruturalista   copiaClase Dra Ana ChavezInforme escuela estruturalista   copiaClase Dra Ana Chavez
Informe escuela estruturalista copiaClase Dra Ana Chavez
 
Realismo mágico (1)
 Realismo mágico (1) Realismo mágico (1)
Realismo mágico (1)
 
Yachtcharter Griechenland
Yachtcharter GriechenlandYachtcharter Griechenland
Yachtcharter Griechenland
 
Unglaublich
UnglaublichUnglaublich
Unglaublich
 
Projectleider Sportontwikkelingsproject SMO
Projectleider Sportontwikkelingsproject SMOProjectleider Sportontwikkelingsproject SMO
Projectleider Sportontwikkelingsproject SMO
 
las tic
las ticlas tic
las tic
 
2 Faktor Authentifizierung - WordPress Login absichern
2 Faktor Authentifizierung - WordPress Login absichern2 Faktor Authentifizierung - WordPress Login absichern
2 Faktor Authentifizierung - WordPress Login absichern
 
Deber 10
Deber 10Deber 10
Deber 10
 
Me
MeMe
Me
 
01 Was Ist Moodle Black
01 Was Ist Moodle Black01 Was Ist Moodle Black
01 Was Ist Moodle Black
 
Roboterwettbewerb 2011: Teilnahmebedingungen
Roboterwettbewerb 2011: TeilnahmebedingungenRoboterwettbewerb 2011: Teilnahmebedingungen
Roboterwettbewerb 2011: Teilnahmebedingungen
 
Elíxir- CONTROL DE CALIDAD
Elíxir- CONTROL DE CALIDADElíxir- CONTROL DE CALIDAD
Elíxir- CONTROL DE CALIDAD
 
E Xe Leraning Plus 100327 K O E V1
E Xe Leraning Plus 100327  K O E  V1E Xe Leraning Plus 100327  K O E  V1
E Xe Leraning Plus 100327 K O E V1
 
Umgang mit Menschen, Dale Carnegie
Umgang mit Menschen, Dale CarnegieUmgang mit Menschen, Dale Carnegie
Umgang mit Menschen, Dale Carnegie
 

Ähnlich wie Pear Praxis 1 oder "Früher ins Wochenende"

YAFOWIL - Webformulare in Python ohne Kopfschmerzen
YAFOWIL - Webformulare in Python ohne KopfschmerzenYAFOWIL - Webformulare in Python ohne Kopfschmerzen
YAFOWIL - Webformulare in Python ohne Kopfschmerzen
Jens Klein
 
Anforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenAnforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML Grundlagen
Christian Baranowski
 
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific LanguagesAgiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
Dominik Hirt
 
Webservices - was ist das und wie programmiert man sie
Webservices - was ist das und wie programmiert man sieWebservices - was ist das und wie programmiert man sie
Webservices - was ist das und wie programmiert man sie
Claus Brell
 

Ähnlich wie Pear Praxis 1 oder "Früher ins Wochenende" (20)

Formulare // MM 08-11
Formulare // MM 08-11Formulare // MM 08-11
Formulare // MM 08-11
 
Interprozesskommunikation mit PHP
Interprozesskommunikation mit PHPInterprozesskommunikation mit PHP
Interprozesskommunikation mit PHP
 
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
 
YAFOWIL - Webformulare in Python ohne Kopfschmerzen
YAFOWIL - Webformulare in Python ohne KopfschmerzenYAFOWIL - Webformulare in Python ohne Kopfschmerzen
YAFOWIL - Webformulare in Python ohne Kopfschmerzen
 
XML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashXML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit Flash
 
Newsletter-Formulare
Newsletter-FormulareNewsletter-Formulare
Newsletter-Formulare
 
ExsoFlow Workflow & IntegrationServer technische Information
ExsoFlow Workflow & IntegrationServer technische InformationExsoFlow Workflow & IntegrationServer technische Information
ExsoFlow Workflow & IntegrationServer technische Information
 
Anforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenAnforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML Grundlagen
 
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerkTYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
 
DACHNUG50 LeapTippsAndTricks.pdf
DACHNUG50 LeapTippsAndTricks.pdfDACHNUG50 LeapTippsAndTricks.pdf
DACHNUG50 LeapTippsAndTricks.pdf
 
TYPO3 CMS 7.6 - Die Neuerungen - pluswerk
TYPO3 CMS 7.6 - Die Neuerungen - pluswerkTYPO3 CMS 7.6 - Die Neuerungen - pluswerk
TYPO3 CMS 7.6 - Die Neuerungen - pluswerk
 
Dynamische Websites mit XML
Dynamische Websites mit XMLDynamische Websites mit XML
Dynamische Websites mit XML
 
2 1b-prozessmodellierung-eepk-erweiterung-200406
2 1b-prozessmodellierung-eepk-erweiterung-2004062 1b-prozessmodellierung-eepk-erweiterung-200406
2 1b-prozessmodellierung-eepk-erweiterung-200406
 
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific LanguagesAgiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
 
Regelbasierte Systeme mit JBoss Drools
Regelbasierte Systeme mit JBoss DroolsRegelbasierte Systeme mit JBoss Drools
Regelbasierte Systeme mit JBoss Drools
 
Webservices - was ist das und wie programmiert man sie
Webservices - was ist das und wie programmiert man sieWebservices - was ist das und wie programmiert man sie
Webservices - was ist das und wie programmiert man sie
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisieren
 
Datentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsDatentransfer mit Oracle Tools
Datentransfer mit Oracle Tools
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Jpgraph - eine Einführung
Jpgraph - eine EinführungJpgraph - eine Einführung
Jpgraph - eine Einführung
 

Mehr von frankstaude

Mehr von frankstaude (20)

State of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
State of TV – Vortragsaufzeichnung, aktueller Stand und AusblickState of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
State of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
 
Automatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
Automatisierung in Zeiten von Social Media, Messenger-Diensten und BotsAutomatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
Automatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
 
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
 
TablePress - Warum und welche Erweiterungen gibt es?
TablePress - Warum und welche Erweiterungen gibt es?TablePress - Warum und welche Erweiterungen gibt es?
TablePress - Warum und welche Erweiterungen gibt es?
 
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der SchuleGamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
 
Erneute Bestellung in WooCommerce
Erneute Bestellung in WooCommerceErneute Bestellung in WooCommerce
Erneute Bestellung in WooCommerce
 
Gamification mit WordPress
Gamification mit WordPressGamification mit WordPress
Gamification mit WordPress
 
Mobile Apps mit WordPress
Mobile Apps mit WordPressMobile Apps mit WordPress
Mobile Apps mit WordPress
 
Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?
 
State of TV - Stand der Vortragsaufzeichnung 11/2017
State of TV - Stand der Vortragsaufzeichnung 11/2017State of TV - Stand der Vortragsaufzeichnung 11/2017
State of TV - Stand der Vortragsaufzeichnung 11/2017
 
Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?
 
Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?
 
Themes – Wieso, Weshalb, Warum!?
Themes – Wieso, Weshalb, Warum!?Themes – Wieso, Weshalb, Warum!?
Themes – Wieso, Weshalb, Warum!?
 
Eine WordPress Meetup Webseite auf Autopilot
Eine WordPress Meetup Webseite auf AutopilotEine WordPress Meetup Webseite auf Autopilot
Eine WordPress Meetup Webseite auf Autopilot
 
Vorträge aufzeichnen ohne Nachbearbeitung
Vorträge aufzeichnen ohne NachbearbeitungVorträge aufzeichnen ohne Nachbearbeitung
Vorträge aufzeichnen ohne Nachbearbeitung
 
Nürnberg WordPress Meetup - Custom Post Types mit PODS.io
Nürnberg WordPress Meetup - Custom Post Types mit PODS.ioNürnberg WordPress Meetup - Custom Post Types mit PODS.io
Nürnberg WordPress Meetup - Custom Post Types mit PODS.io
 
WordPress - eigene Plugins erstellen
WordPress - eigene Plugins erstellenWordPress - eigene Plugins erstellen
WordPress - eigene Plugins erstellen
 
Custom Post Types mit PODS.io
Custom Post Types mit PODS.ioCustom Post Types mit PODS.io
Custom Post Types mit PODS.io
 
Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?
 
Pressmatic
PressmaticPressmatic
Pressmatic
 

Pear Praxis 1 oder "Früher ins Wochenende"

  • 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