<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Onlinemagazin: devmag.net</title>
	<atom:link href="http://www.devmag.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.devmag.net</link>
	<description>Regelmäßig neue Artikel rund um das Homepage Bauen mit HTML, CSS, AJAX, PHP und XML.</description>
	<lastBuildDate>Tue, 25 Aug 2009 08:22:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Twitter API &#8211; Nachrichten senden</title>
		<link>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html</link>
		<comments>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html#comments</comments>
		<pubDate>Tue, 25 Aug 2009 08:18:33 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webservices]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1138</guid>
		<description><![CDATA[


 Twittern ist doch sehr trendig. Seit 2007 gibt es die Twitter API &#8211; hier soll ein kleines Script vorgestellt werden, mit welchem ihr munter von eurer Webseite loszwitschern könnt. Das alles läuft mit ein paar Zeilen PHP Code und einem Zugang zur Twitter API.
Die API von Twitter wurde 2007 veröffentlicht. Mittlerweile gibt es natürlich [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/42-diese-seite-weiterempfehlen.html' rel='bookmark' title='Permanent Link: Diese Seite weiterempfehlen&#8230;'>Diese Seite weiterempfehlen&#8230;</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p style="float: right;margin: 4px;"><script type="text/javascript"><!--
google_ad_client = "pub-7748812030658677";
/* 468x60, Erstellt 20.08.09 */
google_ad_slot = "9850520828";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p> <p><a href="http://www.devmag.net/wp-content/uploads/illu_php_twitter.jpg"><img class="illu alignright" title="Twitter Status mit PHP und der Twitter API updaten" src="http://www.devmag.net/wp-content/uploads/illu_php_twitter.jpg" alt="Twitter Status mit PHP und der Twitter API updaten" width="50" height="50" /></a>Twittern ist doch sehr trendig. Seit 2007 gibt es die Twitter API &#8211; hier soll ein kleines Script vorgestellt werden, mit welchem ihr munter von eurer Webseite loszwitschern könnt. Das alles läuft mit ein paar Zeilen PHP Code und einem Zugang zur Twitter API.<span id="more-1138"></span></p>
<p>Die API von Twitter wurde 2007 veröffentlicht. Mittlerweile gibt es natürlich auch eine PHP Programmbibliothek, mit der Sie Twitter z.B. in Ihr Blog integrieren können. Auf Dr.Web.de wurde ein kleines <a title="Dr.Web Twitter Plugin" href="http://www.drweb.de/magazin/twittern-mit-wordpress-und-dr-web/" target="_blank">Wordpress Plugin </a>vorgestellt, mit dem man automatisch Nachrichten an Twitter senden kann. Das ganze Skript können Sie <a title="Twitter PHP Script" href="http://www.box.net/shared/trnomoyh15" target="_blank">hier</a> herunterladen.</p>
<p>Es besteht aus einer Datei. Einem Script, um die Nachrichten an Twitter zu senden und einem Formular, über welches die Nachrichten eingegeben werden.</p>
<p>Der PHP Code für das Senden der Message ist wie folgt:</p>
<p>insertTwitterMsg.php<br />
<code>&lt;?php<br />
$twitter_username ='yourTwitterUserName';<br />
$twitter_psw ='yourTwitterPassword';<br />
require('twitterAPI.php');<br />
if(isset($_POST['twitter_msg']))<br />
{<br />
$twitter_message=$_POST['twitter_msg'];<br />
if(strlen($twitter_message)&lt;1){<br />
$error=1;<br />
} else {<br />
$twitter_status=postToTwitter($twitter_username, $twitter_psw, $twitter_message);<br />
}<br />
}<br />
?&gt;</code></p>
<p>Hier müssen Sie lediglich ihren Twitter-Benutzername sowie ihr Twitter Passwort anpassen. In der ersten Zeile wird die Twitter API eingefügt. Diese ist ebenfalls in der ZIP Datei enthalten. Daraufhin folgt eine Überprüfung ob die Message auch mindestens ein Zeichen enthält. Wenn nicht, spuckt das Skript eine Fehlermeldung us.</p>
<p>Ansonsten wird die Nachricht an Twitter über die Funktion <code>postToTwitter() </code>gesendet; diese steckt in der Twitter API. Das Formular, über welches die Messages eingegeben werden ist ebenfalls in der insertTwitterMsg.php implementiert.</p>
<p><code>&lt;!-- Send message to Twitter --&gt;<br />
&lt;?php<br />
if(isset($_POST['twitter_msg']) &amp;&amp; !isset($error)){?&gt;<br />
&lt;div&gt;&lt;?php echo $twitter_status ?&gt;&lt;/div&gt;<br />
&lt;?php } else if(isset($error)){?&gt;<br />
&lt;div&gt;Error: please insert a message!&lt;/div&gt;<br />
&lt;?php }?&gt;<br />
&lt;p&gt;&lt;strong&gt;What are you doing?&lt;/strong&gt;&lt;/p&gt;<br />
&lt;form action="insertTwitterMsg.php" method="post"&gt;<br />
&lt;input name="twitter_msg" type="text" id="twitter_msg" size="40" maxlength="140"/&gt;<br />
&lt;input type="submit" name="button" id="button" value="post" /&gt;<br />
&lt;/form&gt;</code></p>
<p>Sofern in der Umgebungsvariable <code>$_POST['']</code> die Message noch nicht definiert ist, oder ein Fehler entstanden ist &#8211; etwa weil die Nachricht weniger als ein Zeichen hatte, so wird die Fehlermeldung ausgegeben. Ansonsten wird der Twitter Status ausgegeben, welcher besagt, ob die Message erfolgreich übertragen wurde. Daruner wird das Formular ausgegeben. So einfach gehts!</p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/42-diese-seite-weiterempfehlen.html' rel='bookmark' title='Permanent Link: Diese Seite weiterempfehlen&#8230;'>Diese Seite weiterempfehlen&#8230;</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alle img-Tags mit regulären Ausdrücken ermitteln</title>
		<link>http://www.devmag.net/php-tricks/1120-img-tags-regularen-ausdrucken.html</link>
		<comments>http://www.devmag.net/php-tricks/1120-img-tags-regularen-ausdrucken.html#comments</comments>
		<pubDate>Sun, 16 Aug 2009 20:07:49 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP Tricks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Reguläre Ausdrücke]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1120</guid>
		<description><![CDATA[Mit diesem kleinen Trick können Sie alle src Werte von img-Tags über einen regulären Ausdruck mit PHP auslesen und ändern. Das ist hilfreich, wenn Sie einmal in viel HTML Code die URLs in dem img-Tag anpassen oder ändern müssen. Reguläre Ausdrücke machen es möglich.
Vielleicht kennen Sie das Problem? Sie möchten, dass in viel HTML Code, [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/html/4-browserkompatibilitat-problematische-tags.html' rel='bookmark' title='Permanent Link: Browserkompatibilität &#8211; Problematische Tags'>Browserkompatibilität &#8211; Problematische Tags</a></li><li><a href='http://www.devmag.net/html/14-meta-tags-nach-dublin-core.html' rel='bookmark' title='Permanent Link: Meta Tags nach Dublin Core'>Meta Tags nach Dublin Core</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img class="illu alignleft" title="illu_regulaere_ausdruecke" src="http://www.devmag.net/wp-content/uploads/illu_regulaere_ausdruecke.gif" alt="illu_regulaere_ausdruecke" width="60" height="60" />Mit diesem kleinen Trick können Sie alle src Werte von img-Tags über einen regulären Ausdruck mit PHP auslesen und ändern. Das ist hilfreich, wenn Sie einmal in viel HTML Code die URLs in dem img-Tag anpassen oder ändern müssen. Reguläre Ausdrücke machen es möglich.<span id="more-1120"></span></p>
<p>Vielleicht kennen Sie das Problem? Sie möchten, dass in viel HTML Code, z.B. aus einer Datenbank, automatisch die src-Attribute an img-Tags angepasst werden. Sei es z.B., dass aus</p>
<p><code>&lt;img src="/images/bild.jpg" alt="Ein Bild" /&gt; automatisch &lt;img src="http://www.testseite.de/images/bild.jpg" alt="Ein Bild" /&gt;</code> werden soll.</p>
<p>Jetzt sind Sie sich aber nicht sicher, ob sie wirklich nur valides HTML verwendet haben? Also es soll auch folgendes ersetzt werden:</p>
<p><code>&lt;IMG src="test/images/bild.jpg" alt="Ein Bild" /&gt;</code> oder</p>
<p><code>&lt;imG SRC='mein_blog/images/bild.jpg' alt="Ein Bild"&gt;</code></p>
<p>Folgende Zeilen PHP Code erledigen das gewünschte:</p>
<p><code><br />
$old = "Alter HTML Code, etwa &lt;img src="/images/bild.jpg" alt="Ein Bild" /&gt;<br />
$neue_url = "http://www.testseite.de";<br />
$pattern = '/(&lt;img.+?src=)(["\']?)([^\'"]+?)([^\/]+)(\2.*?\/?&gt;)/is';<br />
$replace = "$1$2".$neue_url."$4$5";<br />
$new = preg_replace($pcre, $replace, $old); </code></p>
<p>Zu dem Code gibt es noch eine kurze Erklärung. Das zweite Subpattern fängt das linke Quote-Zeichen auf, oder eben keins, wenn keins da ist &#8211; falls der HTML code nicht valide ist. Das dritte passt auf den Pfad und wird deshalb ersetzt. Das vierte Subpattern erfasst alles nach dem letzten Slash bis zum Ende des Dateinamens. &#8216;\2&#8242; ist eine Rückreferenz (&#8221;back reference&#8221;) und passt auf exakt das gleiche Zeichen wie das zweite Subpattern, also &#8216;&#8221;&#8216;, &#8220;&#8216;&#8221; oder kein Zeichen. Der Rest versucht alle möglichen Arten von img-Tags zu erfassen: &#8220;&lt;img &#8230;&gt;&#8221;, &#8220;&lt;img &#8230;/&gt;&#8221; und &#8220;&lt;img &#8230; /&gt;&#8221;.</p>
<p>So sollte es fuktioieren</p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/html/4-browserkompatibilitat-problematische-tags.html' rel='bookmark' title='Permanent Link: Browserkompatibilität &#8211; Problematische Tags'>Browserkompatibilität &#8211; Problematische Tags</a></li><li><a href='http://www.devmag.net/html/14-meta-tags-nach-dublin-core.html' rel='bookmark' title='Permanent Link: Meta Tags nach Dublin Core'>Meta Tags nach Dublin Core</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php-tricks/1120-img-tags-regularen-ausdrucken.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX: Ein einfacher Chat wie bei Facebook und co!</title>
		<link>http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html</link>
		<comments>http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html#comments</comments>
		<pubDate>Wed, 22 Jul 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=61</guid>
		<description><![CDATA[
Ein Online-Chat braucht nicht unbedingt Java, wie Facebook und co zeigen. Mit der Integration verschiedener Techniken in AJAX ist es jedoch möglich, einen einfachen Onlinechat auf schnelle Weise in eine gewöhnliche Webseite zu integrieren. Wir zeigen Ihnen, wie es geht!Ein schlichter Onlinechat ist eigentlich schwierig zu realisieren, da die neu
eingegangenen Messages stets vom Server geladen [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html' rel='bookmark' title='Permanent Link: AJAX: Die Zukunft des Webs?'>AJAX: Die Zukunft des Webs?</a></li><li><a href='http://www.devmag.net/php/806-ajax-das-xmlhttprequest-objekt.html' rel='bookmark' title='Permanent Link: AJAX: Das XMLHttpRequest Objekt'>AJAX: Das XMLHttpRequest Objekt</a></li><li><a href='http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html' rel='bookmark' title='Permanent Link: Twitter API &#8211; Nachrichten senden'>Twitter API &#8211; Nachrichten senden</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_ajax_anwendung_chat.jpg" class="illu" width="60" height="60" align="left" alt="AJAX - Workshop Chat Anwendung Tutorial" />
Ein Online-Chat braucht nicht unbedingt Java, wie Facebook und co zeigen. Mit der Integration verschiedener Techniken in AJAX ist es jedoch möglich, einen einfachen Onlinechat auf schnelle Weise in eine gewöhnliche Webseite zu integrieren. Wir zeigen Ihnen, wie es geht!<span id="more-61"></span><P>Ein schlichter Onlinechat ist eigentlich schwierig zu realisieren, da die neu
eingegangenen Messages stets vom Server geladen werden müssen. Dies bedeutete
bisher, dass die Seite neu geladen werden musste. Um dies zu umgehen, hat man
auf andere Möglichkeiten gesetzt, wie zum Beispiel <STRONG>JavaApplets</STRONG>.
Mit AJAX wird die Sache erleichtert, da man die Seiten nicht mehr neu im Browser
laden muss. Die periodische Überprüfung nach neuen Messages kann über JavaScript
und XMLHttpRequests mit der setTimeOut-Funktion gesteuert werden.</P>
<P>Hört sich einfach an – ist es im Grunde auch so. Bei Dr.Web wurde bereits
einmal von mir ein Skript vorgestellt, mit dem auf einfache Art eine Shoutbox
programmiert wurde. Dieses Skript soll nun Schritt-für-Schritt AJAX tauglich
gemacht werden und zu einem Chat umfunktioniert werden. </P>
<P>Im Internet gibt es bereits OpenSource-AJAX-Chat-Anwendungen, zum Beispiel <A
href="http://socket7.net/lace/" target=_blank>Lace</A> und <A
href="http://treehouse.ofb.net/chat/" target=_blank>Treehouse</A>. Unser
Beispiel wurde entwickelt, um im Rahmen dieser Artikelserie AJAX näher zu
bringen. Das Beispiel weist längst nicht alle Features auf, die möglich wären,
ist so aber besser verständlich.</P>
<P>Rollen wir das Feld von hinten auf und beginnen wir mit dem so genannten
<STRONG>Server Backend</STRONG>. In unserem Fall ist das eine MySQL Datenbank.
Für unsere kleine Anwendung verwenden wir eine Tabelle Namens "ajaxChat", welche
die Felder id, name, nachricht und date hat; diese kann mit folgender
SQL-Anweisung erzeugt werden:</P>
<P><CODE>CREATE TABLE `ajaxChat` (<BR>`id` LONGINT NOT NULL AUTO_INCREMENT
,<BR>`name` VARCHAR( 60 ) NOT NULL ,<BR>`nachricht` VARCHAR( 120 ) NOT NULL
,<BR>`date` VARCHAR( 30 ) NOT NULL ,<BR>PRIMARY KEY ( `id` ) <BR>);</CODE></P>
<P><IMG height=212 alt=Screenshot
src="http://www.devmag.net/wp-content/uploads/ajax-chat-schritt-1.gif"
width=356><SPAN class=leg><BR>Zunächst wird das Backend angegangen; zum einen
die Datenbank, zum anderen das PHP-Skript, welches die XML-Antworten auf die
http-Anfragen erzeugt.</SPAN></P>
<P>Das PHP-Skript (nennen wir es ajaxchat.php) auf der Serverseite muss folgende
Funktionalitäten aufweisen:</P>
<UL>
  <LI>Verbindung zur Datenbank öffnen und schließen.
  <LI>Nneue Einträge müssen in die Datenbank eingefügt werden können.
  <LI>Neue Einträge müssen abgeholt werden können; als Erkennung dient eine
  eindeutige ID. </LI></UL>
<P>Die Ausgabe der Daten, das heißt die <STRONG>asynchrone Antwort</STRONG> des
Servers erfolgt über XML; dieses wird dann über JavaScript und CSS im Browser
dargestellt.</P>
<P>Die Datenbankverbindung kann über folgenden Zeilen-Code geöffnet werden; die
Variablen müssen an die jeweilige Serverumgebung angepasst werden. </P>
<P><CODE>&lt;?php<BR>//wichtig; damit nicht gecached wird!<BR>header(
"Cache-Control: no-cache, must-revalidate" ); <BR>header( "Pragma: no-cache"
);<BR>//damit unser JavaScript die Daten auch als XML
erkennt<BR>header("Content-Type: text/xml");<BR><BR>$db_host = "localhost"; //
Host <BR>$db_user = "root"; // User <BR>$db_password = ""; //
Passwort<BR>$db_name = "test"; //
Datenbank<BR><BR>mysql_connect($db_host,$db_user,$db_password) or
die(mysql_error()); <BR>mysql_select_db($db_name) or die(mysql_error());
</CODE></P>
<P><STRONG>Nachrichten auslesen</STRONG><BR>Die Funktion, mit der stets die
aktuellsten Nachrichten aus der Datenbank extrahiert werden:</P>
<P><CODE>function getLatestEntries($latestID) {<BR><BR>$query = "SELECT id,
name, nachricht, date FROM ajaxchat WHERE id &gt; $latestID ORDER BY id DESC
LIMIT 20"; <BR>$erg = mysql_query($query); <BR>echo "&lt;?xml version=\"1.0\"
encoding=\"UTF-8\" standalone=\"yes\"?&gt;";<BR>echo
"&lt;messages&gt;";<BR>while($erg2=mysql_fetch_array($erg)) //Erzeugung der XML
Ausgabe<BR>{ <BR>echo "&lt;message&gt;&lt;id&gt;".$erg2['id'];<BR>echo
"&lt;/id&gt;&lt;name&gt;".$erg2['name'];<BR>echo
"&lt;/name&gt;&lt;nachricht&gt;".$erg2['nachricht'];<BR>//Formatierung des
Timestamps<BR>echo "&lt;/nachricht&gt;&lt;date&gt;".date("d.m.Y
H:i",$erg2['date']); <BR>echo "&lt;/date&gt;&lt;/message&gt;";<BR>}<BR>echo
"&lt;/messages&gt;";<BR>}</CODE> </P>
<P>Bei dieser Funktion kommt es insbesondere auf die
<STRONG>SQL-Abfrage</STRONG> an; über die Bedingung id &gt; $latestID, werden
lediglich die Einträge ermittelt, deren ID größer (d.h. deren Einträge
"frischer" sind), ermittelt. Die Variable latestID wird, wie wir weiter unten
sehen werden, bei dem http Requests über JavaScript übergeben. </P>
<P>Durch den Zusatz ORDER BY id DESC in der SQL Abfrage wird sichergestellt,
dass die Einträge absteigend ausgegeben werden; LIMIT 20 beschränkt die Ausgabe
auf die letzten zwanzig Einträge. Die Erzeugung des XML-Codes erfolgt schlicht
über die echo-Funktion (eine Verwendung der DOMXML Funktionen von PHP wäre bei
dem geringen Aufwand nicht gerechtfertigt).</P>
<P><STRONG>Neue Einträge</STRONG><BR>Das erzeugen von neuen Einträgen in die
Tabelle erfolgt über folgende Funktion:<BR><BR><CODE>function
createNewEntry($name, $nachricht) {<BR><BR>//HTML Tags entfernen<BR>$name =
strip_tags($name, '');<BR>$nachricht = strip_tags($nachricht,''); <BR><BR>$query
= "INSERT INTO ajaxchat(name, nachricht, date) <BR>VALUES
('$name','$nachricht','".time()."')";<BR>echo "&lt;?xml version=\"1.0\"
encoding=\"UTF-8\" standalone=\"yes\"?&gt;";<BR>if (!mysql_query($query))
{<BR>//nicht notwendig, dient nur der Fehlerkontrolle<BR>echo
"&lt;createNewEntry&gt;0&lt;/createNewEntry&gt;";}<BR>else {<BR>echo
"&lt;createNewEntry&gt;1&lt;/createNewEntry&gt;";<BR>}<BR>}</CODE> </P>
<P>Dabei erzeugt die Funktion createNewEntry wiederum eine XML-Antwort; dieser
schenken wir aber keine Beachtung. Sie wurde lediglich zur Fehlerüberprüfung
implementiert, so dass man über JavaScript, falls es einen MySQL-Fehler beim
Erzeugen eines neuen Eintrag gäbe, dies entsprechend im Browser anzeigen könnte
- wenn man denn wollte. </P>
<P><STRONG>Skriptsteuerung</STRONG><BR>Da alle Anfragen an ein und dasselbe
Skript geschickt werden (ajaxchat.php), benötigen wir noch ein paar Zeilen-Code,
mit denen sichergestellt wird, dass bei den Aufrufen auch die jeweils
angesprochene Funktion ausgeführt wird. Wir arbeiten hierbei mit Parametern, die
in die http Anfragen über das XMLHttpRequest Objekt eingebaut sind.</P>
<P><CODE>//falls action=createNewEntry, Erzeugung eines neuen Eintrages<BR>if
($_GET['action'] == "createNewEntry") { <BR>createNewEntry($_GET['name'],
$_GET['nachricht']);<BR>}<BR>//falls action=getLatestEntries, Ausgabe der
neuesten Einträge<BR>elseif ($_GET['action'] == "getLatestEntries")
{<BR>getLatestEntries($_GET['latestID']);<BR>}<BR>mysql_close(); //schließen der
PHP Verbindung<BR>?&gt;</CODE><BR><BR>Das PHP-Skript, der gesamte Backend ist
noch relativ harmlos. Bei unserer AJAX-Engine wird es kniffliger. </P>
<P><STRONG>Die AJAX Engine</STRONG><BR><BR><IMG height=212 alt=Screenshot
src="http://www.devmag.net/wp-content/uploads/ajax-chat-schritt-2.gif"
width=356><SPAN class=leg><BR>Im zweiten Schritt wird die AJAX-Engine aufgebaut;
mit ihr werden die http-Anfragen erzeugt und die Ergebnisse im Browser
dargestellt</SPAN> </P>
<P>Die AJAX-Engine hat folgende Aufgaben:</P>
<UL>
  <LI>Erzeugung der http-Anfragen um neue Nachrichten vom Server zu erfragen-
  <LI>Erzeugung der http-Anfragen, über die neue Einträge in der Datenbank
  gespeichert werden. </LI></UL>
<P>Da später das Empfangen von Daten automatisiert wird beziehungsweise über die
setTimeOut-Funktion gesteuert wird, ist es notwendig, dass wir für unsere
Anwendung zwei XMLHttpRequest-Objekte erzeugen. Damit wird sichergestellt, dass
man gleichzeitig sowohl Daten empfangen als auch senden kann. </P>
<P><STRONG>Erzeugung zweier XMLHttpRequest-Objekte</STRONG><BR>Das JavaScript
zur Erzeugung der XMLHttpRequest-Objekte ist identisch mit dem aus <A
href="http://www.drweb.de/programmierung/ajax-xmlhttpRequest.shtml">Teil 2</A>
dieser Artikelserie:<BR><BR><CODE>&lt;script type="text/javascript"&gt;<BR>var
latestID = 0; //latestID als globale Variable; wichtig!<BR><BR>function
createXMLHttpReqObj() { //erzeugt die XMLHttpRequest Objekte<BR><BR>// für
Mozilla etc.<BR>if(window.XMLHttpRequest) {<BR>try { //Fehler abfangen<BR>req =
new XMLHttpRequest(); <BR>} catch(e) {<BR>req = false;<BR>}<BR>// für den
InternetExplorer<BR>} else if(window.ActiveXObject) {<BR>try {<BR>req = new
ActiveXObject("Msxml2.XMLHTTP");<BR>} catch(e) {<BR>try {<BR>req = new
ActiveXObject("Microsoft.XMLHTTP");<BR>} catch(e) {<BR>req =
false;<BR>}<BR>}<BR>}<BR>return req;<BR>}<BR>// Initialisierung der beiden
Objekte<BR>var httpGetLatestEntries= createXMLHttpReqObj(); <BR>var
httpCreateNewEntry = createXMLHttpReqObj();</CODE></P>
<P><STRONG>Neueste Einträge abfragen</STRONG><BR>Bei der Abfrage nach den
neuesten Einträgen wird die <STRONG>LatestID</STRONG> in der http-Anfrage mit
übergeben. Diese ist eine globale Javascript-Variable, da ihr Wert aus
Funktionen heraus geändert wird. Initialisiert wird sie mit dem Wert null. Die
URL zu dem Skript ajaxchat.php müssen Sie natürlich an Ihre Umgebung
anpassen.</P>
<P>Die Funktion getLatestEntries sieht wie folgt aus:<BR><BR><CODE>//Funktion,
mit der Anfragen nach neuen Einträgen gesendet wird<BR>function
getLatestEntries() {<BR>//Anfrage senden, wenn Status der letzten Anfrage
"completed" ist, bzw. "nicht initialisiert" (d.h. erster Aufruf)<BR>if
(httpGetLatestEntries.readyState == 4 || httpGetLatestEntries.readyState == 0) {
<BR>//Übergabe der
latestID<BR>httpGetLatestEntries.open("GET","<BR>http://localhost/ajax/ajaxchat.php?<BR>action=getLatestEntries&amp;latestID="+latestID,
true);<BR>httpGetLatestEntries.onreadystatechange = handleHttpGetLatestEntries;
<BR>httpGetLatestEntries.send(null);<BR>}<BR>}</CODE></P>
<P>Als Funktion, mit welcher der Browser die Serverantwort behandelt ist die
Funktion <STRONG>handleHttpGetLatestEntries</STRONG> angegeben:</P>
<P><CODE>//Behandelt die Serverantwort<BR>function handleHttpGetLatestEntries()
{<BR><BR>//wenn Anfrage den Status "completed" hat<BR>if
(httpGetLatestEntries.readyState == 4) {<BR>//ermitteln der Antwort<BR>response
= httpGetLatestEntries.responseXML.documentElement; <BR>//ermitteln der
Messages; Überführung in ein Array<BR>messages =
response.getElementsByTagName('message');<BR><BR>//wenn es mindestens eine neue
Nachricht hat, dann wird diese angezeigt! <BR>if(messages.length &gt; 0)
{<BR><BR>for (var i=messages.length-1; i&gt;=0; i--) {<BR>//Darstellung im
Browser mit dem DOM<BR>showEntry=
document.getElementById("showEntries");<BR>neuSpan =
document.createElement('span');<BR>neuSpan.setAttribute('class','entry'); //CSS
Klasse<BR>neuSmall = document.createElement('small');<BR>neuNameDate =
document.createTextNode(messages[i].getElementsByTagName<BR>('date')[0].firstChild.nodeValue
+ ': ' + messages[i].getElementsByTagName('name')[0].firstChild.nodeValue +':
');<BR>neuSmall.appendChild(neuNameDate);<BR>neuSpan.appendChild(neuSmall);<BR>neuSpan.appendChild(document.createElement('br'));
<BR>neuNachricht =
document.createTextNode(messages[i].getElementsByTagName<BR>('nachricht')[0].firstChild.nodeValue);<BR>neuSpan.appendChild(neuNachricht);<BR>neuSpan.appendChild(document.createElement('br'));<BR>showEntry.insertBefore(neuSpan,
showEntry.firstChild); <BR>}<BR><BR>//Festlegung der neuen latestID; Zugriff auf
die Werte über das DOM<BR>latestID =
messages[0].getElementsByTagName('id')[0].firstChild.nodeValue;
<BR>}<BR>//erneuter periodischer Aufruf (eine Art
Rekursion)<BR>setTimeout('getLatestEntries();',3000); //Erneute Anfrage in drei
Sekunden<BR>}<BR>}</CODE><BR><BR>Über diese wird, sofern die Anfrage erfolgreich
war, die XML-Daten vom Server in ein Array (messages) überführt und im Browser
dargestellt. Dies findet jedoch nur statt, wenn es auch neue Nachrichten zum
Anzeigen gibt (wenn messages.length &gt;0), das heißt wenn die Anfrage an das
PHP-Skript auch eine neue Nachricht zurückgegeben hat. Ist dies der Fall, wird
die latestID nach der Darstellung der neuen Nachrichten im Browser aktualisiert.
Da dies aus einer Funktion heraus geschieht, wird klar, weshalb latestID eine
globale Variable sein muss. </P>
<P>Über die setTimeOut-Funktion wird nun unsere <STRONG>periodische
Überprüfung</STRONG> nach neuen Einträgen durch den Aufruf der Funktion
getLatestEntries alle drei Sekunden initialisiert; dabei handelt es sich um eine
Art "verzögerte Rekursion".</P>
<P><STRONG>Neue Nachrichten eintragen</STRONG><BR>Die JavaScript Funktionen,
über welche neue Einträge an den Server gesendet werden, sind ähnlich aufgebaut,
wie die vorherigen Funktionen. Mit der ersten Funktion createNewEntry wird die
http-Anfrage erzeugt, wobei ihr die Werte für die Felder name und nachricht aus
dem HTML-Formular übergeben werden. <BR><BR><CODE>//neue Nachricht auf dem
Server erzeugen; die Übergabe der Werte erfolgt über das HTML
Formular<BR>function createNewEntry(name, nachricht) {<BR><BR>//Anfrage senden,
wenn Status der letzten Anfrage "completed" ist, bzw. "nicht initialisiert"
(d.h. erster Aufruf) <BR>if (httpCreateNewEntry.readyState == 4 ||
httpCreateNewEntry.readyState == 0) {<BR>//URL für HTTP Anfrage; muss angepasst
werden<BR>url =
'http://localhost/ajax/ajaxchat.php?action=createNewEntry&amp;name=' + name +
'&amp;nachricht=' + nachricht; <BR>httpCreateNewEntry.open("GET", url,
true);<BR>httpCreateNewEntry.onreadystatechange =
handleHttpCreateNewEntry;<BR>httpCreateNewEntry.send();<BR>}<BR>}</CODE>
<BR><BR>Die Antwort vom Server wird über die Funktion handleHttpCreateNewEntry
abgearbeitet; diese ist relativ kurz: </P>
<P><CODE>//behandelt die Antwort des Servers<BR>function
handleHttpCreateNewEntry() {<BR>if (httpCreateNewEntry.readyState == 4)
{<BR>//nachdem eine neue Nachricht erfolgreich erzeugt wurde, wird diese
angezeigt<BR>getLatestEntries(); <BR>}<BR>}</CODE></P>
<P>Nachdem die Daten erfolgreich in der Datenbank hinterlegt wurden, wird die
Funktion getLatestEntries() wiederum aufgerufen, um sicherzustellen, dass die
neue Nachricht auch sofort angezeigt wird.</P>
<P><STRONG>Das Frontend</STRONG><BR>Nachdem nun die AJAX-Engine aufgestellt ist,
wenden wir uns dem Frontend zu. Auch hier ist JavaScript gefragt. So können die
Eingaben über JavaScript überprüft werden; die Darstellung der Nachrichten kann
über eine CSS-Klasse beeinflusst werden.</P>
<P><STRONG>Das Formular</STRONG><BR>Das Formular ist simpel gehalten; es gibt
lediglich Eingabefelder und einen Submit-Button:</P>
<P><CODE>&lt;form name="form1" method="post"
action=""&gt;<BR>&lt;p&gt;Name&lt;br /&gt;<BR>&lt;input type="text" name="name"
id="name"&gt;<BR>&lt;br /&gt;<BR>&lt;br /&gt;<BR>Nachricht&lt;br
/&gt;<BR>&lt;input type="text" name="nachricht"
id="nachricht"&gt;<BR>&lt;/p&gt;<BR>&lt;p&gt;<BR>&lt;input type="submit"
name="Submit" value="Submit" onclick="checkInput(document.form1.name.value,
document.form1.nachricht.value)" &gt;<BR>&lt;/p&gt;<BR>&lt;/form&gt;</CODE></P>
<P>Nachdem man auf den Submit-Button geklickt hat, wird die JavaScript-Funktion
checkInput aufgerufen; an diese werden die eingegebenen Daten weitergegeben. In
ihr wird die Eingabe überprüft.</P>
<P>Eine solche Überprüfung könnte im einfachsten Fall wie folgt
aussehen:<BR><BR><CODE>function checkInput(name, nachricht) {<BR>if(name != ""
&amp;&amp; nachricht != "") {<BR>//Falls alles OK ist, kann der neue Eintrag
erzeugt werden<BR>createNewEntry(name, nachricht);<BR>}<BR>else
{<BR>alert("Bitte sowohl einen Namen, als auch eine Nachricht
eingeben!");<BR>}<BR>}</CODE></P>
<P>Die Darstellung der Ergebnisse kann mit Hilfe von CSS beeinflusst werden.
Dazu greifen wir auf die über das DOM zugewiesene CSS-Klasse "entry" zurück;
über folgende Zeilen könnte man die Darstellung im Browser ein wenig
ansehnlicher machen. </P>
<P><CODE>&lt;style type="text/css"&gt;<BR>.entry {<BR>width:
100%;<BR>background-color: #F5F5F5;<BR>border: 1 dotted #666666;<BR>font-family:
Verdana;<BR>}<BR>.entry#small {<BR>color:
#CCCCCC;<BR>}<BR>&lt;/style&gt;</CODE><BR><BR>So könnte das Ergebnis im Browser
aussehen: </P>
<P><IMG height=425 alt=Screenshot
src="http://www.devmag.net/wp-content/uploads/ajax-chat-beispiel.gif"
width=365 border=1><SPAN class=leg><BR>AJAX Chat in der konkreten
Anwendung</SPAN></P>
<P>Der Aufruf des Skriptes kann über einen onLoad-Event im Body-Tag der
HTML-Seite (&lt;body onload="getLatestEntries()"&gt;), in welcher das Formular
eingebettet ist, eingeleitet werden; dabei wird die Funktion getLatestEntries
das erste mal aufgerufen, wodurch die setTimeOut-Endlosschleife gestartet wird.
<BR><BR>Alles in allem, war es ein langer Weg von der Idee zur konkreten
Umsetzung. AJAX bedeutet nicht nur, dass die Webseiten in Zukunft in ihrem
Verhalten normalen <STRONG>Desktop-Anwendung</STRONG> ähneln können, sondern
bringt auch viel Arbeit mit sich. Vor allem das Zusammenspiel von JavaScript und
XML klappt bislang nicht immer reibungslos. </P>
<P>Das hier vorgestellte Beispiel besitzt zudem einen Bug, der nicht
verschwiegen werden darf. Auf der JavaScript Seite kann nicht mit Umlauten oder
anderen Sonderzeichen umgegangen werden; diese verursachen einen Fehler. Alle
Dateien gibt es wie immer als Paket zum <A
href="http://www.devmag.net/webprog/ajaxchat.zip">Download</A>.
</P>

<p>(<a href="/informationen/autoren.htm">tf</a>) <br>
<small> Dieser Artikel ist ebenfalls bei Dr.Web erschienen </small></p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html' rel='bookmark' title='Permanent Link: AJAX: Die Zukunft des Webs?'>AJAX: Die Zukunft des Webs?</a></li><li><a href='http://www.devmag.net/php/806-ajax-das-xmlhttprequest-objekt.html' rel='bookmark' title='Permanent Link: AJAX: Das XMLHttpRequest Objekt'>AJAX: Das XMLHttpRequest Objekt</a></li><li><a href='http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html' rel='bookmark' title='Permanent Link: Twitter API &#8211; Nachrichten senden'>Twitter API &#8211; Nachrichten senden</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX: Die Zukunft des Webs?</title>
		<link>http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html</link>
		<comments>http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html#comments</comments>
		<pubDate>Tue, 07 Jul 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=59</guid>
		<description><![CDATA[Der AJAX-Ansatz ist noch jung und wird schon heiß gelobt – doch was steckt dahinter, wie funktioniert AJAX und wie kann AJAX im Web konkret Anwendung finden?In herkömmlichen Webanwendungen werden Formulare ausgefüllt und abgeschickt.
Bis dies geschieht, bleiben die Daten auf der Clientseite, der Server bekommt
nicht mit, dass Daten in das Formular gefüllt werden. Stürzt nun [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html' rel='bookmark' title='Permanent Link: AJAX: Ein einfacher Chat wie bei Facebook und co!'>AJAX: Ein einfacher Chat wie bei Facebook und co!</a></li><li><a href='http://www.devmag.net/php/806-ajax-das-xmlhttprequest-objekt.html' rel='bookmark' title='Permanent Link: AJAX: Das XMLHttpRequest Objekt'>AJAX: Das XMLHttpRequest Objekt</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_ajax_workshop_1.jpg" class="illu" width="60" height="60" align="left" alt="AJAX - Workshop" />Der AJAX-Ansatz ist noch jung und wird schon heiß gelobt – doch was steckt dahinter, wie funktioniert AJAX und wie kann AJAX im Web konkret Anwendung finden?<span id="more-59"></span><P>In herkömmlichen Webanwendungen werden Formulare ausgefüllt und abgeschickt.
Bis dies geschieht, bleiben die Daten auf der Clientseite, der Server bekommt
nicht mit, dass Daten in das Formular gefüllt werden. Stürzt nun der Browser
mitten während des Ausfüllens ab, sind die Daten verloren, da sie ja nicht
abgeschickt wurden. </P>
<P>Ein solches Szenario kann man mit dem Ansatz von AJAX verhindern. Dabei
werden bereits während des Ausfüllens von Formularen asynchron die Daten zum
Server über das Javascript Objekt <STRONG>XMLHttpRequest</STRONG> geschickt.
</P>
<P>Die Kommunikation kann auch anders herum erfolgen; das heißt, wenn der
Benutzer zum Beispiel Daten eingibt, wie die Postleitzahl, so kann der Server
direkt nach dem Eingeben der Postleitzahl in einer Datenbank nach dem
korrespondierenden Ortsnamen suchen und diese im Formular anzeigen. Das heißt
man muss Änderungen im Formular nicht mehr explizit abschicken, das wird im
Hintergrund erledigt.</P>
<P>Zum einen wird damit die Serverlast ein wenig heruntergeschraubt, da die
Daten in kleinen Paketen gesendet werden, zum anderen wird das Ausfüllen und
Absenden von Formularen beschleunigt. Dieser Ansatz wird als
<STRONG>Asynchronous Javascript and XML</STRONG> bezeichnet – kurz AJAX; dabei
ist AJAX keine eigene Technologie, sondern lediglich eine Kombination von
bereits existierenden und profilierten Technologien. AJAX wird bereits ausgiebig
im Internet, unter anderem von Google und Co. verwendet. </P>
<P>Das wohl bekannteste Beispiel ist <A
href="http://www.google.com/webhp?complete=1&amp;hl=en" target=_blank>Google
Suggest</A>. Dabei wird bereits während der Eingabe eines Suchstrings nach
etwaigen Ergänzungen gesucht und die voraussichtliche Ergebniszahl zu dem
Suchbegriff angezeigt. Das Ganze funktioniert, während man im Suchfeld
Suchbegriffe eingibt. So kann man schon vorweg sehen, ob es sich lohnt, die
Suche genauer zu spezifizieren, sollten sich etwa zu viele Suchergebnisse
finden.</P>
<P><IMG height=353
alt="AJAX Google Suggests - Während der Eingabe werden von Google Vorschläge für die Suche angezeigt"
src="http://www.devmag.net/wp-content/uploads/php_ajax_workshop_google-suggests.gif" width=393
border=1><BR><SPAN class=leg>Google Suggests - Während der Eingabe werden von
Google Vorschläge für die Suche angezeigt</SPAN></P>
<P>Mit dem AJAX-Ansatz könnte man das <STRONG>Stop-and-Go-Verhalten</STRONG> von
Webapplikationen umgehen; der Benutzer muss nicht mehr auf den Server warten, da
alles im Hintergrund geregelt wird.</P>
<P>Über das XMLHttpRequest Objekt ist es möglich, über JavaScript und XML mit
Webapplikationen, die auf dem Server laufen, zu interagieren. Dabei werden die
Daten, zum Beispiel aus Formularen in Form von HTTP-Anfragen versendet. Das
funktioniert ähnlich wie mit <STRONG>SOAP</STRONG> oder generell wie bei Webservices, nur das hier über JavaScript mit einer
Applikation asynchron kommuniziert wird. Die Antworten des Servers werden in
Form von XML versandt.</P>
<P>Im Modell sieht die klassische Client-Server Interaktion im zeitlichen
Verlauf etwa wie folgt aus.</P>
<P><IMG height=187
alt="AJAX Klassisches Modell der Client-Server Kommunikation; Dateneingabe und Datenverarbeitung auf dem Server verlaufen synchron"
src="http://www.devmag.net/wp-content/uploads/php_ajax_workshop_klassisches-modell.gif"
width=355> <SPAN class=leg><BR>Klassisches Modell der
Client-Server-Kommunikation; Dateneingabe und Datenverarbeitung auf dem Server
verlaufen synchron</SPAN> </P>
<P>Dabei werden die Zeitverzögerungen, die sich aufgrund des Sendens und
Empfangens von Anfragen beziehungsweise Antworten deutlich.<BR><BR>Mit dem
AJAX-Ansatz wird eine weitere Engine eingebaut, die den Versand der Daten
asynchron regelt. Wie man aus der Modellskizze erkennen kann, werden zum
Beispiel die Daten aus der ersten Eingabe noch serverseitig verarbeitet, während
zur selben Zeit bereits wieder neue Daten eingegeben werden können. Der Versand
wird über die AJAX-Engine geregelt.</P>
<P><IMG height=210
alt="AJAX Modell – Dateneingabe und Datenverarbeitung auf dem Server verlaufen asynchron"
src="http://www.devmag.net/wp-content/uploads/php_ajax_workshop_ajax-modell.gif" width=356><SPAN
class=leg><BR>AJAX-Modell - Dateneingabe und Datenverarbeitung auf dem Server
verlaufen asynchron</SPAN></P>
<P>Das für die Kommunikation notwendige XMLHttpRequest-Objekt wurde zunächst von
Microsoft als ActiveX entwickelt, ist aber heutzutage in allen gängigen Browsern
integriert. Es ist der Kern des AJAX-Ansatzes, da mit ihm die Client-Server
Kommunikation, die im Hintergrund abläuft, ermöglicht wird. Jedoch liegt der
Fokus bei AJAX nicht allein bei XMLHttpRequest, sondern grundsätzlich bei der
Idee des Zusammenspiels der verschiedenen Technologien.<BR><BR><IMG height=210
alt="AJAX Ablauf einer Anfrage über XMLHttpRequest"
src="http://www.devmag.net/wp-content/uploads/php_ajax_workshop_ajax-modell-2.gif" width=356>
<BR><SPAN class=leg>Ablauf einer Anfrage über XMLHttpRequest</SPAN> <BR><BR>Im
InternetExplorer wird XMLHttpRequest immer noch über ein AcitiveX-Objekt
initialisiert, während es in Browsern wie Mozilla als einfaches Objekt
abgeleitet werden kann. </P>
<P>Da AJAX verstärkt über XMLHttpRequest Javascript als Technologie integriert,
ergeben sich jedoch auch <STRONG>Probleme</STRONG>. So muss, zum Beispiel gerade
schon bei der Initialisierung eines Objektes auf die Besonderheiten der
verschiedenen <STRONG>Browser</STRONG> geachtet werden. Dadurch können die
Skripte mitunter recht komplex ausfallen und man muss sich fragen, ob sich der
Aufwand überhaupt lohnt. Der "Zurück"-Button des Browsers wird ebenfalls bei der
Verwendung einer solchen AJAX Technologie unnutzbar, da dieser ja nur über die
direkten Anfragen des Clients funktioniert.</P>
<P>Des Weiteren ergeben sich mit AJAX auch Probleme etwa für die barerierearmen
Gestaltung von Webformularen, da AJAX nicht den Anforderungen der Web
Accesibility Initiative des W3C entspricht und auch nur schwer kompatibel
gemacht werden kann.</P>
<P>Dennoch ergeben sich den Programmierern von Webapplikationen mit AJAX viele
neue Möglichkeiten. Die Webapplikationen werden immer ähnlicher zu herkömmlichen
Desktop-Applikationen, was auch zu deren Emanzipation beitragen kann. Auf jeden
Fall unterstützt AJAX die weitergehende Entwicklung von Webtechnologien.
(tm)</P>

<p>(<a href="/informationen/autoren.htm">tf</a>) <br>
<small> Dieser Artikel ist ebenfalls bei Dr.Web erschienen </small></p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html' rel='bookmark' title='Permanent Link: AJAX: Ein einfacher Chat wie bei Facebook und co!'>AJAX: Ein einfacher Chat wie bei Facebook und co!</a></li><li><a href='http://www.devmag.net/php/806-ajax-das-xmlhttprequest-objekt.html' rel='bookmark' title='Permanent Link: AJAX: Das XMLHttpRequest Objekt'>AJAX: Das XMLHttpRequest Objekt</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wikipedia für die eigene Webseite – Teil 1</title>
		<link>http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html</link>
		<comments>http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html#comments</comments>
		<pubDate>Fri, 03 Jul 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=43</guid>
		<description><![CDATA[Wikipedia ist in! Die deutschsprachige Ausgabe von Wikipedia ist die zweitgrößte weltweit und sie wächst und wächst weiter. Doch wie kann man Wikipedia für die eigenen Benutzer als nützliches Tool zugänglich machen und an die eigenen Wünsche anpassen?Dieser Artikel ist ebenfalls bei Dr.Web erschienen!
Im Endeffekt braucht es hierf&#252;r nur ein wenig JavaScript und nat&#252;rlich
  [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 2'>Wikipedia für die eigene Webseite – Teil 2</a></li><li><a href='http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html' rel='bookmark' title='Permanent Link: Eigene Web Services mit PHP5 bereitstellen? Kein Problem!'>Eigene Web Services mit PHP5 bereitstellen? Kein Problem!</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_wikipedia_1.gif" width="60" height="60" class="illu" align="right" alt="Wikipedia für die eigene Webseite mit PHP – Teil 1" />Wikipedia ist in! Die deutschsprachige Ausgabe von Wikipedia ist die zweitgrößte weltweit und sie wächst und wächst weiter. Doch wie kann man Wikipedia für die eigenen Benutzer als nützliches Tool zugänglich machen und an die eigenen Wünsche anpassen?<span id="more-43"></span><p><small>Dieser Artikel ist ebenfalls bei Dr.Web erschienen!</small></p>
<p>Im Endeffekt braucht es hierf&uuml;r nur ein wenig JavaScript und nat&uuml;rlich
  PHP &#8211; von da aus kann man Wikipedia auf die vielseitigsten Arten verwenden.
  Grunds&auml;tzlich hat man drei Optionen. Zum einen kann man die ganze Wikipedia
  MySQL Datenbank kopieren und auf dem eigenen Server samt Wikisoftware zum laufen
  bringen. Da die Datenbank nunmehr schon ein Gigabyte an Gr&ouml;&szlig;e erreicht
  hat, ist das nicht unbedingt eine Option die wirklich jedem offen steht. Zudem
  wird der Inhalt nicht von der gro&szlig;en Wikipedia Usergemeinde auf dem Laufendem
  gehalten.<br>
  Eine zweite M&ouml;glichkeit ist die Verwendung des XML Exports, der neuerdings
  von Wikipedia unter <a href="http://de.wikipedia.org/wiki/Spezial:Export/" target="_blank">http://de.wikipedia.org/wiki/Spezial:Export/</a>
  bereitgestellt wird. Dabei wird hinter das Spezial:Export/ schlicht der Name
  des Wikipedia-Artikels eingetragen. Die XML Antwort sieht dann in etwa so aus:</p>
<p><img src="http://www.devmag.net/wp-content/uploads/wikipedia-wikitax.gif" width="451" height="130"></p>
<span class="leg"> XML Antwort vom Wikipedia-Server - Zu sehen sind die WikiTax</span>
<p> Man wird aus dem zur&uuml;ckgegebenen Text nur schwer schlau. Das liegt daran,
  dass man den Inhalt zwar sch&ouml;n als XML zur&uuml;ckgeliefert bekommt, jedoch
  mit s&auml;mtlichen WikiTax. Das sind die wikimediaeigenen Tags, die vor jeder
  Ausgabe der Seite durch die Wikisoftware gerendert und in HTML umgesetzt werden.
  Zur Zeit gibt es noch Probleme bei dem XML Export von Wikipedia Daten, da es
  noch keine einheitliche Document Type Definition f&uuml;r die WikiTax gibt &#8211;
  deshalb kann man den XML Export noch nicht vollst&auml;ndig umsetzen. Zudem
  m&uuml;sste man selbst etwa mit Redirects in Wikipedia umgehen &#8211; ruft
  man z.B. den Artikel &quot;XML&quot;, so erh&auml;lt man:</p>
<p><code>&lt;text xml:space=&quot;preserve&quot;&gt;#REDIRECT [[Extensible_Markup_Language]]&lt;/text&gt; </code>
</p>
<p>Es gibt jedoch noch eine dritte M&ouml;glichkeit die Daten von Wikipedia direkt
  zu ermitteln &#8211; n&auml;mlich komplett mit allen HTML Formatierungen. Der
  Inhalt jeder Wikipedia-Seite ist von HTML Kommentaren eingeschlossen, n&auml;mlich
  den Kommentaren &lt;!-- start content --&gt; und &lt;!-- end content --&gt;.
  &Uuml;ber regul&auml;re Ausdr&uuml;cke und ein wenig PHP kann man diesen Inhalt
  vom Rest der Seite trennen und dann ausgeben. Ein solcher Ansatz wurde in der
  com!-Online Zeitschrift Ausgabe 8/05 vorgestellt. Das dabei verwendete PHP Skript
  von Stefan Kuhn und Andreas Dumont liest die Inhalte zwischen den beiden Kommentaren
  aus, passt die Verweise zu weiterf&uuml;hrenden Artikel an das Skript an und
  stellt die Inhalte im Browser dar. Dabei wird auch auf die PHP eigene gzip-Kompression
  zur&uuml;ckgegriffen, um die Ladezeiten und die Last f&uuml;r den Wikipedia-Server
  zu reduzieren. Dies hat auch den Vorteil, dass man immer die aktuellste Version
  des Wikipedia-Eintrags auf der Seite dargestellt bekommt. </p>
<p><code><strong>wikistatic.php</strong><br>
  &lt;?php<br>
  $query = $_SERVER['QUERY_STRING'];<br>
  $search = $_GET['search']; <br>
  ?&gt;<br>
  &lt;h1&gt;&lt;?php if (isset($search)) echo $search; ?&gt;&lt;/h1&gt;<br>
  &lt;?php <br>
  /************************************************************* <br>
  * Wikipedia-Skript : Version 1.05 : Mai 2005 <br>
  * wikipedia.php <br>
  * Stefan Kuhn, Andreas Dumont <br>
  *<br>
  * erweitert f&uuml;r Wikipedia-Suche von Thiemo Fetzer am 22. <br>
  * Juli 2005<br>
  /*************************************************************/ <br>
  function callback( $puffer ) { //zum Puffern!<br>
  <br>
  $puffer = substr( $puffer, strpos( $puffer, '&lt;!-- start content --&gt;' )
  ); // sucht erstes Vorkommen des Suchstrings und liefert die Position <br>
  $puffer = substr( $puffer, 0, strpos( $puffer, '&lt;div class=&quot;printfooter&quot;&gt;'
  ) ); <br>
  $puffer = str_replace( &quot;/w/index.php&quot;, &quot;/wikipedia/wikistatic.php&quot;,
  $puffer ); //macht die Links f&uuml;r das Skript kompatibel<br>
  $puffer = str_replace( &quot;/wiki/&quot;, &quot;/wikipedia/wikistatic.php?title=Spezial:Search&amp;search=&quot;,
  $puffer ); <br>
  $puffer = '&lt;style&gt;.editsection {display:none;}&lt;/style&gt;'.$puffer;
  //blendet die Bearbeiten-Links aus <br>
  ($puffer);<br>
  return $puffer; <br>
  } <br>
  if(eregi(&quot;Spezial:Search&quot;,$query) or eregi(&quot;Spezial%3aSearch&quot;,$query)
  or eregi(&quot;Special:Search&quot;,$query)) { //falls kein Artikel gefunden
  wird, dann automatischer Fallback zur normalen Suche<br>
  $search = str_replace( &quot; &quot;, &quot;+&quot;, $search ); //Leerzeichen
  HTTP konform umwandeln<br>
  ob_start(&quot;callback&quot;); //Einschalten der Pufferung von Ausgaben (f&uuml;r
  Suchen)<br>
  include 'http://de.wikipedia.org/w/index.php?'.$query; //der Query wird wieder
  angehaengt<br>
  ob_end_flush();<br>
  }<br>
  print( '&lt;small&gt;&lt;p&gt; <br>
  Text und Bilder dieses Beitrags stammen aus dem Artikel <br>
  &lt;a href=&quot;http://de.wikipedia.org/wiki/'.$begriff.'&quot; title=&quot;http://de.wikipedia.org/wiki/'.$begriff.'&quot;
  target=&quot;_blank&quot;&gt;'.$search.'&lt;/a&gt; <br>
  der freien Enzyklop&amp;auml;die &lt;a href=&quot;http://de.wikipedia.org&quot;
  title=&quot;http://de.wikipedia.org&quot; target=&quot;_blank&quot;&gt;Wikipedia&lt;/a&gt;
  <br>
  und stehen unter der &lt;a href=&quot;http://www.gnu.org/licenses/fdl.txt&quot;
  target=&quot;_blank&quot;&gt;GNU Free Documentation License&lt;/a&gt;. <br>
  Die Liste der Autoren ist in der Wikipedia unter <br>
  &lt;a href=&quot;http://de.wikipedia.org/w/wiki.phtml?title='.$search.'&amp;action=history&quot;
  target=&quot;_blank&quot; title=&quot;http://de.wikipedia.org/w/wiki.phtml?title='.$search.'&amp;action=history&quot;&gt;dieser
  Seite&lt;/a&gt; verf&amp;uuml;gbar, der Original-Artikel l&amp;auml;sst sich
  <br>
  &lt;a href=&quot;http://de.wikipedia.org/w/wiki.phtml?title='.$search.'&amp;action=edit&quot;
  target=&quot;_blank&quot; title=&quot;hierhttp://de.wikipedia.org/w/wiki.phtml?title='.$search.'&amp;action=edit&quot;&gt;hier&lt;/a&gt;
  <br>
  bearbeiten. <br>
  &lt;/p&gt;&lt;/small&gt;'); <br>
  ?&gt;</code> </p>
<p>Bei dem Skript handelt es sich im Endeffekt nur um einen gew&ouml;hnliche PHP
  Webseitengrabber, bei dem Inhalte von fremden Webseiten extrahiert werden um
  dann auf der eigenen Seite dargestellt zu werden. Das Skript wurde dahingehend
  erweitert, dass es nun auch die Wikipedia-Suche vollst&auml;ndig unterst&uuml;tzt.
  Falls zu einem gesuchten Begriff kein Artikel direkt gefunden wird, so wird
  automatisch die Wikipedia Suche gestartet und die Suchergebnisse dargestellt.</p>
<p>Man kann das Design der Ergebnisseite &uuml;ber CSS und etwas HTML komplett
  den eigenen W&uuml;nschen anpassen. Daf&uuml;r k&ouml;nnte man das komplette
  Skript per PHP Include in eine andere Seite einbinden &#8211; etwa an die Stelle,
  an der man ohnehin den Inhalt dargestellt haben m&ouml;chte. Da die deutschen
  Sonderzeichen in der Wikipedia-Datenbank nicht durch HTML Entit&auml;ten ersetzt
  werden, muss man im Head-Bereich der Ergebnisseite den verwendeten Zeichensatz
  auf utf-8 einstellen. Dies geschieht mit folgender meta-Anweisung:</p>
<p><code>&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;
  /&gt;</code></p>

<p><img src="http://www.devmag.net/wp-content/uploads/drweb-wikipedia.gif" width="394" height="301"> </p>
<p><span class="leg">Screenshot &#8211; Wikipedia in Dr.Web Design integriert (mit herk&ouml;mmlichen
  Dr.Web Stylesheet)</span></p>
<p>Zudem m&uuml;ssen Sie das PHP Skript so ab&auml;ndern, dass nicht mehr auf
  die Datei &quot;wikistatic.php&quot; verwiesen wird. In unserem Fall hei&szlig;t
  die PHP Datei, in die wikistatic.php per Include eingef&uuml;gt wurde &quot;drweb.php&quot;.
  Wir m&uuml;ssen nun in der Datei wikistatic.php alle Verweise in drweb.php umbenennen.
</p>
<p> <code>$puffer = str_replace( &quot;/w/index.php&quot;, &quot;/wikipedia/drweb.php&quot;,
  $puffer ); //ersetzt alle Vorkommen eines Strings in einem anderen String <br>
  $puffer = str_replace( &quot;/wiki/&quot;, &quot;/wikipedia/drweb.php?title=Spezial:Search&amp;search=&quot;,
  $puffer );</code> </p>
<p><strong>CSS Stylesheet</strong><br>
  Grunds&auml;tzlich kann man das Design der Seiten einfach &uuml;ber &Auml;nderungen
  am Wikipedia Stylesheet nach den eigenen W&uuml;nschen anpassen. Man muss in
  dem Skript lediglich den Verweis auf das Stylesheet ver&auml;ndern. Da Wikipedia
  wenig mit CSS Klassen arbeitet, muss man die generellen Tag-Formatierungen verwenden.
  D.h. die Darstellung von Blocks&auml;tzen definieren etc. Das Standardstylesheet
  von Wikipedia gibt&#8217;s <a href="wikipedia-stylesheet.css">hier</a> zum downloaden...<br>
  <br>
  <strong>Eine Suchbox f&uuml;r Wikipedia</strong><br>
  Eine einfache Suchbox f&uuml;r unser Wikipedia-Skript kann &uuml;ber folgende
  paar Zeilen HTML Code erzeugt werden:</p>
<p><code>&lt;div class=&quot;wiki_suchbox&quot;&gt;<br>
  &lt;h4&gt;Suchen in der Wikipedia Datenbank!&lt;/h4&gt;<br>
  &lt;form name=&quot;searchform&quot; action=&quot;/wikipedia/drweb.php&quot;
  method=&quot;get&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;title&quot;
  value=&quot;Spezial:Search&quot; /&gt;<br>
  &lt;input id=&quot;searchInput&quot; name=&quot;search&quot; type=&quot;text&quot;
  value=&quot;&quot; /&gt;<br>
  &lt;input type=&quot;submit&quot; name=&quot;go&quot; class=&quot;searchButton&quot;
  value=&quot;Artikel&quot; /&gt;&amp;nbsp;<br>
  &lt;input type=&quot;submit&quot; name=&quot;fulltext&quot; class=&quot;searchButton&quot;
  value=&quot;Suche&quot; /&gt;<br>
  &lt;/form&gt;<br>
  &lt;/div&gt;</code></p>
<p>Auch hier m&uuml;ssten Sie etwa den action-Parameter des Formular anpassen.
  Im n&auml;chsten Teil sollen weitere M&ouml;glichkeiten vorgestellt werden,
  wie Sie Wikipedia f&uuml;r ihre Besucher m&ouml;glichst n&uuml;tzlich integrieren
  k&ouml;nnen.<br>
</p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 2'>Wikipedia für die eigene Webseite – Teil 2</a></li><li><a href='http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html' rel='bookmark' title='Permanent Link: Eigene Web Services mit PHP5 bereitstellen? Kein Problem!'>Eigene Web Services mit PHP5 bereitstellen? Kein Problem!</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wikipedia für die eigene Webseite – Teil 2</title>
		<link>http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html</link>
		<comments>http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html#comments</comments>
		<pubDate>Sun, 03 May 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=44</guid>
		<description><![CDATA[Wikipedia ist in! Die deutschsprachige Ausgabe von Wikipedia ist die zweitgrößte weltweit und sie wächst und wächst weiter. Doch wie kann man Wikipedia für die eigenen Benutzer als nützliches Tool zugänglich machen und an die eigenen Wünsche anpassen?Dieser Artikel ist ebenfalls bei Dr.Web erschienen!
Bestimmt ist er Ihnen auch schon mal bei einer Reise durch das [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 1'>Wikipedia für die eigene Webseite – Teil 1</a></li><li><a href='http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html' rel='bookmark' title='Permanent Link: Eigene Web Services mit PHP5 bereitstellen? Kein Problem!'>Eigene Web Services mit PHP5 bereitstellen? Kein Problem!</a></li><li><a href='http://www.devmag.net/javascript-tricks/204-formulare-mit-links-statt-buttons.html' rel='bookmark' title='Permanent Link: Formulare mit Links statt Buttons'>Formulare mit Links statt Buttons</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_wikipedia_2.gif" width="60" height="60" class="illu" align="left" alt="Wikipedia für die eigene Webseite mit PHP – Teil 2" />Wikipedia ist in! Die deutschsprachige Ausgabe von Wikipedia ist die zweitgrößte weltweit und sie wächst und wächst weiter. Doch wie kann man Wikipedia für die eigenen Benutzer als nützliches Tool zugänglich machen und an die eigenen Wünsche anpassen?<span id="more-44"></span><p><small>Dieser Artikel ist ebenfalls bei Dr.Web erschienen!</small></p>
<p>Bestimmt ist er Ihnen auch schon mal bei einer Reise durch das WWW begegnet
  &#8211; der kleine Mr. Check der Firma Xpolis.Das kleine Tool hat jedoch auch
  seinen Preis &#8211; anfangs war er noch kostenlos zu haben, heute muss man
  ordentlich daf&uuml;r bezahlen (ab 14 &euro; pro Monat). Mit ein wenig Aufwand
  kann man jedoch ein &auml;hnlich funktionierendes System f&uuml;r umsonst programmieren.<br>
  Dabei verwenden wir wiederum unser Wikipedia-Skript und ein wenig JavaScript.
  Grunds&auml;tzlich soll der Benutzer wie bei Mr.Check sich ein Stichwort markieren
  k&ouml;nnen und daraufhin nach Klick auf den kleinen Helfer einen passenden
  Wikipedia Artikel zu sehen bekommen. So in etwa k&ouml;nnte unser kleiner Helfer
  bei Dr.Web aussehen: </p>
<p><img src="http://www.devmag.net/wp-content/uploads/bibliobulo.gif" alt="So in etwa k&ouml;nnte unser BiblioBulo aussehen" width="95" height="110"></p>
<span class="leg">So in etwa k&ouml;nnte unser BiblioBulo aussehen</span>
<p> Um zu ermitteln, welches Wort ein Benutzer markiert hat, muss man mit ein
  wenig JavaScript herumhantieren; f&uuml;r den Internet Explorer gibt es hierf&uuml;r
  das document.selection-Objekt, f&uuml;r Mozilla kann man direkt die document.getSelection()
  Funktion verwenden.</p>
<p> <code>&lt;script type=&quot;text/javascript&quot;&gt;<br>
  &lt;!--<br>
  function getString() {<br>
  var str;<br>
  if (document.selection) // fuer IE<br>
  {<br>
  str = document.selection.createRange().text;<br>
  if(str == &quot;&quot;) {<br>
  str = prompt(&quot;Bitte geben Sie den gesuchten Fachbegriff ein&quot;,&quot;&quot;);<br>
  }<br>
  }<br>
  else if(document.getSelection()) { //fuer Mozilla, etc.<br>
  str = document.getSelection();<br>
  if(str == &quot;&quot;) {<br>
  str = prompt(&quot;Bitte geben Sie den gesuchten Fachbegriff ein&quot;,&quot;&quot;);<br>
  }<br>
  }<br>
  else { //falls anderer Browser<br>
  str = prompt(&quot;Bitte geben Sie den gesuchten Fachbegriff ein&quot;,&quot;&quot;);<br>
  }<br>
  //PopUp wird ge&ouml;ffnet<br>
  wikipedia = window.open(&quot;http://localhost/wikipedia/wikistatic.php?begriff=&quot;+str,
  &quot;Wikipedia&quot;, &quot;width=500,height=500,scrollbars=yes,resizable=yes,toolbar=yes&quot;);
  <br>
  wikipedia.focus(); //Fokus auf PopUp setzen <br>
  }<br>
  // --&gt;<br>
  &lt;/script&gt;</code></p>
<p>Falls die Funktionen nicht unterst&uuml;tzt werden (Probleme gibt es eventuell
  mit Opera), so wird schlicht ein Javascript prompt-Fenster ge&ouml;ffnet, in
  das der Besucher den Fachbegriff manuell eintippen kann. Nachdem der Begriff
  erfolgreich in der Variablen str hinterlegt wurde, wird ein PopUp ge&ouml;ffnet.
  Die Gr&ouml;&szlig;e des PopUps und die angezeigten Toolbars kann man nat&uuml;rlich
  nach belieben anpassen. <br>
  &Uuml;ber den Query-String der Anfrage l&auml;dt es die entsprechenden Seiten
  von Wikipedia. Findet sich im Query-String z.B. die Anfrage search=php, so wird
  der Wikipedia Artikel &uuml;ber PHP ausgegeben. Sollte es sich bei dem Begriff
  um einen mit Leerzeichen verbundenen Begriff handeln, so wird das Leerzeichen
  http konform umgewandelt. Falls es zu einem bestimmten Begriff keinen Artikel
  geben, so wird die Suche bem&uuml;ht und die Suchergebnisse daraufhin angezeigt.</p>
<p>Unser BiblioBulo kann &uuml;ber folgenden Code in die Seite integriert werden:<br>
  <br>
  <code>&lt;a href=&quot;#&quot; onclick=&quot;javascript:getString()&quot;&gt;&lt;img
  src=&quot;bibliobulo.gif&quot; alt=&quot;BiblioBulo&quot;&gt;&lt;/a&gt;<br>
  <br>
  </code>Und so sieht das Beispiel dann aus:<br>
  <br>
  <img src="http://www.devmag.net/wp-content/uploads/bibliobulo-beispiel.gif"><span class="leg"><br>
  Fachbegriff XML wurde markiert, das Wikipedia-Skript liefert den passenden Artikel</span>
</p>
<p><strong>Fachbegriffe mit Wikipedia verlinken</strong><br>
  Mit HTML 4.0 wurden viele neue Textauszeichnungen eingef&uuml;hrt, z.B. der
  acronym-Tag, der eine Abk&uuml;rzung bzw. ein Akronym auszeichnet. Wer sich
  dieser Tags bedient hat, und seine Fachbegriffe oder Abk&uuml;rzungen stets
  mit solchen Textauszeichnungen ausgezeichnet hat, der soll nun davon auch ein
  wenig profitieren. Mithilfe von JavaScript und dem DOM soll nun anhand der acronym-Tags
  jedes Acronym auf verdacht mit unserem Wikipedia-Skript verlinkt werden.<br>
  <br>
  Das hierzu notwendige JavaScript funktioniert mit allen g&auml;ngigen Browsern
  (au&szlig;er Opera 6).</p>
<p><code>&lt;script type=&quot;text/javascript&quot;&gt;<br>
  function showFachbegriffe() {<br>
  if(document.getElementsByTagName &amp;&amp; document.getElementById) { //nur
  wenn der Browser das DOM unterst&uuml;tzt<br>
  <br>
  var acronym = document.getElementsByTagName(&quot;acronym&quot;); //alle Akronyme
  ermitteln<br>
  <br>
  for (var l = 0; l &lt; acronym.length; l++) {<br>
  var link = document.createElement(&quot;a&quot;); //Erzeugung des Links<br>
  var link_text = document.createTextNode(acronym[l].firstChild.nodeValue);<br>
  link.href=&quot;http://localhost/wikipedia/wikistatic.php?title=Spezial:Search&amp;search=&quot;+acronym[l].firstChild.nodeValue;<br>
  link.target=&quot;_blank&quot;;<br>
  link.appendChild(link_text);<br>
  acronym[l].appendChild(link);<br>
  acronym[l].firstChild.nodeValue=&quot;&quot;; //damit das Akronym nicht zweimal
  dasteht<br>
  }<br>
  } //Ende Browser-if<br>
  }//Ende Funktion<br>
  &lt;/script&gt;</code></p>
<p>Die Verweise auf das Skript m&uuml;ssten nat&uuml;rlich angepasst werden. Die
  Funktion muss beim laden der Seite aufgerufen werden. Dies kann &uuml;ber den
  onLoad-Eventhandler im body-Tag erreicht werden.</p>
<p><code>&lt;body onLoad=&quot;showFachbegriffe()&quot;&gt;</code></p>
<p>Man kann das ganze noch ein wenig weiter verzieren. Man k&ouml;nnte z.B. neben
  jedes Akronym noch ein kleines Icon setzen, das anzeigt, dass der Link auf die
  Wikipedia Datenbank verweist.<br>
  <br>
  Hierzu m&uuml;sste man den JavaScript-Code um ein paar Zeilen erweitern:</p>
<p><code>for (var l = 0; l &lt; acronym.length; l++) {<br>
  var icon = document.createElement(&quot;img&quot;);<br>
  icon.src=&quot;wikipedia-favicon.png&quot;;<br>
  icon.alt=&quot;Fachbegriff: &quot; + acronym[l].firstChild.nodeValue; <br>
  var link = document.createElement(&quot;a&quot;); //Erzeugung des Links<br>
  var link_text = document.createTextNode(acronym[l].firstChild.nodeValue);<br>
  link.href=&quot;http://localhost/wikipedia/wikistatic.php?title=Spezial:Search&amp;search=&quot;+acronym[l].firstChild.nodeValue;<br>
  link.target=&quot;_blank&quot;;<br>
  link.appendChild(link_text);<br>
  acronym[l].appendChild(link);<br>
  acronym[l].firstChild.nodeValue=&quot;&quot;; //damit das Akronym nicht zweimal
  dasteht<br>
  acronym[l].appendChild(icon); //Icon hinzuf&uuml;gen<br>
  }</code></p>
<p>Das Ergebnis k&ouml;nnte im Browser etwa wie folgt aussehen:<br>
  <br>
  <img src="http://www.devmag.net/wp-content/uploads/wikipedia-links-markiert.gif"><br>
  &nbsp;<span class="leg">Jedes Akronym wurde mit Wikipedia verlinkt und entsprechend
  gekennzeichnet</span></p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 1'>Wikipedia für die eigene Webseite – Teil 1</a></li><li><a href='http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html' rel='bookmark' title='Permanent Link: Eigene Web Services mit PHP5 bereitstellen? Kein Problem!'>Eigene Web Services mit PHP5 bereitstellen? Kein Problem!</a></li><li><a href='http://www.devmag.net/javascript-tricks/204-formulare-mit-links-statt-buttons.html' rel='bookmark' title='Permanent Link: Formulare mit Links statt Buttons'>Formulare mit Links statt Buttons</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshop: Einführung in Webservices</title>
		<link>http://www.devmag.net/php/63-workshop-einfhrung-in-webservices.html</link>
		<comments>http://www.devmag.net/php/63-workshop-einfhrung-in-webservices.html#comments</comments>
		<pubDate>Thu, 12 Mar 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webservices]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=63</guid>
		<description><![CDATA[
Der Begriff Webservices wird das Internet f&#252;r die n&#228;chsten
  Jahre tiefgreifend pr&#228;gen &#8211; doch was sind Webservices &#252;berhaupt,
  wie funktionieren sie und wie kann sie ein Webworker nutzen? Auf diese Fragen
  gibt dieser Workshop antwort.          Schon der Begriff &#34;Webservices&#34; enth&#228;lt eine eigentliche Definition.
 [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_webservice.jpg" class="illu" width="60" height="60" align="left" alt="Workshop: Einf&uuml;hrung in Webservices " />
Der Begriff Webservices wird das Internet f&uuml;r die n&auml;chsten
  Jahre tiefgreifend pr&auml;gen &#8211; doch was sind Webservices &uuml;berhaupt,
  wie funktionieren sie und wie kann sie ein Webworker nutzen? Auf diese Fragen
  gibt dieser Workshop antwort.<span id="more-63"></span>          <p>Schon der Begriff &quot;Webservices&quot; enth&auml;lt eine eigentliche Definition.
  Webservices sind Dienste, die &uuml;ber das Internet bereitgestellt werden.
  Trotz dieser scheinbar recht einfachen Definition, haben sich die &quot;Gro&szlig;en&quot;,
  Microsoft, IBM, Hewlett Packard, Sun etc. noch nicht auf eine einheitliche Definition
  geeinigt. Unter <a href="http://www.jeckle.de/webServices/">http://www.jeckle.de/webServices/</a>
  finden Sie eine Auflistung der verschiedensten Definitionen von, was Webservices
  eigentlich sind. <br>
  Als kleinster gemeinsamer Nenner kann man sagen, dass &uuml;ber Webservices
  dem Client (das ist der Nutzer) Funktionen, Daten und Anwendungen bereitgestellt
  werden k&ouml;nnen.<br>
  Dabei ist der Client nicht mehr der vor seinem Computer sitzende Surfer &#8211;
  es sind eigenst&auml;ndige Anwendungen, welche Webservices f&uuml;r die eigene
  Programmfunktion nutzen.<br>
  Ein einfaches Beispiel daf&uuml;r sind die Google Webservices. Dabei kann ein
  Programmierer &uuml;ber Webservices auf die m&auml;chtige Google Suchfunktionen
  zur&uuml;ckgreifen, und diese in die eigene Anwendung integrieren. So k&ouml;nnen
  z.B. siteinterne Suchmaschinen ohne viel Aufwand erstellt werden; dies soll
  im dritten Teil dieses Workshops beleuchtet werden. <br>
  &Uuml;ber Webservices kann man folglich ganze Anwendungen modellieren. Doch
  wie funktioniert die Kommunikation zwischen den verschiedenen Anwendungen? Die
  Daten m&uuml;ssen ja in irgendeiner Form von einem Programm zum anderen geschickt
  werden.<br>
  Das versenden der Daten wird &uuml;ber das http Protokoll bewerkstelligt. Die
  Anfragen und Antworten werden in Form von XML gesendet. Man hat sich auf diese
  beiden Standards geeinigt, da sie quasi &uuml;berall &quot;verstanden&quot;
  werden. Sie sind plattform- und insbesondere programmiertechnisch unabh&auml;ngig.
  <br>
  Die Anfragen an den Webservice werden folglich in XML verpackt und &uuml;ber
  http versendet. Die XML Nachricht wird vom Webservice interpretiert und wiederum
  in Form von XML beantwortet. <br>
  Da Webservices f&uuml;r die Integration von Programmfunktionen in anderen Anwendungen
  gedacht sind, musste man sich auch hier auf eine einheitliche Form der Daten&uuml;bertragung
  zum Nutzen aller einigen. So entstand SOAP, das Simple Object Access Protocol,
  basierend auf XML. Dadurch wurde erreicht, dass alle Webservice Anfragen und
  Antworten eine einheitliche Form haben. Zwar gibt es auch Webservices, die nicht
  auf SOAP zur&uuml;ckgreifen, jedoch wird sich SOAP in Zukunft durchsetzen, da
  nur durch eine einheitliche Daten&uuml;bertragung die Nutzung von Webservices
  eine allgemeine Bedeutung erlangen kann.<br>
  Ein Anfrage besteht, wie man im folgenden Diagramm sehen kann aus einem festen
  Grundger&uuml;st.<br>
  <br>
  <img src="http://www.devmag.net/wp-content/uploads/webservices_soap_message.png" width="241" height="277" alt="Struktur einer SOAP Nachricht"><br>
  <strong>Struktur einer SOAP Nachricht</strong></p>
<p>Das Grundger&uuml;st &auml;hnelt sehr dem einer HTML Seite, bestehend aus einem
  Head- und einem Body-Bereich, in welchem die Antwort- bzw. Anfragedaten abgelegt
  sind.</p>
<p>In der folgenden Abbildung ist ein einfaches Schema f&uuml;r den Datenfluss
  bei der Nutzung von Webservices abgebildet. Dabei besitzt die Anwendung welche
  auf den Webservice zur&uuml;ckgreift ebenfalls einen XML Interpreter, &uuml;ber
  welchen die XML Daten in ein Format &uuml;berf&uuml;hrt werden, in welchem sie
  weiterverarbeitet werden k&ouml;nnen. Die SOAP Antwort muss folglich von der
  Anwendung verarbeitet werden. Auf diese Weise wird die Nutzung von Webservices
  nicht nur auf einzelne Programmiersprachen beschr&auml;nkt. Man kann Webservices
  &uuml;ber jede Programmiersprache verwenden, die eine XML bzw. SOAP Schnittstelle
  besitzt.<br>
  <br>
  <img src="http://www.devmag.net/wp-content/uploads/webservices_datenfluss.png" width="463" height="287" alt="Einfaches Datenflussdiagramm f&uuml;r die Nutzung von Webservices"><br>
  <strong>Einfaches Datenflussdiagramm f&uuml;r die Nutzung von Webservices</strong></p>
<p>Man kann dieses einfache Modell noch erweitern, indem man sich den Webservice
  auf welchen man zur&uuml;ckgreift selbst als eine Anwendung betrachtet welche
  auf verschiedene andere Webservices zur&uuml;ckgreift. </p>
<p>Man kann sich das an einem einfachen Beispiel veranschaulichen. Bei einer Buchbestellung
  m&ouml;chten Sie den Status ihrer Bestellung verfolgen. So k&ouml;nnen sie bei
  dem Verk&auml;ufer den Status bis zum versenden betrachten. Bei dem Zusteller
  (z.B. der Post) k&ouml;nnen sie den weiteren Verlauf verfolgen.<br>
  Durch Webservices ist es nun m&ouml;glich, dass der Verk&auml;ufer den Status
  der Bestellung auch &uuml;ber die eigenen Systemgrenzen verfolgen kann, indem
  er auf einen Webservice des Zustellers zur&uuml;ckgreift und dort den Status
  des Versandes ermitteln kann und diesen an den K&auml;ufer weitergeben kann.</p>
<p>Das ist nur ein einfaches Beispiel der Integration von Webservices in andere
  Anwendungen.</p>
<p>Nachdem die grundlegende Funktion von Webservices gekl&auml;rt ist, m&uuml;ssen
  noch weitere Aspekte in Betracht gezogen werden, die sich insbesondere f&uuml;r
  den Programmierer ergeben, der von Webservices gebrauch machen m&ouml;chte.<br>
  Den woher wei&szlig; der Programmierer auf welche Funktionen er bei der Nutzung
  von Webservices zur&uuml;ckgreifen kann, bzw. welche Parameter diese brauchen.<br>
  Hierzu wurde von IBM und Microsoft gemeinsam die Webservice Description Language,
  kurz WSDL, entwickelt. Sie basiert auf XML und erm&ouml;glicht die standarisierte
  Beschreibung von Webservices &#8211; sie wird auch vom W3C als m&ouml;glicher
  Standard diskutiert.</p>
<p>Ein weiteres Problem, welches Auftritt ist, dass bei einer Vielzahl von Webservices
  unklar ist, wer &uuml;berhaupt was anbietet. Die Webservices m&uuml;ssen irgendwo
  verzeichnet sein. Idealerweise sollte der Webservicenutzer nur noch eine Anfrage
  an das Webserviceverzeichnis machen m&uuml;ssen; dieses leitet ihn dann direkt
  weiter an den f&uuml;r die Anfrage passenden Webservice. Ein solches &quot;Telefonbuch&quot;
  f&uuml;r Webservices wurde durch UDDI (Universal Description, Discovery and
  Integration) geschaffen. In ihm sind die Webservice Anbieter und die von ihnen
  angebotenen Webservices verzeichnet. Bereits viele Anbieter haben UDDI implementiert.</p>
<p>Doch was f&uuml;r Chancen oder Zukunftsaussichten liegen in Webservices? Der
  Nutzen f&uuml;r Unternehmen ist eindeutig, da sie bei ihren Anwendungen einfach
  gesagt, nicht mehr alles selbst programmieren m&uuml;ssen. Die einzelnen Firmen
  werden sich durch ihre Webservices st&auml;rker als bisher vernetzen und so
  insbesondere in den Beziehungen zu den Kunden verbessern.</p>
<h3>Doch was bedeutet das f&uuml;r den Internetnutzer? </h3>
<p>Eine Vision ist, dass man &uuml;ber Webservices eine Personalisierung des ganzen
  Internets einf&uuml;hren kann. So hat Microsoft bereits &uuml;ber ihr .NET Passport
  einen ersten Schritt dahingehend getan. &Uuml;ber einen .NET Passport kann man
  auf die verschiedensten Angebote von Microsoft zugreifen ohne jedes Mal ein
  neuen Account anlegen zu m&uuml;ssen. Das hei&szlig;t man m&uuml;sste seine
  pers&ouml;nlichen Daten nur noch in einem virtuellen Pass hinterlegen, &uuml;ber
  welchen man dann auf die verschiedensten Internetdienste zur&uuml;ckgreifen
  kann. <br>
  Dies wird jedoch auch heftig diskutiert, da damit erhebliche Sicherheitsbedenken
  verbunden sind. </p>
<p>Webworker selbst k&ouml;nnen Webservices bisher nur in beschr&auml;nkten Ma&szlig;e
  nutzen. Bei den in diesem Workshop betrachteten Webservices von Google und Amazon
  k&ouml;nnen Webworker auf die Produktpalette von Amazon bzw. auf die Suchfunktion
  von Google zur&uuml;ckgreifen und diese in die eigene Webseite integrieren.
  Es bleibt also noch zu erwarten in wie weit Webservices das Leben eines Webworkers
  beeinflussen wird &#8211; im Rahmen dieses Workshops soll der Nutzen der beiden
  betrachteten Webservices f&uuml;r den Webworker in den Vordergrund gestellt
  werden.</p>
<p>(<a href="/informationen/autoren.htm">tf</a>) </p></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/63-workshop-einfhrung-in-webservices.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML mit PHP und Expat parsen</title>
		<link>http://www.devmag.net/php/810-xml-mit-php-und-expat-parsen.html</link>
		<comments>http://www.devmag.net/php/810-xml-mit-php-und-expat-parsen.html#comments</comments>
		<pubDate>Thu, 26 Feb 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=810</guid>
		<description><![CDATA[XML ist das Datenformat der Zukunft. Mit der PHP Erweiterung Expat kann man XML durch PHP parsen. Dadurch er&#246;ffnen sich viele neue M&#246;glichkeiten.            XML ist als reine Datensprache viel mächtiger als einfache SQL
            [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_xml_expat_1.gif" width="60" height="60" align="left" class="illu" alt="XML mit PHP und Expat parsen " />XML ist das Datenformat der Zukunft. Mit der PHP Erweiterung Expat kann man XML durch PHP parsen. Dadurch er&ouml;ffnen sich viele neue M&ouml;glichkeiten.<span id="more-810"></span>            <P>XML ist als reine Datensprache viel mächtiger als einfache SQL
              basierende Datenbanken, die sich auf dem zweidimensionalen Rahmen
              beschränken. Mit XML sind vielfach ineinander verschachtelte Datensysteme
              möglich. <BR>
              <BR>
              Die Erkennung der einzelnen Daten aus XML Dateien, und deren dynamische
              Veränderung ist ungemein wichtig, da man ohne diese Funktionalität
              nicht effektiv auf XML Datenbanken zurückgreifen kann. <BR>
              Speziell für Webanwendungen ist es in dieser Hinsicht schwierig
              mit XML umzugehen. <BR>
              Eine einfache Möglichkeit mit XML Daten umzugehen bietet Expat.
              Expat ist in die PHP 4 Version integriert, und kann bei der Installation
              durch die Option "-with-xml" installiert werden.<BR>
              Expat ist ereignisorientiert. Das bedeutet, das zunächst einzelne
              Funktionen für die verschiedene Ereignisse definiert werden. <BR>
              Ein Ereignis kann z.B. ein öffnendes Element, ein schließendes Element
              oder der Inhalt, der von einem öffnenden, und einem schließendem
              Element eingeklammert ist, sein.<BR>
              <B><BR>
              Für folgende Elemente können Funktionen definiert werden.<BR>
              </B>
            <UL>
              <LI>Startendes Element, mit Attributen (&lt;inhalt nr="10"&gt;)
              <LI>Normaler Text "Character Data", zwischen den öffnendem und schließendem
                Element
              <LI>Abschließendes Element (&lt;/inhalt&gt;)
              <LI>Kommentare
              <LI>DTD Anweisungen
              <LI>Procession Instructions - eingebettete PHP Anweisungen </LI>
            </UL>
            <P>Wichtig ist, das man die Arbeitsweise von Expat versteht. Expat
              untersucht ein XML Dokument zeilenweise. Aufgrund dessen muss das
              Dokument Zeile für Zeile, also über eine Schleife von Expat geparset
              werden. <BR>
              Expat erkennt das öffnende Element, z.B. <B>&lt;inhalt&gt;</B>,
              und übergibt es an die definierte Funktion für öffnende Elemente.
              Darauf entdeckt er den Inhalt dazwischen. Ist dies einfacher Text,
              dann wird dieser an die entsprechende Funktion überreicht, die die
              Inhalte behandelt. Diese Inhalte, die nicht weiter in andere Tags
              verschachtelt sind, nennt man CDATA, Character Data. Zum Schluss
              wird das schließende Element gefunden, und entsprechend über die
              definierte Funktion behandelt.<BR>
              <BR>
             <h4> Einen XML Parser erzeugen</h4>
            <p>Ein XML Parser wird immer für das XML Dokument individuell erzeugt.<BR>
              <BR>
              <B>$parser = xml_parser_create();</B><BR>
              Der Parser wird erzeugt. Die Variable $parser verweist auf den erzeugten
              Parser, sodass dieser einmalig gekennzeichnet ist.<BR>
              <BR>
              <B>xml_set_element_handler($parser,"startElement","endElement");</B><BR>
              Hiermit werden die Funktionen für das öffnende, und das schließende
              Element angegeben. "startElement" verweist auf die entsprechende
              Funktion startElement(), und endElement verweist auf die entsprechende
              Funktion "endElement".<BR>
              <BR>
              <B>xml_set_character_data_handler($parser, "characterdata");</B><BR>
              Hiermit wird auf die Funktion für CDATA (normaler Text) verwiesen.<BR>
              <B><BR>
              xml_set_processing_instruction_handler($parser, "pi");</B><BR>
              Hier wird auf die Funktion verwiesen, die Processing Instructions
              behandelt (mehr dazu im zweiten Teil).<BR>
              <B><BR>
              xml_set_default_handler($parser, "default");</B><BR>
              Diese Funktion wird aufgerufen, wenn für das Ereignis keine andere
              Funktion definiert ist. Man kann sagen, das die default-Funktion
              aufgerufen wird, wenn ein Fehler aufgetreten ist, z.B. wenn man
              sich verschrieben hat usw.<BR>
            </p>
            <h4>Der erste eigene Parser</h4>
            <p>Die Arbeitsweise von Expat sollte nun im kleinen zumindest klar
              sein. Hier nun unser erster kleiner Parser, der auf das folgende
              XML Dokument zugeschnitten ist.<br>
              <B><br>
              inhalt.xml</B><BR>
              <CODE>&lt;?xml version="1.0"?&gt;<BR>
              &lt;inhalt&gt;<BR>
              Irgend ein Text, der nur dasteht, um<BR>
              Platz zu verschwenden.<BR>
              &lt;/inhalt&gt;</CODE> <BR>
              <BR>
              Diese XML Datei wird von dem folgendem Parser geparsed.<br>
              <b><br>
              inhalt.php</b> <br>
              <br>
              <code>&lt;?php<br>
              <br>
              function startElement($parser, $element_name, $element_attribute)
              {<br>
              global $ausgabe;<br>
              //Umwandeln in Kleinbuchstaben<br>
              $element_name = strtolower($element_name);<br>
              //&Uuml;berpr&uuml;fung des Elementnames<br>
              if ($element_name==&quot;inhalt&quot;) {<br>
              $ausgabe .= &quot;&lt;h3&gt;Inhalt&lt;/h3&gt;&lt;p&gt;&quot;;<br>
              }<br>
              }<br>
              function endElement($parser, $element_name) {<br>
              global $ausgabe;<br>
              // in Kleinbuchstaben umwandeln<br>
              $element_name = strtolower($element_name);<br>
              // &Uuml;berpr&uuml;fung des Names eines Elementes<br>
              if ($element_name==&quot;inhalt&quot;) {<br>
              $ausgabe .= &quot;&lt;/p&gt;&quot;;<br>
              }<br>
              }<br>
              function cdata($parser, $element_inhalt) {<br>
              global $ausgabe;<br>
              // Der normale Text wird an $ausgabe angeh&auml;ngt<br>
              $ausgabe .= $element_inhalt;<br>
              }<br>
              $xmlFile = file(&quot;inhalt.xml&quot;);<br>
              $parser = xml_parser_create();<br>
              xml_set_element_handler($parser, &quot;startElement&quot;, &quot;endElement&quot;);<br>
              xml_set_character_data_handler($parser, &quot;cdata&quot;);<br>
              <br>
              foreach($xmlFile as $elem) <br>
              {<br>
              xml_parse($parser, $elem);<br>
              }<br>
              xml_parser_free($parser);<br>
              <br>
              echo $ausgabe;<br>
              ?&gt;</code> </P> <p></p>
            <P>Die Ausgabe nach dem Aufruf des Skriptes sieht wie folgt aus:<br>
              <br>
              <img src="http://www.devmag.net/wp-content/uploads/php_xml_expat_1.gif" width="363" height="75" border="1" alt="Ihr erstes von PHP geparstes XML Dokument"><b><br>
              Ihr erstes von PHP geparstes XML Dokument</b> <br>
              <br>
              Um die Arbeitsweise des Skriptes zu verstehen, sollte jede der definierten
              Funktionen einzelne bearbeitet werden.<br>
              <br>
              Zun&auml;chst behandeln wir die Funktion, die aufgerufen wird, wenn
              Expat ein &ouml;ffnendes Element findet. In unserem Beispiel ist
              das <code>&lt;inhalt&gt;</code>.<br>
              An die Funktion wird die Variable $parser &uuml;bergeben. In ihr
              wird auf den erzeugten XML Parser verwiesen. &Uuml;ber die Variable
              $element_name wird der <b>Names des Elementes</b> &uuml;bergeben.
              In unserem Beispiel ist der Name des Elementes &quot;inhalt&quot;.
              Zudem kann an die Funktion die Attribute, und deren Werte &uuml;bergeben
              werden. Wie Sie diese mit XML Parsen erfahren Sie im zweiten Teil
              des Workshops.<br>
              In der ersten Zeile der Funktion selbst wird auf die Variable $ausgabe
              verwiesen, und ihr <b>Globale Eigenschaften</b> gegeben. D.h. die
              Variable ist nicht nur in der Funktion vorhanden, sondern auf au&szlig;erhalb.
              So kann man direkt auf den Wert der Variablen zugreifen, ohne diesen
              an die Funktion zu &uuml;bergeben. Zudem kann der Wert auf direkt
              aus der Funktion heraus ver&auml;ndert werden.<br>
              <br>
              <code>function startElement($parser, $element_name, $element_attribute)
              {<br>
              global $ausgabe;<br>
              //Umwandeln in Kleinbuchstaben<br>
              $element_name = strtolower($element_name);<br>
              //&Uuml;berpr&uuml;fung des Elementnames<br>
              if ($element_name==&quot;inhalt&quot;) {<br>
              $ausgabe .= &quot;&lt;h3&gt;Inhalt&lt;/h3&gt;&lt;p&gt;&quot;;<br>
              }<br>
              }<br>
              <br>
              </code> Die n&auml;chste Anweisung wandelt den Namen des Elementes
              in Kleinbuchstaben um, da Expat die Namen eines Elementes immer
              in <b>Gro&szlig;buchstaben</b> &uuml;bergibt. Dies muss nicht gemacht
              werden, dient aber zu einem einfacheren Verst&auml;ndnis des Codes.<br>
              Im n&auml;chsten Teil wird &uuml;berpr&uuml;ft, ob der Name des
              Elementes &quot;inhalt&quot; ist. Ist dies der Fall, dann wird an
              die Globale Variable $ausgabe der Inhalt &quot;&lt;h3&gt;Inhalt&lt;/h3&gt;&lt;p&gt;&quot;
              &uuml;ber den Stringoperator &quot;.&quot; angeh&auml;ngt.<br>
              <br>
              Eigentlich ist eine &Uuml;berpr&uuml;fung auf den Namen des Elementes<b>
              nicht notwendig</b>, da in der XML Datei sowieso nur ein Element
              vorkommt. Da wir jedoch in den n&auml;chsten Teil des Workshops
              mit etwas komplexeren Beispielen in die Materie einsteigen, sollte
              auf diese zwei Zeilen Code nicht verzichtet werden.<br>
              <br>
              Nun, wollen wir uns mit der Funktion f&uuml;r den normalen Flie&szlig;text,
              CDATA k&uuml;mmern. Diese hat nur eine Aufgabe. Sie muss den Inhalt
              des Elemenets an die Globale Variable $ausgabe anh&auml;ngen. <br>
              <br>
              <code>function cdata($parser, $element_inhalt) {<br>
              global $ausgabe;<br>
              // Der normale Text wird an $ausgabe angeh&auml;ngt<br>
              $ausgabe .= $element_inhalt;<br>
              }</code> <br>
              <br>
              Der Inhalt des aktuell geparten Element wird &uuml;ber die Variable
              $element_inhalt &uuml;bergeben. Dieser wird an die Variable $ausgabe
              angeh&auml;ngt.<br>
              <br>
              Die letzte Funktion ist f&uuml;r die schlie&szlig;enden Elemente
              zust&auml;ndig. Diese Funktion arbeitet auf der gleichen Weise,
              wie die Funktion f&uuml;r das &ouml;ffnende Element.<br>
              <br>
              <code>function endElement($parser, $element_name) {<br>
              global $ausgabe;<br>
              // in Kleinbuchstaben umwandeln<br>
              $element_name = strtolower($element_name);<br>
              // &Uuml;berpr&uuml;fung des Names eines Elementes<br>
              if ($element_name==&quot;inhalt&quot;) {<br>
              $ausgabe .= &quot;&lt;/p&gt;&quot;;<br>
              }<br>
              }</code> <br>
              <br>
              Das sind die Funktionen, die in diesem Beispiel ben&ouml;tigt werden.
              Nun muss die XML Datei eingelesen werden, und daraufhin der Parser
              definiert bzw. erzeugt werden.<br>
              <br>
              <code>$xmlFile = file(&quot;inhalt.xml&quot;);<br>
              $parser = xml_parser_create();<br>
              xml_set_element_handler($parser, &quot;startElement&quot;, &quot;endElement&quot;);<br>
              xml_set_character_data_handler($parser, &quot;cdata&quot;);<br>
              <br>
              foreach($xmlFile as $elem) <br>
              {<br>
              xml_parse($parser, $elem);<br>
              }<br>
              xml_parser_free($parser);<br>
              <br>
              echo $ausgabe;</code><br>
              <br>
              In der ersten Zeile wird die Datei &uuml;ber die file() Funktion
              in ein Array gelesen. In der zweiten Zeile wird der Parser erzeugt.
              Darauf werden die einzelnen Handler festgelegt. <br>
              Der letzte und wichtigste Teil des Skriptes ist, das der Inhalt
              des Arrays &uuml;ber eine foreach-Schleife einzeln &uuml;ber die
              Funktion xml_parse() geparsed wird.<br>
              In der vorletzten Zeile wird der Parser wieder &quot;zerst&ouml;rt&quot;,
              d.h. alle belegten Resourcen werden wieder frei gegeben. In der
              letzten Zeile wird nun der Inhalt der Variablen $ausgabe ausgegeben.
              In ihr befindet sich der Inhalt, der &uuml;ber die einzelnen Funktionen
              &quot;dynamisch&quot; aus der XML Datei extrahiert wurde. <br>
              (<a href="/informationen/autoren.htm">tf</a>) </p></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/810-xml-mit-php-und-expat-parsen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Template System &#8211; FastTemplate</title>
		<link>http://www.devmag.net/php/49-php-template-system-fasttemplate.html</link>
		<comments>http://www.devmag.net/php/49-php-template-system-fasttemplate.html#comments</comments>
		<pubDate>Mon, 26 Jan 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=49</guid>
		<description><![CDATA[In diesem Artikel lernen Sie das PHP Template System "FastTemplate", mit den Techniken, und den Möglichkeiten, sowie der Anwendung kennen.            Es gibt verschiedene Arten
              von Template Systemen in PHP. FastTemplate ist [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_fast_template.gif" width="60" height="60" class="illu" align="left" alt="PHP Template System - FastTemplate" />In diesem Artikel lernen Sie das PHP Template System "FastTemplate", mit den Techniken, und den Möglichkeiten, sowie der Anwendung kennen.<span id="more-49"></span>            <p>Es gibt verschiedene Arten
              von Template Systemen in PHP. FastTemplate ist ein Template System, welches blockartig aufgebaut ist.
              D.h. der Designer kann einzelne Bl&ouml;cke oder Bereiche einer
              Seite designen, das System kombiniert diese Bl&ouml;cke dann entsprechend
              mit den aufzuf&uuml;llenden Daten. FastTemplate ist eine PHP Klasse,
              die von <a href="http://www.thewebmasters.net/php/" target="_blank">http://www.thewebmasters.net/php/</a>
              heruntergeladen werden kann. Diese Klasse muss in das PHP Programm
              eingebunden, und ein Objekt davon abgeleitet werden.<br>
              <b><br>
              template.tpl</b><br>
              <br>
              <code>&lt;html&gt;&lt;head&gt;<br>
              &lt;title&gt;<b>{title}</b>&lt;/title&gt;<br>
              &lt;/head&gt;<br>
              &lt;body&gt;<br>
              &lt;h1&gt;<b>{title}</b>&lt;/h1&gt;<br>
              &lt;p&gt;&lt;b&gt;<b>{teaser}</b>&lt;/b&gt;&lt;/p&gt;<br>
              &lt;p&gt;<b>{inhalt}</b>&lt;/p&gt;<br>
              &lt;/body&gt;<br>
              &lt;/html&gt;</code> <br>
              <br>
              Die Platzhalter bei diesem Template sind in geschweiften Klammern.
              Dadurch werden Sie eindeutig. Man kann die Platzhalter auch anders
              gestalten, sodass es zu keinen Konflikten zwischen den {} der Platzhalter,
              und z.B. den {} Klammern eines JavaScripts kommt. Die Platzhalter
              k&ouml;nnten z.B. auch wie folgt aussehen <b>{(title)}</b>. Wie
              Platzhalter aussehen ist also egal, die Platzhalter m&uuml;ssen
              nur als solche an die FastTemplate Klasse &uuml;bergeben werden,
              da FastTemplate ja sonst die Platzhalter nicht &quot;entdecken&quot;
              k&ouml;nnte, und dadurch nichts ersetzen w&uuml;rde.<br>
              <br>
              Nun aber zur&uuml;ck zu unserem Beispiel. Wir m&ouml;chten, dass
              die einzelnen Platzhalter des Templates durch die entsprechenden
              Inhalte ersetzt werden.<br>
              <br>
              1. Zun&auml;chst muss, wie bereits erl&auml;utert die Klasse &quot;class.FastTemplate.php&quot;
              in das Skript eingebunden werden.<br>
              <br>
              <code>&lt;?php <br>
              include &quot;class.FastTemplate.php3&quot;;</code><br>
              <br>
              2. Daraufhin muss von dieser Klasse ein Objekt erzeugt werden. &Uuml;ber
              dieses Objekt wird mit der Klasse &quot;kommuniziert&quot;, und
              die einzelnen Methoden aufgerufen, und die Ergebnisse empfangen.<br>
              <br>
              <code>$tpl = new FastTemplate(&quot;.&quot;);</code><br>
              <br>
              Die <b>Pfadangabe</b> in der Klammer (der Punkt) verweist auf den
              Ordner, aus dem die verschiedenen HTML Templates geladen werden.
              Der Punkt steht hierbei f&uuml;r das aktuelle Verzeichnis.<br>
              <br>
              3. Jetzt wird das Template, bzw. die Templates, die verwendet werden,
              definiert. Dabei wird die define() Methode von FastTemplate verwendet.<br>
              <code>$tpl-&gt;define(array(<br>
              &quot;template&quot; =&gt; &quot;template.tpl&quot;<br>
              ));</code><br>
              Es wird ein <b>assoziatives Array</b> erzeugt. Dabei ist der Index,
              hier im Beispiel &quot;template&quot;, der Name des Templates. &Uuml;ber
              diesen Namen wird das Template im weiteren angesprochen.<br>
              Wie Sie sehen k&ouml;nnen Sie <b>mehrere Templates</b> definieren,
              und diese auch gleichzeitig nutzen. So ist es m&ouml;glich &uuml;ber
              mehrere Templates eine Seite in einzelnen Bl&ouml;cken aufzubauen.<br>
              <br>
              4. Im n&auml;chsten Schritt werden die verschiedenen Platzhalter
              definiert, und angegeben, mit welchen Werten diese gef&uuml;llt
              werden sollen. Es wird hierzu die assign() - Methode von FastTemplate
              verwendet.<br>
              <br>
              <code>$tpl-&gt;assign(&quot;{title}&quot;, &quot;Der Titel&quot;);<br>
              <code>$tpl-&gt;assign(&quot;{teaser}&quot;, &quot;Der Teaser&quot;);</code><br>
              <code>$tpl-&gt;assign(&quot;{inhalt}&quot;, &quot;Der Inhalt&quot;);</code><br>
              </code> <br>
              Es ist klar, das die Anwendung so kaum Sinn macht, da man hierbei
              die Inhalte innerhalb der PHP Funktion definieren m&uuml;sste.<br>
              Ein Verweis auf eine Variable, mit dem Inhalt macht mehr Sinn. Dieser
              Inhalt kann zuvor z.B. aus einer Datenbank, oder einer Textdatei
              ausgelesen worden sein. Die Defintion des Inhalts k&ouml;nnte also
              auch wie folgt aussehen:<br>
              <code>$tpl-&gt;assign(&quot;{title}&quot;, $title);</code><br>
              Mit diesem Schritt kennt FastTemplate die einzelnen Platzhalter,
              und wei&szlig;, mit welchen Werten diese zu ersetzen sind.<br>
              <br>
              5. Nun kann eigentlich der letzte Schritt in Angriff genommen werden.
              Es muss nur noch der Inhalt mit dem Template kombiniert werden.
              Dies muss auch explizit angewiesen werden.<br>
              <code>$tpl-&gt;parse(&quot;ausgabe&quot;, &quot;template&quot;);<br>
              $tpl-&gt;FastPrint(&quot;ausgabe&quot;);<br>
              ?&gt; </code><br>
              Es wird die FastTemplate Funktion parse() aufgerufen. An diese Funktion
              werden zwei Parameter &uuml;bergeben. Der erste Parameter ist ein
              Name. &Uuml;ber diesen Namen wird der Output, also das Ergebnis
              aus dem Parsen des Templates und des Inhaltes zugegriffen. Er ist
              notwendig, da man &uuml;ber ihn z.B. die Ausgabefunktion in der
              n&auml;chsten Zeile aufrufen muss. Dadurch wird sichergestellt,
              dass das Ergebnis ein<b> einzelner Block </b>ist, der noch weiter
              bearbeitet kann. <br>
              Der zweite Parameter verweist auf das Template. Hierbei wird der
              Name des Templates verwendet, welcher im Schritt 3 definiert wurde.<br>
              Das Ergebnis wird nun in der letzten Zeile ausgegeben.<br>
              <br>
              Das komplette PHP Skript:<br>
              <br>
              <code>&lt;?php <br>
              include &quot;class.FastTemplate.php3&quot;;<br>
              $tpl = new FastTemplate(&quot;.&quot;);<br>
              </code><code>$tpl-&gt;define(array(<br>
              &quot;template&quot; =&gt; &quot;template.tpl&quot;<br>
              ));</code><br>
              <code>$tpl-&gt;assign(&quot;{title}&quot;, &quot;Der Titel&quot;);<br>
              <code>$tpl-&gt;assign(&quot;{teaser}&quot;, &quot;Der Teaser&quot;);</code><br>
              <code>$tpl-&gt;assign(&quot;{inhalt}&quot;, &quot;Der Inhalt&quot;);<br>
              $tpl-&gt;parse(&quot;ausgabe&quot;, &quot;template&quot;);<br>
              $tpl-&gt;FastPrint(&quot;ausgabe&quot;);<br>
              ?&gt; </code></code><br>
              <br>
            </p>
            <h4>N&uuml;tzliche Anwendung von FastTemplate</h4>
            <p>Dieses Beispiel hat ja noch kaum die St&auml;rke von FastTemplate
              gezeigt. Das folgende Beispiel hat die Aufgabe, einzelne Artikel
              mit einer ID aus einer Datenbank zu laden, und die Werte den Platzhaltern
              zuzuweisen. Das Ergebnis ist folglich ein kleines <b>CMS</b>. Die
              Daten der Artikel werden in der Datenbank gespeichert, &uuml;ber
              die ID des Artikels im URL werden diese &uuml;ber das Skript geladen,
              und schlussendlich &uuml;ber FastTemplate mit dem Template kombiniert,
              und ausgegeben.<br>
              <br>
              Die Datenbank-Tabelle &quot;article&quot; wird &uuml;ber folgendes
              SQL Statement erzeugt.<br>
              <br>
              <code>CREATE TABLE article (id INT not null AUTO_INCREMENT, title
              VARCHAR (30) not null , teaser VARCHAR (250) not null , inhalt TEXT
              not null , PRIMARY KEY (id)) <br>
              </code> <br>
              In ihr wird die ID des Artikels, der Titel, der Teaser, sowie der
              Inhalt selbst gespeichert.<br>
              <br>
              Nun das PHP Programm, das auf diese Daten in der Datenbank zur&uuml;ckgreift,
              und &uuml;ber FastTemplate ausgibt.<br>
              Es wird das gleiche Template wie oben verwendet, nur das die Datenbank-Funktionen
              hinzugef&uuml;gt worden sind.<br>
              <b><br>
              show_article.php</b><br>
              <br>
              <code>&lt;?php <br>
              // FastTemplate Klasse wird geladen<br>
              include &quot;class.FastTemplate.php3&quot;;<br>
              <br>
              //Variablen f&uuml;r die Datenbankverbindung<br>
              $user = &quot;&quot;;<br>
              $pass = &quot;&quot;;<br>
              $host = &quot;localhost&quot;;<br>
              $db = &quot;cms&quot;;<br>
              <br>
              //Verbindung wird aufgebaut<br>
              $connid = mysql_connect($host, $user, $pass);<br>
              <br>
              //Template Objekt wird erzeugt, Templates definiert<br>
              $tpl = new FastTemplate(&quot;.&quot;);<br>
              $tpl-&gt;define(array(<br>
              &quot;template&quot; =&gt; &quot;template.tpl&quot;<br>
              ));<br>
              <br>
              //wenn die $ID in dem URL vorhanden ist...<br>
              if (isset($ID)) {<br>
              <br>
              //Daten werden aus der Datenbank geladen<br>
              $sql = &quot;Select*From article where id='$ID'&quot;;<br>
              if (!$erg = mysql_db_query($db, $sql, $connid)) {<br>
              echo &quot;Artikel nicht in DB vorhanden!&lt;br&gt;&quot;; }<br>
              else {<br>
              $erg2 = mysql_fetch_array($erg, MYSQL_ASSOC);<br>
              <br>
              //Daten und Platzhalter werden definiert<br>
              $tpl-&gt;assign(&quot;{title}&quot;, $erg2[&quot;title&quot;]);<br>
              $tpl-&gt;assign(&quot;{teaser}&quot;, $erg2[&quot;teaser&quot;]);<br>
              $tpl-&gt;assign(&quot;{inhalt}&quot;, $erg2[&quot;inhalt&quot;]);<br>
              <br>
              //Parsing-Schritt<br>
              $tpl-&gt;parse(&quot;ausgabe&quot;, &quot;template&quot;);<br>
              $tpl-&gt;FastPrint(&quot;ausgabe&quot;);<br>
              }<br>
              }<br>
              echo &quot;Sie haben keinen Artikel ausgew&auml;hlt!&lt;br&gt;&quot;;<br>
              mysql_close($connid);<br>
              ?&gt; </code><br>
              <br>
              Nun, die Erkl&auml;rung der Arbeitsweise ist eigentlich leicht zu
              erkennen. <br>
              In der ersten Zeile wird wiederum die FastTemplate Klasse eingebunden.
              In den folgenden Zeilen werden die Daten f&uuml;r die MySQL Verbindung
              angegeben. <br>
              Daraufhin wird die <b>Verbindung zur MySQL Datenbank</b> aufgebaut.
              <br>
              Daraufhin wird von der Template Klasse ein Objekt erzeugt, und das
              Template definiert. <br>
              Dem Aufruf des PHP Skripts &quot;show_article.php&quot;, wird als
              <b>Parameter</b> eine ID gegeben (z.B. show_article.php?ID=1). &Uuml;ber
              diese ID wird der Artikel aus der Datenbank gelesen. Ist diese ID
              nicht im URL vorhanden, oder kann &uuml;ber diese ID kein Artikel
              aus der Datenbank gelesen werden, dann wird das Programm vorzeitig
              beendet.<br>
              Das SQL Statement, welches den Artikel aus der Datenbank lie&szlig;t
              wird dynamisch generiert, da die ID ja vom URL abh&auml;ngig ist,
              macht dies ja auch nur Sinn.<br>
              <code>$sql = &quot;Select*From article where id='$ID'&quot;;</code>
              <br>
              Daraufhin wird der Query an die Datenbank gesendet. Wird kein Ergebnis
              zur&uuml;ckgegeben, wird das die Fehlermeldung <code>&quot;Artikel
              nicht in DB vorhanden!&quot;</code> ausgegen. Ansonsten wird aus
              den Ergebnissen &uuml;ber die mysql_fetch_array() Funktion ein Array
              erzeugt. Die Konstante &quot;MYSQL_ASSOC&quot; besagt, dass es sich
              bei dem Array um ein assoziatives Array handelt, dessen Index der
              Name der MySQL Tabellenspalte ist.<br>
              <code>$erg2 = mysql_fetch_array($erg, MYSQL_ASSOC);<br>
              //Daten und Platzhalter werden definiert<br>
              $tpl-&gt;assign(&quot;{title}&quot;, $erg2[&quot;title&quot;]);<br>
              $tpl-&gt;assign(&quot;{teaser}&quot;, $erg2[&quot;teaser&quot;]);<br>
              $tpl-&gt;assign(&quot;{inhalt}&quot;, $erg2[&quot;inhalt&quot;]);<br>
              </code><br>
              Ist dies geschafft, so ist der gr&ouml;&szlig;te Teil der Arbeit
              schon gemacht worden. Jetzt werden die Werte in dem Array noch den
              passenden Platzhaltern zugewiesen, FastTemplate parsed das Template,
              und gibt das Ergebnis aus. <br>
              <code>$tpl-&gt;parse(&quot;ausgabe&quot;, &quot;template&quot;);<br>
              $tpl-&gt;FastPrint(&quot;ausgabe&quot;);</code> <br>
              <br>
              Voli&agrave; - Ein kleines System zum Laden von Artikeln aus der
              Datenbank, und das Anzeigen &uuml;ber das Template System FastTemplate
              ist fertig.<br>
              <br>
              Das Programm gibt es auch zum downloaden 
              und Testen. (<a href="/informationen/autoren.htm">tf</a>)</p></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/49-php-template-system-fasttemplate.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SimpleXML PHP 5 und XML: Einfach einfach!!</title>
		<link>http://www.devmag.net/php/65-simplexml-php-5-und-xml-einfach-einfach.html</link>
		<comments>http://www.devmag.net/php/65-simplexml-php-5-und-xml-einfach-einfach.html#comments</comments>
		<pubDate>Fri, 09 Jan 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=65</guid>
		<description><![CDATA[Die  neue PHP-Version 5 (PHP5) enth&#228;lt  neben zahlreichen anderen Neuerungen auch die Erweiterung SimpleXML. Mit ihr kann XML auf erstaunlich einfache Art in ein PHP Objekt &#252;berf&#252;hrt und verarbeitet werden.       Bisher  ist SimpleXML  auf experimenteller Basis ver&#246;ffentlicht worden, so dass sich bis zur Erscheinung der [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/xml/96-xml-schema-elemente-und-attribute.html' rel='bookmark' title='Permanent Link: XML Schema &#8211; Elemente und Attribute'>XML Schema &#8211; Elemente und Attribute</a></li><li><a href='http://www.devmag.net/xml/95-was-ist-xml-schema-einfuhrung-in-xml-schema.html' rel='bookmark' title='Permanent Link: Was ist XML Schema? &#8211; Einführung in XML Schema'>Was ist XML Schema? &#8211; Einführung in XML Schema</a></li><li><a href='http://www.devmag.net/xml/91-xml-einfhrung.html' rel='bookmark' title='Permanent Link: XML Einf&uuml;hrung'>XML Einf&uuml;hrung</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_simple_xml.gif" width="60" height="60" align="left" class="illu" alt="SimpleXML PHP 5 und XML: Einfach einfach!!" />Die  neue PHP-Version 5 (PHP5) enth&auml;lt  neben zahlreichen anderen Neuerungen auch die Erweiterung SimpleXML. Mit ihr kann XML auf erstaunlich einfache Art in ein PHP Objekt &uuml;berf&uuml;hrt und verarbeitet werden.<span id="more-65"></span>       <p>Bisher  ist SimpleXML  auf experimenteller Basis ver&ouml;ffentlicht worden, so dass sich bis zur Erscheinung der finalen Version von PHP 5 noch einiges ver&auml;ndern kann. Insbesondere Funktionsnamen und &auml;hnliches k&ouml;nnten betroffen sein. SimpleXML muss nicht  mehr mitinstalliert werden. In den neuen <a href="http://www.php.net/downloads.php" target="_blank">PHP5 Distributionen</a> wird SimpleXML standardm&auml;&szlig;ig mitkonfiguriert.<br>
&nbsp;<br>
Und simpel ist SimpleXML in der Tat. Ein einfaches XML Dokument, wie z.B. artikel.xml kann in wenigen Schritten mit SimpleXML verarbeitet werden.</p>
<p>artikel.xml:</p>
<p><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt;<br>
  &lt;artikel&gt;<br>
     &lt;titel&gt;Der Titel&lt;/titel&gt;<br>
     &lt;teaser&gt;Der Teaser, eine kurze Beschreibung&lt;/teaser&gt;<br>
     &lt;inhalt&gt;Der Artikelinhalt an sich&lt;/inhalt&gt;<br>
  &lt;/artikel&gt;</code><br>
&nbsp;<br>
Um beispielsweise an den Inhalt des &lt;teaser&gt; Elementes zu gelangen, bedarf es nur weniger Zeilen Code:</p>
<p>simplexml_1.php:<br>
&nbsp;<br>
<code>&lt;?php<br>
&nbsp;<br>
if (file_exists('artikel.xml')) {<br>
   $xml = simplexml_load_file('artikel.xml');<br>
&nbsp;<br>
echo $xml-&gt;teaser[0];<br>
&nbsp;<br>
} else {<br>
   exit('Konnte Datei nicht laden.');<br>
}<br>
?&gt;</code><br>
&nbsp;<br>
Durch die simplexml_load_file() Funktion wird die XML Datei eingelesen und <strong>direkt in ein Objekt &uuml;berf&uuml;hrt</strong>. Auf die Elemente des Objektes kann jetzt wie auf normale Objekte zugegriffen werden. Die Ausgabe erfolgt &uuml;ber das $xml Objekt, welches nichts anderes als das Wurzelelement &lt;artikel&gt; darstellt. </p>
<p>Dabei erfolgt der Zugriff auf die Elemente jeweils &uuml;ber Arrays. Da in unserem Fall nur ein Element innerhalb des <strong>Wurzelelementes</strong> &lt;artikel&gt; als &lt;teaser&gt; Element verwendet wird, geschieht der Zugriff auf den Inhalt dieses Elementes mit dem Arrayindex 0. W&auml;ren zwei &lt;teaser&gt; Elemente verwendet, w&uuml;rde man &uuml;ber den Index 1 auf das zweite Element zugreifen.</p>
<p>Um zu verstehen, wie bei SimpleXML die Daten in Objekten gespeichert werden, kann man sich mit der var_dump() Funktion von PHP schlicht <strong>den gesamten Inhalt</strong> des Objektes ausgeben lassen. Man &auml;ndert den Code einfach wie folgt ab:</p>
<p>simplexml_1.php:</p>
<p><code>&lt;?php<br>
&nbsp;<br>
if (file_exists(&quot;artikel.xml&quot;)) {<br>
   $xml = simplexml_load_file(&quot;artikel.xml&quot;');<br>
&nbsp;<br>
var_dump($xml);<br>
} <br>
else {<br>
   exit(&quot;Konnte Datei nicht laden. &quot;);<br>
}<br>
?&gt;</code></p>
<p>Die Ausgabe nach Aufruf des Skriptes  sieht wie folgt aus:</p>
<p><code>object(SimpleXMLElement)#1 (3) <br>
{ <br>
[&quot;titel&quot;]=&gt; string(9) &quot;Der Titel&quot; <br>
[&quot;teaser&quot;]=&gt; string(35) &quot;Der Teaser, eine kurze Beschreibung&quot; <br>
[&quot;inhalt&quot;]=&gt; string(25) &quot;Der Artikelinhalt an sich&quot; <br>
}</code><br>
&nbsp;<br>
Darin erkennt man die gesamte Struktur des XML Dokumentes wieder. SimpleXML erkennt, dass das Dokument genau aus einem Element object(SimpleXMLElement)#1  besteht, welches drei object(SimpleXMLElement)#1 (3) untergeordnete Elemente beherbergt. Diese Elemente, ihr Datentyp und deren Inhalte werden dann in  geschweiften Klammern angegeben.</p>
<p>Wenn man bedenkt, dass zum Parsen eines XML Dokumentes mit dem ereignisorientierten
    Parser <a href="/webprog/php_xml_expat_1.htm">Expat</a> mindestens drei Funktionen
    definiert werden mussten, ist der hierzu notwendige Aufwand mit SimpleXML
    nicht vergleichbar.</p>
<p><strong>Komplexere XML Dokumente und SimpleXML?</strong><br>
Auch komplexe XML Dokumente lassen sich mit SimpleXML rasch bearbeiten. Folgendes XML Dokument ist fast identisch mit dem Beispiel oben, es wurde jedoch  mit Attributen und weiteren Elementen versehen.<br>
&nbsp;<br>
artikel_2.xml:</p>
<p> <code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt; <br>
 &lt;content&gt;<br>
 &lt;artikel id=&quot;1&quot;&gt;<br>
 &lt;meta&gt;<br>
&nbsp; &lt;keywords&gt;ein,netter,artikel&lt;/keywords&gt; <br>
&nbsp; &lt;description&gt;ein,lustiger,artikel&lt;/description&gt; <br>
&nbsp; &lt;/meta&gt;<br>
&nbsp; &lt;titel&gt;Der Titel&lt;/titel&gt; <br>
&nbsp; &lt;teaser&gt;Der Teaser, eine kurze Beschreibung&lt;/teaser&gt; <br>
&nbsp; &lt;inhalt&gt;Der Artikelinhalt&lt;/inhalt&gt; <br>
&nbsp; &lt;/artikel&gt;<br>
 &lt;artikel id=&quot;2&quot;&gt;<br>
 &lt;meta&gt;<br>
&nbsp; &lt;keywords&gt;ein,zweiter,netter,artikel&lt;/keywords&gt; <br>
&nbsp; &lt;description&gt;ein,zweiter,lustiger,artikel&lt;/description&gt; <br>
&nbsp; &lt;/meta&gt;<br>
&nbsp; &lt;titel&gt;Der zweite Titel&lt;/titel&gt; <br>
&nbsp; &lt;teaser&gt;Der zweite Teaser, eine kurze Beschreibung&lt;/teaser&gt; <br>
&nbsp; &lt;inhalt&gt;Der zweite Artikelinhalt&lt;/inhalt&gt; <br>
&nbsp; &lt;/artikel&gt;<br>
&nbsp; &lt;/content&gt;</code><br>
&nbsp;<br>
Da SimpleXML ausgesprochen modular aufgebaut ist und viele Schnittstellen zu weiteren PHP- beziehungsweise XML Technologien aufweist, k&ouml;nnen komplexe Untersuchungen von XML Dokumenten zum Beispiel &uuml;ber den in SimpleXML integrierten <strong>XPath Prozessor</strong> durchgef&uuml;hrt werden. Das hei&szlig;t, man kann &uuml;ber die Pfadangaben in XPath auf die gesuchten Elemente zugreifen.</p>
<p>Dies soll im folgenden Beispiel geschehen &#8211; es soll lediglich der vom Besucher angefragte Artikel angezeigt werden. Der gew&uuml;nschte Artikel wird durch die <strong>ID</strong> identifiziert, die im &lt;artikel&gt; Element als Attribut definiert ist. Diese ID wird &uuml;ber den URL an das PHP Programm &uuml;bergeben. </p>
<p>simplexml2.php</p>
<p><code>&lt;?php</code></p>
<p><code>$id = $_GET['id'];</code></p>
<p><code>if (file_exists(&quot;test.xml&quot;)) {</code></p>
<p><code>   $xml = simplexml_load_file(&quot;test.xml&quot;);</code></p>
<p><code>   $path =&quot;/content/artikel[@id=&quot;.$id.&quot;]&quot;;</code></p>
<p><code>   if (!$res = $xml-&gt;xpath($path)) {<br>
   echo &quot;Artikel nicht vorhanden!&quot;;<br>
   }<br>
   else {<br>
   echo &quot;&lt;h1&gt;&quot;.$res[0]-&gt;titel.&quot;&lt;/h1&gt;&quot;;<br>
   echo &quot;&lt;p&gt;&lt;b&gt;&quot;.$res[0]-&gt;teaser.&quot;&lt;/b&gt;&lt;/p&gt;&quot;;<br>
   echo &quot;&lt;p&gt;&quot;.$res[0]-&gt;inhalt.&quot;&lt;/p&gt;&quot;;<br>
   }<br>
}<br>
 else {<br>
   exit(&quot;Konnte Datei nicht laden.&quot;);<br>
}<br>
?&gt;</code><br>
&nbsp;<br>
Auf den gew&uuml;nschten Artikel wird &uuml;ber den XPath Pfad /content/artikel[@id=&quot;.$id.&quot;] zugegriffen. Die Anfrage wird &uuml;ber die xpath() Methode verarbeitet und das Ergebnis der Variable $res zur&uuml;ckgegeben. In diesem Array sind nun alle Elemente des gesuchten <strong>Artikel-Objektes</strong> gespeichert. Auf diese kann wie auf ein Objekt zugegriffen werden.</p>
<p><img src="http://www.devmag.net/wp-content/uploads/php_simple_xml.gif" alt="Screenshot" width="278" height="228" border="1"><br>
<span>Das Ergebnis beim Aufruf mit id=1</span></p>
<p>Nat&uuml;rlich kann man ein solches Problem auch ohne XPath l&ouml;sen, SimpleXML stellt die dazu notwendigen Funktionen zur Verf&uuml;gung &#8211; doch bietet SimpleXML gerade durch die Schnittstelle zu XPath viele weitere <strong>M&ouml;glichkeiten f&uuml;r die dynamische Programmierung</strong>. SimpleXML sollte also nicht untersch&auml;tzt werden.</p>
<p>Weitere Informationen  zu <a href="http://php.net/simplexml%20" target="_blank">SimpleXML und PHP5</a>.</p>
(<a href="/informationen/autoren.htm">tf</a>) </p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/xml/96-xml-schema-elemente-und-attribute.html' rel='bookmark' title='Permanent Link: XML Schema &#8211; Elemente und Attribute'>XML Schema &#8211; Elemente und Attribute</a></li><li><a href='http://www.devmag.net/xml/95-was-ist-xml-schema-einfuhrung-in-xml-schema.html' rel='bookmark' title='Permanent Link: Was ist XML Schema? &#8211; Einführung in XML Schema'>Was ist XML Schema? &#8211; Einführung in XML Schema</a></li><li><a href='http://www.devmag.net/xml/91-xml-einfhrung.html' rel='bookmark' title='Permanent Link: XML Einf&uuml;hrung'>XML Einf&uuml;hrung</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/65-simplexml-php-5-und-xml-einfach-einfach.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
