<?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>ROAE-Blog &#187; Zend</title>
	<atom:link href="http://blog.root-of-all-evil.com/tag/zend/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.root-of-all-evil.com</link>
	<description>Studium, Codeing und Gedachtes</description>
	<lastBuildDate>Mon, 30 Jan 2012 22:58:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Validierung von URLs mit Zend_Validate</title>
		<link>http://blog.root-of-all-evil.com/2010/04/validierung-von-urls-mit-zend_validate/</link>
		<comments>http://blog.root-of-all-evil.com/2010/04/validierung-von-urls-mit-zend_validate/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 09:45:38 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Url erreichbar]]></category>
		<category><![CDATA[Url prüfen]]></category>
		<category><![CDATA[Validator]]></category>
		<category><![CDATA[Validierung]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Validator]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=701</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/04/validierung-von-urls-mit-zend_validate/" title="Validierung von URLs mit Zend_Validate"></a>Dieser Beitrag beschreibt kurz wie man mit Zend_Validate prüfen kann, ob eine URL / URI syntaktisch korrekt und die verlinkte Ressource erreichbar ist. Aufbau einer URL prüfen Ein eigenständiger Validator ist im Zend Framework nicht vorhanden welcher den Aufbau einer &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/04/validierung-von-urls-mit-zend_validate/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/04/validierung-von-urls-mit-zend_validate/" title="Validierung von URLs mit Zend_Validate"></a><p>Dieser Beitrag beschreibt kurz wie man mit Zend_Validate prüfen kann, ob eine <strong>URL / URI syntaktisch korrekt und die verlinkte Ressource erreichbar ist</strong>.</p>
<p><span id="more-701"></span></p>
<h3>Aufbau einer URL prüfen</h3>
<p>Ein eigenständiger Validator ist im Zend Framework nicht vorhanden welcher den Aufbau einer URL / URI prüft. Jedoch bietet <strong>Zend_URI mit der Methode check()</strong> hier eine entsprechende Funktionalität an. Auf diese greifen wir in einem selbst geschriebenen Validator zurück:</p>
<pre class="php" title="code">class Validator_Uri extends Zend_Validate_Abstract {
	const INVALID_URI = 'invalidUri';
	protected $_messageTemplates = array (self::INVALID_URI =&gt; "'%value%' is not a valid URI" );

	public function isValid($value) {
		$this-&gt;_setValue ($value);

		if (! Zend_Uri::check ($value)) {
			$this-&gt;_error ( self::INVALID_URI );
			return false;
		}

		return true;
	}
}</pre>
<h3>Erreichbarkeit einer URL prüfen</h3>
<p>Es ist nicht nur wichtig, dass die Ressourcenangabe in Ihrem Aufbau korrekt ist, sondern auch, dass sich dahinter ein erreichbares Objekt (Webseite, Bild, PDF etc.) befindet.<br />
Mit Hilfe der PHP-Funktion <strong>get_headers prüfen wir den Antwort-Header</strong> auf Erfolg (200 OK). Mit Hilfe des <strong>@ unterdrücken wir eine Fehler-Ausgabe</strong> von PHP, wenn der String an get_headers keine URL sein sollte:</p>
<pre class="php" title="code">class Validator_Uri_Reachable extends Zend_Validate_Abstract {
	const URI_REACHABLE = 'uriReachable';
	protected $_messageTemplates = array (self::URI_REACHABLE =&gt; "'%value%' not reachable" );

	public function isValid($value) {
		$this-&gt;_setValue ( $value );

		$headers = @get_headers ( $value );
		if (! preg_match ( '/200 OK/', $headers [0] )) {
			$this-&gt;_error ();
			return false;
		}

		return true;
	}
}</pre>
<p>Entsprechend kann dann in einem Zend-Formular z.B. eine Homepageadresse geprüft werden:</p>
<pre class="php" title="code">$hpUrl = new Zend_Form_Element_Text ( 'hpUrl' );
$hpUrl-&gt;setLabel ( 'Homepage:' )
			  -&gt;setDescription ( 'Ihre Homepage- oder Blog-Adresse' );
			  -&gt;setAttrib ( 'value', 'http://' )
			  -&gt;addValidator ( new Validator_Uri() )
			  -&gt;addValidator ( new Validator_Uri_Reachable() )</pre>
<p>Weitere Links:</p>
<ul>
<li><a href="http://framework.zend.com/manual/de/zend.validate.writing_validators.html">Zend Framework Dokumentation &#8211; Schreiben von Prüfern</a></li>
<li><a href="http://usphp.com/manual/en/function.get-headers.php">PHP &#8211; Funktion getheaders</a></li>
<li><a href="http://de.wikipedia.org/wiki/URL#Aufbau">Wikipedia &#8211; Aufbau einer URL</a></li>
<li><a href="http://blog.root-of-all-evil.com/2010/03/tools-fur-regex-regulare-ausdrucke/">ROAE Blog &#8211; Tools für Regex / Reguläre Ausdrücke</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/04/validierung-von-urls-mit-zend_validate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL Passwort zurücksetzen unter Windows</title>
		<link>http://blog.root-of-all-evil.com/2010/03/mysql-passwort-zurucksetzen-unter-windows/</link>
		<comments>http://blog.root-of-all-evil.com/2010/03/mysql-passwort-zurucksetzen-unter-windows/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 12:18:36 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[passwort]]></category>
		<category><![CDATA[passwort löschen]]></category>
		<category><![CDATA[passwort vergessen]]></category>
		<category><![CDATA[passwort zurücksetzen]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[windos]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=478</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/03/mysql-passwort-zurucksetzen-unter-windows/" title="MySQL Passwort zurücksetzen unter Windows"></a>Ein kurzer Beitrag welcher beschreibt, wie man unter Windows das Passwort des Benutzers root zurücksetzen, bzw. neu setzen kann, wenn man es vergessen hat. Um das vergessene Passwort des root Benutzers bei MySQL neu zu setzen sind 3 Schritte notwendig: &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/03/mysql-passwort-zurucksetzen-unter-windows/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/03/mysql-passwort-zurucksetzen-unter-windows/" title="MySQL Passwort zurücksetzen unter Windows"></a><p>Ein kurzer Beitrag welcher beschreibt, wie man unter Windows das Passwort des Benutzers root zurücksetzen, bzw. neu setzen kann, wenn man es vergessen hat.</p>
<p><span id="more-478"></span></p>
<p>Um das vergessene Passwort des root Benutzers bei MySQL neu zu setzen sind 3 Schritte notwendig:</p>
<ul>
<li>MySQL-Daemon beenden</li>
<li>Init-Datei mit neuem Passwort anlegen</li>
<li>MySQL-Daemon mit Init-Datei starten &#8211; Passwort wird auf &#8220;Init-Passwort&#8221; gesetzt</li>
</ul>
<p>Die notwendigen Schritte werden gefolgt beschrieben bei Verwendung von Windows 7.</p>
<h3>Den MySQL-Daemon beenden</h3>
<p>Ein laufender MySQL-Daemon muss zuerst beendet werden, damit wir das Passwort ändern können. Hier werden zwei Varianten beschrieben, wobei Variante 1 klar zu empfehlen ist.</p>
<p><strong>Variante 1: MySQL-Daemon über die Computerverwaltung beenden</strong></p>
<p>Rufen Sie die Computerverwaltung über die folgende Schritte auf.</p>
<p style="text-align: center;"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/computerverwaltung_komplett.jpg" rel="lightbox[478]"><img class="size-full wp-image-514 aligncenter" title="computerverwaltung_komplett" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/computerverwaltung_komplett.jpg" alt="" width="554" height="427" /></a></p>
<p>In der Computerverwaltung wählen Sie links im Baum den Bereich Dienste (<span style="color: #ff0000;">1</span>), rechts MySQL (<span style="color: #ff0000;">2</span>) und beenden den Dienst zuletzt über das Stop-Icon (<span style="color: #ff0000;">3</span>).</p>
<p style="text-align: center;"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/mysql_beenden.jpg" rel="lightbox[478]"><img class="size-full wp-image-482 aligncenter" title="mysql_beenden" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/mysql_beenden.jpg" alt="" width="493" height="148" /></a></p>
<p><strong>Variante 2: MySQL-Daemon über den Task-Manager beenden/ killen</strong></p>
<p><em>(Diesen Schritt brauchen Sie nur durchführen, wenn Sie über die Computerverwaltung MySQL nicht beenden konnten).</em></p>
<p>Starten Sie den Task-Manger durch einen Rechtsklick auf die Taskleiste und einen Klick auf <em>Task-Manager starten</em>. Klicken Sie im Task-Manager auf den Button <em>Prozesse aller Benutzer anzeigen</em>, um auch die Systemprozesse und somit MySQL gelistet zu bekommen.</p>
<div id="attachment_499" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/alle-prozesse.jpg" rel="lightbox[478]"><img class="size-medium wp-image-499" title="alle prozesse" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/alle-prozesse-300x102.jpg" alt="" width="300" height="102" /></a><p class="wp-caption-text">Auch Systemprozesse anzeigen</p></div>
<p>Klicken Sie auf Abbildname (<span style="color: #ff0000;">1</span>) um alle Prozesse alphabetisch zu sortieren. Selektieren Sie nun in der Liste den Eintrag mysqld.exe (<span style="color: #ff0000;">2</span>). Diesen Prozess können Sie nun durch <em>Prozess beenden</em> (<span style="color: #ff0000;">3</span>) beenden. Bestätigen Sie die Aktion in dem Sie bei der Sicherheitsabfrage erneut auf <em>Prozess beenden</em> (<span style="color: #ff0000;">4</span>) klicken.</p>
<div id="attachment_500" class="wp-caption aligncenter" style="width: 815px"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/mysql_killen.jpg" rel="lightbox[478]"><img class="size-full wp-image-500" title="mysql_killen" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/mysql_killen.jpg" alt="" width="805" height="470" /></a><p class="wp-caption-text">Killen von MySQL über den Task-Manager</p></div>
<h3>Init-Datei anlegen</h3>
<p>Die Init-Datei enthält Anweisungen, welche beim Starten von MySQL direkt ausgeführt werden. Wir hinterlegen in ein solchen Datei nun eine Direktive, um das Passwort des Users root zu ändern.</p>
<p>Legen Sie auf dem Desktop eine Datei mit dem Namen <em>mysql-init.txt</em> an. Öffen Sie Datei und kopieren Sie folgende SQL-Anweisung hinein</p>
<pre class="sql" title="code">SET PASSWORD FOR 'root'@'localhost' = PASSWORD('geheim');</pre>
<p>Natürlich können Sie statt <em>geheim </em>jedes erdenkliche Passwort verwenden.</p>
<h3>MySQL-Daemon mit init-Datei starten</h3>
<p>Nun starten wir den MySQL-Daemon mit der init-Datei, welcher wir zuvor erstellt haben.</p>
<p>Öffnen Sie eine Eingabeaufforderung (<em>Startmenü -&gt; CMD -&gt; ENTER</em>). Geben Sie nun folgende Anweisung ein:</p>
<pre class="html" title="code">&lt;Pfad mysqld.exe&gt; --init-file=C:\Users\&lt;Ihr Windowsbenutzer&gt;\Desktop\my-init.txt --console</pre>
<p>So sieht der Aufruf z.B. aus wenn MySQL in einem Unterordner namens <em>Zend </em>installiert ist:</p>
<div id="attachment_502" class="wp-caption aligncenter" style="width: 687px"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/console-mysqlinit.jpg" rel="lightbox[478]"><img class="size-full wp-image-502" title="console mysqlinit" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/console-mysqlinit.jpg" alt="" width="677" height="342" /></a><p class="wp-caption-text">mysqld mit --init-file aufgerufen</p></div>
<p>Das Passwort wurde nun auf Ihren Wert, welchen Sie im Schritt Init-Datei anlegen festgelegt haben, gesetzt. Beenden Sie nun die Eingabeaufforderung durch STRG + C. Starten Sie nun anschließend wieder mysql über die Diensteverwaltung (siehe oben), in dem Sie das Start-Icon benutzen.</p>
<p>Anschließend können Sie wie gewohnt MySQL nutzen &#8211; jetzt aber mit Ihrem neuen Passwort.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/03/mysql-passwort-zurucksetzen-unter-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Entwickeln mit Zend &#8211; Teil 1, Einführung</title>
		<link>http://blog.root-of-all-evil.com/2010/03/entwickeln-mit-zend-teil-1-einfuhrung/</link>
		<comments>http://blog.root-of-all-evil.com/2010/03/entwickeln-mit-zend-teil-1-einfuhrung/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 14:27:59 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Projekt mit Zend]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Server]]></category>
		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=447</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/03/entwickeln-mit-zend-teil-1-einfuhrung/" title="Entwickeln mit Zend - Teil 1, Einführung"></a>In dieser Reihe von Publizierungen werden alle notwendigen Schritte beschrieben, eine professionelle Entwicklungsumgebung aufzusetzen mit welcher mit dem Zend Framework entwickelt werden kann. Als ZF-Projekt soll beispielhaft ein Gästebuch mit Administrationsbereich erstellt werden. Hierfür wird zuerst auf dem System (Windows &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/03/entwickeln-mit-zend-teil-1-einfuhrung/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/03/entwickeln-mit-zend-teil-1-einfuhrung/" title="Entwickeln mit Zend - Teil 1, Einführung"></a><p>In dieser Reihe von Publizierungen werden alle notwendigen Schritte beschrieben, eine professionelle Entwicklungsumgebung aufzusetzen mit welcher mit dem <a href="http://framework.zend.com/">Zend Framework</a> entwickelt werden kann. Als ZF-Projekt soll beispielhaft ein Gästebuch mit Administrationsbereich erstellt werden.</p>
<p>Hierfür wird zuerst auf dem System (Windows 7) Apache, MySQL und PHP installiert (Zend Community Server) und der Apache entsprechend konfiguriert, dass das zukünftige Projekt über Virtual Hosts ansprechbar ist. Um den Code komfortabel zu verwalten verwenden wir das Versionskontrollsystem Subversion welches wir gegen unbefugte Benutzung absichern werden. Anschließend wird eine Entwicklungsumgebung (Zend Studio für Eclipse) installiert, welche komfortabel mit der Versionsverwaltung und dem Server zusammenarbeiten kann.</p>
<p>Letzlich wird begonnen das eigentliche Projekt, die Programmierung des Gästebuchs, mit Hilfe von verschiedenen Pattern (z.B. MVC) umzusetzen.</p>
<h3><span id="more-447"></span>Was ist das Zend Framework</h3>
<p>Das Zend Framework (oft abgekürzt mit ZF) ist ein komponentenorientieres Framework für PHP 5, welches zahlreiche Klassen bereit stellt mit welchen sehr komfortabel Anwendungen entwickelt werden können.<br />
Komponentenorientiert in diesen Zusammenhang heißt, dass neue Anwendungen komplett auf dem Framework bassierend entwickelt werden können- alternativ können zu bestehenden Anwendungen aber auch nur bestimmte Funktionen, z.B. Cacheing, Authentifizierung, von dem Framework genutzt werden.<br />
Im März 2006 wurde die erste Pre-Alpha-Version 0.1.1 vorgestellt und wird seit dem stetig von Zend Technologies &#8211; den Entwicklern von PHP &#8211; weiterentwickelt.</p>
<h3>Warum das Zend Framework</h3>
<p>Frameworks sind mehrere dutzende verfügbar, eine Wahl fällt hier auf den ersten Blick sehr schwer. Stellt man jedoch eine Reihe von Kriterien auf, wird die Auswahl schnell auf wenige eingeschränkt. Ich möchte hier nur ein Paar der zahlreichen Vorteile listen, welche ich bei dem Zend Framework gegenüber anderen Frameworks sehe:</p>
<ul>
<li>Komponentenbasierend<br />
Wie bereits im Paragraphen &#8220;Was ist das Zend Framework&#8221; beschrieben. Um das ZF zu nutzen müssen bestehende Anwendungen nicht neu geschrieben werden, sondern es können bestimmte Funktionalitäten ohne großen Aufwand genutzt werden.<br />
Zahlreiche Standardaufgaben wie Formularerstellung und -validierung, E-Mailversandt oder Templates werden durch die Komponenten abgedeckt.<br />
Durch  durchgehend benutzte Design Patterns (&#8220;Entwicklungsmuster&#8221;) und Adapter (ein Art abkopelbarer Zwischenschritt) können sehr schnell durch wenige Zeilen Code große Teile der Anwendung umgeschrieben werden.  So ist es z.B. innerhalb weniger Sekunden möglich die Anwendung so umzuschreiben, dass diese zukünftig in einer ini-/ xml-Datei oder SQLite-DB statt in einer Oracle-/ MySQL-Datenbank Fehlermeldungen protokolliert.</li>
</ul>
<ul>
<li>Community<br />
Das ZF hat eine sehr große Community die von Zend selbst wiederum stark gefördert wird (siehe <a href="http://framework.zend.com/wiki/display/ZFDEV/Home">Zend Framework Wiki</a>). Es existieren zahlreiche, natürlich auch deutschsprachige, Foren, Blogs und Tutorials die sich mit dem ZF beschäftigen.</li>
</ul>
<ul>
<li>Dokumentation<br />
Das ZF ist vorbildhaft dokumentiert. Die Dokumentation wird von Zend selbst immer auf den neusten Stand gehalten, ist in zahlreichen Sprachen verfügbar und verfügt über zahlreiche Beispiele und Tutorials.</li>
</ul>
<ul>
<li>Web 2.0<br />
Es stehen zahlreiche Klassen bereit, mit welchen man die Services von Google, Delicous, YouTube, Flickr, Yahoo, Amazon etc. ohne hohe Einarbeitungszeit nutzen kann.</li>
</ul>
<ul>
<li>Ajax<br />
Das <a href="http://www.dojotoolkit.org/">Dojo Toolkit</a> ist in das ZF integriert. Hierdurch können sehr schnell Ajax-Applikationen erstellt werden.<br />
Auch hier gilt wieder &#8211; Dojo kann verwendet werden, muss aber nicht. Sind sie bereits ein anderes Framework gewohnt, können Sie dieses ebenfalls mit dem ZF nutzen.</li>
</ul>
<ul>
<li>Weiterentwicklung<br />
Da hinter dem ZF die Zend Technologies steht, ist eine in Zukunft Weiterentwicklung gesichert &#8211; ein großer Pluspunkt im Vergleich zu anderen Frameworks.</li>
</ul>
<ul>
<li>Lizenzierung/Kosten<br />
Das ZF steht unter der <a href="http://de.wikipedia.org/wiki/BSD-Lizenz">BSD-Lizenz.</a> Kosten entstehen also nicht.</li>
</ul>
<ul>
<li>Testbasis<br />
Alle Komponenten werden über Unit-Tests getestet. Auch ist es so dem Entwickler möglich, mit relativ wenig Aufwand Tests für seine Applikation zu schreiben.</li>
</ul>
<h3>Warum Zend-Software</h3>
<p>In der Einleitung war schon abzulesen, dass hier fast nur Software von Zend verwendet wird. Hintergrund für diese Wahl ist, dass ich persönlich von den Zend-Produkten überzeugt bin: sie zeichnen sich aus durch eine komfortable, leicht zu erlernende Bedienung und zahlreiche kleine Tools welche die tägliche Arbeit stark erleichtern.</p>
<p><strong>Vorteile</strong></p>
<p>So ist es z.B. beim Zend Server möglich über eine Web-GUI schnell die Konfiguration zu ändern (z.B. bestimmte PHP-Extensions oder Error-Logging zu (de)aktivieren) und weil alles &#8220;aus einer Hand&#8221; kommt wird beim ersten Start von Zend Studio (nur eines von zahlreichen weiteren Beispielen) automatisch der Zend Server gefunden und das Debugging konfiguriert. Natürlich stell Zend Studio auch zahlreiche Tools bereit welche das Arbeiten mit dem ZF noch mehr beschleunigen. Mit Zend Tools ist übrigens ein Server-debugging möglich, das heißt der Code kann auf dem Server selbst, unabhängig vom Code in der Entwicklungsumgebung inspiziert werden.<br />
Zend Studio setzt auf Eclipse auf &#8211; es können also die Plugins welche man bereits in Eclipse verwendet hat bzw. kennt, auch in Zend Studio verwenden.</p>
<p><strong>Nachteile</strong></p>
<p>Nach viel Lob und Tadel sollen natürlich auch die negativen Aspekte beleuchtet werden: Zend Studio (Eclipse)  benötigt relativ viel Arbeitsspeicher. Sind mehrere große Projekte parallel geöffnet kann dies den Rechner schon stark belasten (insbesondere wenn Tools wie der HTML-Validator aktiv sind).<br />
Zahlreiche Kinderkrankheiten wurden in Verison 7.1 behoben, welches ein Update auf diese Version obligatorisch ist.<br />
Eine offizielle 64-Bit Version für Linux ist noch nicht verfügbar &#8211; zwar kann man die 32-Bit Version installieren, dies läuft aber instabil.<br />
Die Entwicklungsumgebung mag hin und wieder ein wenig oversized wirken: man kann wirklich alles damit machen. Über SSH auf einen Server zugreifen und direkt Remote Dateien editieren oder direkt Datenbanken entwickeln &#8211; dies ist aber manchmal einfach zuviel des guten wenn man nur &#8220;ein paar Zeilen Code&#8221; schreiben will.<br />
Auch arbeiten manche Funktionen, z.B. die Codevervollständigung in Javascript, nicht fehlerfrei; andere Funktionen welche z.B. den Code auf (logische) Korrektheit prüfen arbeiten suboptimal, sodass nach einem Import eines Projektes mehrere 1000 angbliche Fehler gelistet werden &#8211; dabei steht aber z.B. der schließende Tag in einer includeten-Datei, was Zend natürlich nicht weiß.</p>
<p><strong>Kosten</strong></p>
<p>Der Zend Server ist in der sog. Community Edition (eingeschränkter Fuktionsumfang) kostenlos erhältich. Für die Entwicklung reichen die Funktionen jedoch voll und ganz aus. Zend Studio kostet mit einem 1-Jahres-Abo für Updates und Support 399€, dies ist jedoch verglichen mit Funktionsumfang ok. Eine Testversion für 30 Tage ist verfügbar.</p>
<h3>Ausblick</h3>
<p>Im nächsten Beitrag werden wir den Zend Server CE herunterladen und installieren. Es wird ein kurzer Überblick über die Funktionen gegeben. Anschließend werden wir noch zwei Virtual Hosts einrichten (live, development) über welche unsere zukünftige Anwendung dann erreichbar sein wird.</p>
<p><strong>Wichtige Links</strong></p>
<ul>
<li><a href="http://www.ralfeggert.de/">http://www.zend.com/de/</a> &#8211; Zend Technologies, Download von Zend Studio und Zend Server CE.</li>
<li><a href="http://framework.zend.com ">http://framework.zend.com </a>- Zend Framework, die offizielle Seite von ZF. Mit Links zur Dokumentation, Tutorials und dem ZF Wiki.</li>
<li><a href="http://www.dojotoolkit.org/">http://www.dojotoolkit.org/</a> &#8211; Dojo Toolkit, das in ZF integrierte Ajax-Toolkit</li>
<li><a href="http://www.zfforums.com/">http://www.zfforums.com/</a> &#8211; ZF Forum, englischsprachiges ZF Forum.</li>
<li><a href="http://www.ralfeggert.de/">http://www.ralfeggert.de/</a> &#8211; Blog von Ralf Eggert, blogt über das ZF und PHP allgemein.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/03/entwickeln-mit-zend-teil-1-einfuhrung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Zend Framework und die eBay trading API – Teil 4</title>
		<link>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/</link>
		<comments>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 16:09:35 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Guides]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=370</guid>
		<description><![CDATA[Wir werden einen Prozess schaffen, der es dem Nutzer erlaubt den eBay User Consent Flow mit Hilfe unserer Webapplikation zu durchschreiten. Dieser Prozess soll möglichst unkompliziert, direkt und intuitiv bedienbar sein. Ich empfehle also die Verwendung von Ajax-Methoden um das User Interface und den darzustellenden Prozess zu visualisieren. Wie das Zend Framework mit Ajax Anfragen umgehen kann wird hier also auch Thema sein.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/" title="Das Zend Framework und die eBay trading API – Teil 4"></a><p>Die ersten drei Teile dieser Reihe hatten sich mit der theoretischen und praktischen Implementierung des User Consent Flow Prozesses, der für die Authentifizierung des Nutzers mit und der Verwendung der eBay Trading API notwendig ist, befasst. Im vierten und letzten Teil sollen die Implementierungen der letzten drei Teile (<a title="Zum ersten Teil dieses Guides" href="http://blog.root-of-all-evil.com/?p=131" target="_self">Teil 1</a>, <a title="Teil zwei dieser Reihe" href="http://blog.root-of-all-evil.com/?p=161" target="_self">Teil 2</a>, <a title="Der dritte Teil dieser Reihe" href="http://blog.root-of-all-evil.com/?p=205" target="_self">Teil 3</a>) dieser Reihe in die Controller und Views umgesetzt und so ein visueller Anmelde- und Authentifizierungsprozess geschaffen werden.</p>
<h3>Was wird Teil 4 dieses Guides zeigen?</h3>
<p>Wir werden einen Prozess schaffen, der es dem Nutzer erlaubt den eBay User Consent Flow mit Hilfe unserer Webapplikation zu durchschreiten. Dieser Prozess soll möglichst unkompliziert, direkt und intuitiv bedienbar sein. Ich empfehle also die Verwendung von Ajax-Methoden um das User Interface und den darzustellenden Prozess zu visualisieren. Wie das Zend Framework mit Ajax Anfragen umgehen kann wird hier also auch Thema sein.<span id="more-370"></span></p>
<h3>Warum Ajax?</h3>
<p>Wenn wir uns eben an den Ablauf des (<a title="Teil 1" href="http://blog.root-of-all-evil.com/?p=131" target="_blank">in Teil 1 ausführlich beschriebenen</a>) Consent Flow Prozesses erinnern: Der Benutzer muss selbst nur wenige Klicks und Eingaben machen &#8211; namentlich die Anmeldung auf der eBay Login-Seite zu der er weitergeleitet wird. Im Hintergrund muss unsere Applikation allerdings zwei Anfragen machen. (1) Eine SessionID von der eBay trading API anfragen und (2) nach der Rückkehr des Benutzers<a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" rel="lightbox[370]"><img class="alignright size-thumbnail wp-image-139" title="eBayUserConsentFlow" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow-150x150.jpg" alt="Der eBay User Consent Flow" width="150" height="150" /></a> zur Applikation den mit der SessionID verknüpften Auth-Token anfragen.</p>
<p>Hier empfehle ich Ajax: Dem Benutzer soll visualisiert werden, dass sich hinter den Kulissen etwas tut und nicht lange auf den Seitenaufbau warten müssen (die API-Anfragen dauern ein paar wenige Sekunden). Wir werden also die Seite ausliefern, und von dieser eine Ajax-Anfrage starten, die die getSessionID und später die fetchToken Actionen anstoßen wird. Der Benutzer wird ein Lade-Grafik sehen und damit merken, dass sich etwas tut. Die Weiterleitung soll vollautomatisch erfolgen. Das Ergebnis sieht also keinerlei Actionen vom Benutzer auf unserer Applikation vor. Er muss lediglich warten bis er zu eBay weiter geleitet wird und sich dort anmelden kann.</p>
<p><img class="aligncenter size-full wp-image-374" title="consentFlowGUI" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/02/consentFlowGUI.jpg" alt="" width="500" height="220" /></p>
<h3>Die benötigten Actions</h3>
<p>Wie in Teil 2 bereits aufgestellt brauchen wir neben dem Ebayauth Controller folgende fünf Actions:</p>
<ul>
<li><em>index</em> (stößt den Consent Flow an)<em><br />
</em></li>
<li><em>step1</em> (ist Ziel eines Ajax-Requests &#8211; übernimmt getSessionID)</li>
<li><em>success </em>(bei erfolgreichem Login auf eBay wird der Benutzer hierhin  weitergeleitet)</li>
<li><em>step2 </em>(ist Ziel eines Ajax-Requests &#8211; übernimmt fetchToken)</li>
<li>und <em>denied</em> (bei fehlgeschlagenem oder abgebrochenen Login)<em><br />
</em></li>
</ul>
<p>und vier Views für den Controller <em>Ebayauth</em>:</p>
<ul>
<li><em>index.phtml</em></li>
<li><em>step1.ajax.phtml</em></li>
<li><em>success.phtml<br />
</em></li>
<li><em>step2.ajax.phtml</em></li>
<li>und <em>denied.phtml</em></li>
</ul>
<h3>Ajax Requests erkennen und entsprechend handeln</h3>
<p>Um die Unterscheidung zwischen &#8216;normalem&#8217; Request und einem Ajax-Request können wir einen Context-Switcher verwenden, den uns das Zend Framework zur Verfügung stellt. Dieser muss in der init()-Methode des Controllers initialisiert werden uns sieht in unserem Fall so aus:</p>
<pre class="php" title="code">$contextSwitch = $this-&gt;_helper-&gt;getHelper('AjaxContext');
$contextSwitch-&gt;addActionContext('step1', 'html') // wir geben html zurück
              -&gt;addActionContext('step2', 'html') // möglich wäre auch xml oder json
              -&gt;initContext();

// Das übrige Layout abschalten
if($this-&gt;_request-&gt;isXmlHttpRequest()) {
     $this-&gt;_helper-&gt;layout-&gt;disableLayout();
}</pre>
<p>Unsere zwei step Actions benötigen noch eine kleine Fallunterscheidung. Wir möchten sie nur ausführen lassen, wenn es sich tatsächlich um einen Ajax-Request handelt:</p>
<pre class="php" title="code">if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
    $this-&gt;_redirect('/ebayauth/index'); // zum Start des Auth-Prozesses umleiten
}</pre>
<h3>Der Controller Ebayauth</h3>
<p>Springen wir gleich in den Code:</p>
<pre class="php" title="code">public function indexAction() {}

public function step1Action()
{
    if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
        $this-&gt;_redirect('/ebayauth/index');
    }

    // die getSessionID API-Anfrage durchführen
    $tokenAdapter = new Ebay_Auth_ConsentFlow();
    $return = $tokenAdapter-&gt;getSessionID();

    // Wir müssen die SessionID in einer Datenbank oä. zwischenspeichern
    $modelAccount = new Model_Account();

    if($return != false) {
        // zwischenspeichern - bitte durch eigenen Implementierung ersetzen
        $modelAccount-&gt;writeEbaySessionId($this-&gt;accountID, $return['sessionId']);
        if(isset($return-&gt;ShortMessage)) {
            // bei Fehler ist ShortMessage teil der API Rückgabe
            $this-&gt;view-&gt;error = (string)$return-&gt;ShortMessage;
        } else {
            $this-&gt;view-&gt;redirectURL = $return['redirectUrl'];
        }
    } else {
        $this-&gt;view-&gt;error = 'Keine Verbindung zu eBay.';
    }
}

public function successAction() {}

public function step2Action()
{
    if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
        $this-&gt;_redirect('/ebayauth/index');
    }

    // die im step1 zwischengespeicherte SessionID aus der Datenbank holen
    $modelAccount = new Model_Account();
    $sessionId = $modelAccount-&gt;getEbaySessionId($this-&gt;accountID);

    // die fetchToken API Anfrage ausführen
    $tokenAdapter = new Ebay_Auth_ConsentFlow();
    $return = $tokenAdapter-&gt;getToken($sessionId);

    if($return != false) {
        // auch hier wieder eigenen Implementierung Verwenden
        $modelAccount-&gt;writeEbayTokenId($this-&gt;accountID, $return['token'], $return['expiration']);
        if(isset($return-&gt;ShortMessage)) {
            $this-&gt;view-&gt;error = (string)$return-&gt;ShortMessage;
        } else {
            // Hier festlegen wohin umgeleitet werden soll
            $this-&gt;view-&gt;redirectURL = '/'; // zurück zur Startseiten
            $this-&gt;view-&gt;expiration = $return['expiration'];
        }
    } else {
        $this-&gt;view-&gt;error = 'Keine Verbindung zu eBay';
    }
}

public function deniedAction() {}</pre>
<p>Die drei Actions index, success und denied benötigen keine Methoden im Controller. Der JavaScript, der den Ajax-Request anstößt coden wir einfach fest in die views ein.</p>
<h3>Die Views</h3>
<p>Das hier ist der index view (<em>index.phtml</em>). Wir binden ein JavaScript ein und rufen die Funktion <em>shootAjaxHtml()</em> auf.</p>
<pre class="php" title="code">&lt;div&gt;
    &lt;div id="loader" class="redirect"&gt;&lt;img src="/images/preloader.gif" /&gt; Weiterleitung an eBay wird vorbereitet ...
        &lt;script type="text/javascript"&gt;shootAjaxHtml('/ebay/step1', 'loader')&lt;/script&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Der <em>step1.ajax.phtml</em> View:</p>
<pre class="php" title="code">&lt;?php if(isset($this-&gt;redirectURL)) { ?&gt;
&lt;p&gt;Automatische Weiterleitung zu eBay in wenigen Sekunden. &lt;a href="&lt;?php echo($this-&gt;redirectURL); ?&gt;" title="Weiterleitung"&gt;Oder hier klicken.&lt;/a&gt;&lt;/p&gt;
&lt;script type="text/javascript"&gt;window.location = '&lt;?php echo($this-&gt;redirectURL); ?&gt;';&lt;/script&gt;
&lt;?php } elseif(isset($this-&gt;error)) { ?&gt;
&lt;p class="error"&gt;&lt;strong&gt;Fehler:&lt;/strong&gt; &lt;?php echo $this-&gt;error; ?&gt;&lt;/p&gt;
&lt;?php } ?&gt;</pre>
<p><em>success.phtml</em>:</p>
<pre class="php" title="code">&lt;div&gt;
    &lt;div id="loader" class="redirect"&gt;&lt;img src="&lt;?php echo SKINPATH; ?&gt;/images/preloader.gif" /&gt; eBay Anmeldung wird abgeschlossen ...
        &lt;script type="text/javascript"&gt;shootAjaxHtml('/ebay/authgettoken', 'loader')&lt;/script&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Und <em>step2.ajax.phtml</em>:</p>
<pre class="php" title="code">&lt;?php if(isset($this-&gt;redirectURL)) { ?&gt;
&lt;p class="info"&gt;Die Verknüpfung des Benutzerkontos mit eBay verliert am &lt;?php echo date('d.m.Y', strtotime($this-&gt;expiration)); ?&gt; um &lt;?php echo date('H:m', strtotime($this-&gt;expiration)); ?&gt; Uhr seine Gültigkeit.&lt;/p&gt;
&lt;p&gt;&lt;a href="/ebay" class="black" title="Zurück zur Startseite"&gt;Weiter&lt;/a&gt;&lt;/p&gt;
&lt;?php } elseif(isset($this-&gt;error)) { ?&gt;
&lt;p class="error"&gt;&lt;strong&gt;Fehler:&lt;/strong&gt; &lt;?php echo $this-&gt;error; ?&gt;&lt;/p&gt;
&lt;?php } ?&gt;</pre>
<p>Im denied View gebe ich nur eine Fehlermeldung wie &#8220;Anmeldung fehlgeschlagen&#8221;.</p>
<h3>Der JavaScript (mit mootools):</h3>
<pre class="javascript" title="code">function shootAjaxHtml(action, loaderid)
{
    var remote = new Request.HTML({
        url: action + "?format=html",
        onSuccess: function(html) {
            $(loaderid).getParent('div').empty().adopt(html);
        },
        onFailure: function(xhr) {
            $(loaderid).getParent('div').empty().adopt(new Element('p').set('text', 'Es ist ein Fehler aufgetreten: ' +xhr.status +' ' +xhr.statusText).addClass('error'));
        }}).get();
}</pre>
<p>Und damit sind wir auch schon fertig.</p>
<p>Ich hoffe die ersten drei Teile dieser Einführung in eine Mögliche Implementierung des Consent Flows der eBay trading API in eine Webapplikation mit dem Zend Framework waren gut verständlich und konnten einen guten Überblick über die benötigten Implementierungsschritte geben. Teil vier hat anhand von Codebeispielen gezeigt, wie man den Consent Flow möglichst benutzerfreundlich umsetzen kann.</p>
<p>Empfehlungen, Anmerkungen, Verbesserungsvorschläge? Dazu sind die Kommentare da!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Zend Framework und die eBay trading API – Teil 3</title>
		<link>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/</link>
		<comments>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 20:40:45 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=205</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/" title="Das Zend Framework und die eBay trading API – Teil 3"></a>In den beiden ersten Teilen dieses Guides habe ich einen Überblick über die Funktionsweise und den Aufbau des user Consent Flow von eBay Applikationen in Verbindung mit der eBay trading API geschaffen (zum ersten Teil dieses Guides) und den Aufbau &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/" title="Das Zend Framework und die eBay trading API – Teil 3"></a><p>In den beiden ersten Teilen dieses Guides habe ich einen Überblick über die Funktionsweise und den Aufbau des user Consent Flow von eBay Applikationen in Verbindung mit der eBay trading API geschaffen (<a title="Zum zweiten Teil dieses Guides" href="../?p=131" target="_self">zum ersten Teil dieses Guides</a>) und den Aufbau unseres Ebay API Adapters und die Implementierung mit Hilfe des Zend Frameworks erläutert (<a title="Zum ersten Teil dieses Guides" href="../?p=161" target="_self">zum zweiten Teil dieses Guides</a>).</p>
<h3>Was werde ich hier in Teil 3 beschreiben?</h3>
<p>Dieser Teil beschäftigt sich mit der Implementierung des Auth bzw. des Consent Flow Prozesses der eBay trading API. Wir werden uns einen Überblick über die benötigten Klassen und Methoden schaffen und diese dann mit Hilfe des Zend Frameworks in unser bereits vorhandenes Projekt implementieren. Unsere Aufmerksamkeit widmen wir der <em>Ebay_Auth_ConsentFlow</em> Klasse und deren Methoden <em>GetSessionID()</em> und <em>fetchToken()</em>. Außerdem werden wir anhand dieser zwei API-Anfragen die API-Rückgabe untersuchen.<span id="more-205"></span></p>
<h3>Die Klasse Ebay_Auth_ConsentFlow<a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" rel="lightbox[205]"><img class="alignright size-thumbnail wp-image-139" title="eBayUserConsentFlow" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow-150x150.jpg" alt="Der eBay User Consent Flow" width="150" height="150" /></a></h3>
<p>Wir benötigen die Klasse Ebay_Auth_ConsentFlow um das Ziel, einen validen AuthToken von der eBay trading API zu erhalten. Wie in <a title="Zu Teil 1 dieses Guides" href="http://blog.root-of-all-evil.com/?p=131" target="_blank">Teil 1 dieses Guides</a> beschrieben läuft der eBay User Consent Flow in drei Schritten ab: (1) Session ID anfragen, (2) User zum eBay Anmeldeformular weiterleiten und (3) AuthToken anfragen. Erst mit dem AuthToken können wir im Namen des Nutzers Aktionen mit der eBay trading API durchführen.</p>
<p>Auf Schritt 2 haben wir mit unserer Implementierung keinen Einfluss. Viel mehr müssen wir uns um die beiden API-Anfragen <em>GetSessionID</em> (1) und <em>ConsentFlow</em> (2) kümmern. Die <em>GetSessionID </em>Anfrage implementieren wir in gleichnamiger Methode unserer <em>Ebay_Auth_ConsentFlow</em> Klasse. Die <em>FetchToken </em>Anfrage werden wir analog in der Methode <em>fetchToken()</em> unterbringen. Hier noch einmal der Ablauf:</p>
<ol>
<li><strong>Ebay_Auth_ConsentFlow-&gt;getSessionID() aufrufen</strong><br />
und bei der trading API eine sessionID anfragen</li>
<li><strong>Ebay_Auth_ConsentFlow-&gt;fetchToken($sessionID)  aufrufen</strong><br />
und &#8211; vorausgesetzt der Benutzer hat sich erfolgreich auf eBay eingelogged &#8211; den zur sessionID gehörigen AuthToken erhalten</li>
</ol>
<p>Zur Erinnerung:</p>
<ul>
<li>Die <em>getSessionID </em>Methode wird direkt vom Controller aufgerufen und muss im Erfolgsfall die eBay Signin URL &#8211; an die der Benutzer weiter geleitet werden soll &#8211; zurück geben.</li>
<li>Die <em>callApi </em>Methode erwartet die folgenden Parameter:
<pre>callApi($verb, $request, $aditionalXml = true, $requestCredentials = true, $serverUrl = null)
</pre>
<p>Die GetSessionID Anfrage benötigt keine zusätzlichen XML Paramter und auch keine requestCredentials.</li>
<li>Die <em>callApi </em>Methode gibt ein zweielementiges Array zurück. Einen Statusflag (&#8216;<em>Success</em>&#8216;) und die Originalantwort (&#8216;<em>Response</em>&#8216;) der eBay API.</li>
</ul>
<h3>Die Implementierung der getSessionID Methode</h3>
<p>Werfen wir nun einen Blick auf die <em>getSessionID()</em> Methode:</p>
<pre class="php">class Ebay_Auth_ConsentFlow extends Ebay_Abstract
{
    public function getSessionID()
    {
        $callVerb = 'GetSessionID';
        $xmlBody  = '&lt;RuName&gt;' . $this-&gt;_apiAdapter-&gt;_ruName . '&lt;/RuName&gt;';
        $response = $this-&gt;_apiAdapter-&gt;callApi($callVerb, $xmlBody, false, false);

        if($response['Success'] == false) {
            $return = $response['Response']-&gt;shortMessage;
        } else {
            $return = array(
                'redirectUrl' =&gt; $this-&gt;_apiAdapter-&gt;_signinUrl .
                                 '&amp;RuName=' . $this-&gt;_apiAdapter-&gt;_ruName .
                                 '&amp;SessID=' . $response['Response']-&gt;SessionID,
                'sessionId'   =&gt; $response['Response']-&gt;SessionID
            );
            return $return;
        }
    }
}</pre>
<p>Der Vollständigkeit halber und um die Referenz auf $this-&gt;_apiAdapter in Zeile 6 erklären zu können hier noch die rudimentäre <em>Ebay_Abstract</em> Klasse. <em>Ebay_Auth_ConsentFlow</em> und alle anderen Ebay API Request Klassen erben den folgende Konstruktor:</p>
<pre class="php">class Ebay_Abstract
{
    protected $_apiAdapter;

    public function __construct()
    {
        if(!isset($this-&gt;_apiAdapter)) {
            $this-&gt;_apiAdapter = Ebay_Api_Adapter::getInstance();
        }
    }
}</pre>
<p>Wie zu sehen ist, ist der eigentliche Aufbau des API-Request denkbar einfach.  Wir erstellen den XML-String und setzen mit <em>$callVerb</em> (Zeile 5) den korrekten Anfragen-Namen. Alles weitere macht unsere <em>CallApi </em>Methode der Klasse <em>Ebay_Api_Adapter</em>. Die getSessionID Anfrage benötigt als einzigen Paramter den ruNamen der Applikation um das mit der SessionID verknüpfte eBay Login-Formular mit dem Logo und der Beschreibung unserer Applikation zu versehen.</p>
<p>Als Rückgabe an den Controller sollte uns die <em>getSessionID()</em> Methode eine Sandbox Signin-URL der Form <em>https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?SignIn&amp;RuName=ruNameDerApplikation&amp;SessID=dieAngefragteSessionID</em> zurückgeben.</p>
<p>Wie der Controller und die Views aussehen erkläre ich später in Teil 4 dieses Guides. Nur so viel vorweg: Ich muss zwangsläufig die SessionID mit dem Benutzer Account verknüpfen, damit später sichergestellt werden kann, dass die korrekte SessionID des Benutzers der Methode <em>fetchToken() </em>übergeben wird. Der Benutzer verlässt unsere Seite zwangsläufig für den Login-Prozess für einen kurzen Augenblick. Wir möchten ihn auch nicht aus den Augen verlieren und seine SessionID wieder vergessen.</p>
<h3>Die Implementierung der fetchToken Methode</h3>
<p>Steigen wir direkt ein &#8211; viel Neues gibt es hier nicht:</p>
<pre class="php">public function fetchToken($sessionID)
{
    $callVerb  = 'FetchToken';
    $xmlBody   =
        '&lt;SessionID&gt;' . $sessionID . '&lt;/SessionID&gt;';
    $response  = $this-&gt;_apiAdapter-&gt;callApi($callVerb, $xmlBody, false, false);

    if($response['Success'] == false) {
        return $response['Response']-&gt;ShortMessage;
    } else {
        return array(
            'token' =&gt; $response['Response']-&gt;eBayAuthToken,
            'expiration' =&gt; date('Y-m-d H:i:s', strtotime($response['Response']-&gt;HardExpirationTime))
        );
    }
}</pre>
<p>Auch die fetchToken() Methode rufen wir direkt aus dem Controller auf. Wir übergeben die SessionID und erhalten im Idealfall ein zweielementiges Array mit Token und Gültigkeitsdauer des Tokens zurück.</p>
<h3>Die Rückgabe der eBay trading API</h3>
<p>Anhand dieser zwei API-Anfragen möchte ich hier die beiden XML API-Rückgaben vorstellen:</p>
<h4>GetSessionID-Anfrage:</h4>
<pre>RuName =
'ruNameUnsererApplikation'</pre>
<p>Der einzige hier zu übergebende Parameter ist der ruName unserer Applikation.</p>
<h4>GetSessionID-Antwort:</h4>
<pre>Timestamp =
'2010-01-26T20:35:46.118Z'
Ack =
'Success'
Version =
637
Build =
'E637_INTL_BUNDLED_10223050_R1'
SessionID =
'b0**...*f74'</pre>
<p>Als Antwort erhalten wir die SessionID.</p>
<h4>FetchToken-Anfrage:</h4>
<pre>SessionID =
'b0**...*f74'</pre>
<p>Auch hier muss nur ein Paramter &#8211; die SessionID &#8211; übergeben werden.</p>
<h4>FetchToken-Antwort:</h4>
<pre>Timestamp =
'2010-01-26T20:31:58.283Z'
Ack =
'Success'
Version =
637
Build =
'E637_INTL_BUNDLED_10223050_R1'
eBayAuthToken =
'AuthToken'
HardExpirationTime =
'2011-07-20T20:27:32.000Z'
</pre>
<p>Die Antwort enthält den AuthToken und seine Gültigkeitsdauer.</p>
<p>Unsere Api_Adapter und User Consent Flow Implementierung ist damit fast fertig. Wie Controller und Views &#8211; und damit unser Frontend &#8211; implementiert werden, das soll Thema von <a title="Zu Teil Vier springen" href="http://blog.root-of-all-evil.com/?p=370" target="_self">Teil 4 dieses Guides</a> sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Zend Framework und die eBay trading API &#8211; Teil 2</title>
		<link>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/</link>
		<comments>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 22:09:47 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=161</guid>
		<description><![CDATA[Dieser Teil widmet sich dem Aufbau und Implementierung der Ebay_Api_Adapter Klasse, die wir verwenden werden um Anfragen an die eBay trading API zu senden. Wir benötigen Methoden zur Generierung und Auslieferung der Anfragen und eine geeignete Fehlerbehandlung. Exemplarisch und anhand von Code-Beispielen soll das hier in Teil 2 gezeigt werden.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/" title="Das Zend Framework und die eBay trading API - Teil 2"></a><p><a title="Zum ersten Teil" href="http://blog.root-of-all-evil.com/?p=131" target="_blank">Im ersten Teil dieses Guides</a> hatten wir uns einen Überblick über den Consent Flow und eBay Authentifizierung unserer Nutzer geschaffen und so die Voraussetzung zur praktischen Umsetzung mit dem Zend Framework geschaffen.</p>
<h3>Was werde ich hier in Teil 2 beschreiben?</h3>
<p>Dieser Teil widmet sich dem Aufbau und Implementierung der Ebay_Api_Adapter Klasse, die wir verwenden werden um Anfragen an die eBay trading API zu senden. Wir benötigen Methoden zur Generierung und Auslieferung der Anfragen und eine geeignete Fehlerbehandlung. Exemplarisch und anhand von Code-Beispielen soll das hier in Teil 2 gezeigt werden.</p>
<p><span id="more-161"></span></p>
<p>Unsere Webapplikation muss nicht nur Anfragen an die eBay API senden, sondern auch den Überblick über SessionIDs und Tokens seiner Benutzer behalten. Wir sind also gezwungen diese &#8211; in unserem Fall in einer Datenbank &#8211; zwischen zu speichern:</p>
<p style="text-align: center;"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow_app1.jpg" rel="lightbox[161]"><img class="aligncenter" title="ebayCohttp://blog.root-of-all-evil.com/wp-admin/post.php?action=edit&amp;post=161nsentFlow_app" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow_app1.jpg" alt="" width="400" height="341" /></a></p>
<p>Das bedeutet sogleich, dass unsere Applikation auch ein User-System haben muss, so dass die zurückgegebenen SessionIDs und Tokens mit den korrekten Benutzern verknüpft werden können. Ich möchte dies hier nicht noch ausführlich herleiten, sondern setze dieses Feature in der Basis-Applikation voraus. Ich nutze dafür <a title="Eine Einführung in Zend_Acl" href="http://framework.zend.com/manual/de/zend.acl.introduction.html" target="_blank">Zend_Acl</a> und ein klassisches User-System mit Register-, Login- und Logout Funktionen. Um voraus zu planen und es eventuell später mehren Nutzern gleichzeitig zu ermöglichen mit einem eBay Account zu arbeiten wird es in meiner <em>Users </em>Tabelle eine <em>account_id</em> und eine n:1 Verknüpfung mit der <em>id </em>des eBay Accounts in der Tabelle <em>Accounts geben</em>. Der Controller <em>User </em>und die dazugehörigen Funktionen existieren also schon.</p>
<h3>Die benötigten Controller und Klassen</h3>
<p>Für unsere eBay Applikation brauchen wir einen neuen Controller (Ebayauth) und eine neue Library (Ebay) in der wir unsere eBay spezifischen Klassen unterbringen. Wir benötigen:</p>
<ul>
<li>Einen Controller <em>Ebayauth</em></li>
<li>Fünf Actions (<em>index</em>, <em>step1</em>, <em>step2</em>, <em>success </em>und <em>denied</em>) und fünf Views für den Controller <em>Ebayauth</em>:<em> index.phtml</em>, <em>step1.ajax.phtml</em>, <em>step2.ajax.phtml</em>, <em>success.phtml</em> und <em>denied.phtml</em></li>
<li>Eine neue Library mit Namespace <em>Ebay_ </em>(nicht vergessen einen Autoloader im bootstrap anzupassen)</li>
<li>Zwei <em>Ebay_</em> Klassen: <em>Ebay_Api_Adapter</em> und <em>Ebay_Auth_ConsentFlow</em></li>
<li>Eine <em>keys.xml</em> in der Library Ebay</li>
</ul>
<h3>Die Klasse Ebay_Api_Adapter</h3>
<p>Die keys.xml erlaubt es uns unsere API-Keys in einer schönen, ausgelagerten XML zu verwalten anstatt sie hardcoded in der Klasse zu lagern. Werfen wir zunächst einen Blick auf den Constructor, die setOptions Methode und die keys.xml:</p>
<pre name="code" class="php">class Ebay_Api_Adapter
{
    public function __construct($configfile = 'keys.xml')
    {
        $configfile = '../library/Ebay/' . $configfile;
        $configXml = new Zend_Config_Xml($configfile);
        $this-&gt;setOptions($configXml-&gt;keys-&gt;toArray());
        $this-&gt;setOptions($configXml-&gt;options-&gt;toArray());
    }

    // statische Instanz-Rückgabe
    public static function getInstance()
    {
        if (self::$_instance === null) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    private function setOptions($options = array())
    {
        if(is_array($options)) {
            foreach($options as $key =&gt; $value) {
                $key = '_' . $key;
                $this-&gt;$key = $value;
            }
        }
    }
}</pre>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;ebay&gt;
&lt;keys&gt;
    &lt;devId&gt;hier-eintragen&lt;/devId&gt;
    &lt;appId&gt;hier-eintragen&lt;/appId&gt;
    &lt;certId&gt;hier-eintragen&lt;/certId&gt;
    &lt;ruName&gt;hier-eintragen&lt;/ruName&gt;
&lt;/keys&gt;
&lt;options&gt;
    &lt;siteId&gt;77&lt;/siteId&gt;
    &lt;warningLevel&gt;High&lt;/warningLevel&gt;
    &lt;compatLevel&gt;647&lt;/compatLevel&gt;
    &lt;errorLanguage&gt;77&lt;/errorLanguage&gt;
    &lt;serverUrl&gt;&lt;![CDATA[https://api.sandbox.ebay.com/ws/api.dll]]&gt;&lt;/serverUrl&gt;
    &lt;signinUrl&gt;&lt;![CDATA[https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?SignIn]]&gt;&lt;/signinUrl&gt;
&lt;/options&gt;&lt;/ebay&gt;
</pre>
<p>Zu den Optionen in der keys.xml möchte ich noch ein paar Worte loswerden:</p>
<ul>
<li>siteID 77 entspricht eBay.de und errorLanguage 77 entspricht Deutsch</li>
<li>warningLevel ist während wir mit der Sandbox arbeiten auf High gesetzt.</li>
<li>compatLevel 647 ist die aktuelle eBay trading API Version mit der wir arbeiten möchten.</li>
<li>serverURL ist unser Ansprechpartner für sämtliche API-Requests.</li>
<li>signinURL verwenden wir für die Weiterleitung des Benutzers zum Consent Flow.</li>
</ul>
<p>Für den HTTP-Request (POST) an die eBay trading API nutzen wir Zend_Http_Client. Die API möchte von uns eine Reihe HTTP-Header gesetzt sehen, bevor sie antworten wird. Dazu folgende Funktion:</p>
<pre name="code" class="php">private function setHeaders()
{
    $this-&gt;_headers = array (
        // Die eBay trading API Version, die wir unterstützen
        'X-EBAY-API-COMPATIBILITY-LEVEL: ' . $this-&gt;_compatLevel,

        // Unsere Keys und Zertifikate
        'X-EBAY-API-DEV-NAME: '    . $this-&gt;_devId,
        'X-EBAY-API-APP-NAME: '    . $this-&gt;_appId,
        'X-EBAY-API-CERT-NAME: '   . $this-&gt;_certId,

        // Der Name jeder eBay API Anfrage muss im Header noch einmal benannt werden
        'X-EBAY-API-CALL-NAME: '   . $this-&gt;_callVerb,
        'X-EBAY-API-SITEID: '      . $this-&gt;_siteId,

        // Wichtig: Den Content Type der Daten, die wir senden
        'Content-Type: text/xml; charset=utf-8'
    );
    $this-&gt;_request = new Zend_Http_Client();
    $this-&gt;_request-&gt;setUri($this-&gt;_serverUrl);
    $this-&gt;_request-&gt;setHeaders($this-&gt;_headers);
}</pre>
<p>Sind die Header gesetzt, so können wir mit dem Zend_Http_Client Object ($this-&gt;_request) eine Anfrage senden. Der eigentliche Inhalt der Anfrage wird mittels POST mitgesendet. Das eigentliche Herzstück unseres API Adapters ist die Methode callApi, die wie folgt Abläuft:</p>
<ol>
<li><strong>Die Header setzen</strong><br />
Wir übergeben der callApi Methode die Bezeichnung des Requests als Parameter und rufen damit die setHeaders() Methode auf. Diese baut die Header zusammen und erstellt ein neues Zend_Http_Client Objekt (siehe oben).</li>
<li><strong>Den Request Body zusammensetzen</strong><br />
Abhängig vom Typ der API Anfrage müssen wir den String des Request-Bodys (xml) zusammensetzen. Eine getSessionID verlangt andere (und weniger) Optionen als eine reguläre Anfrage.</li>
<li><strong>Den Http_Client mit dem Request Body versehen und absenden</strong><br />
Den zuvor in der setHeaders() Methode erstellten Http_Client übergeben wir den Request Body und senden den Request mittels POST an den API-Server. Die Rückgabe speichern wir in einer Variable.</li>
<li><strong>Die Rückgabe auswerten und Fehler abfangen</strong><br />
Die Rückgabe (xml) hat je nach API Anfrage eine bestimmte Form, die wir auswerten müssen. Hier muss auch unsere Fehlerbehandlung implementiert werden.</li>
</ol>
<p>Hier die Implementierung der callApi Methode der Klasse Ebay_Api_Adapter:</p>
<pre name="code" class="php">public function callApi($verb, $request, $aditionalXml = true, $requestCredentials = true, $serverUrl = null)
{

    if($serverUrl == null) {
        $serverUrl = $this-&gt;_serverUrl;
    }

    $this-&gt;_callVerb = $verb;

    $this-&gt;setHeaders();

    $requestBody =
        '&lt;?xml version="1.0" encoding="utf-8"?&gt;' .
        '&lt;' . $verb . ' xmlns="urn:ebay:apis:eBLBaseComponents"&gt;';

    // request Credentials werden nur bei regulären, nicht bei
    // getSessionID oder fetchToken Anfragen benötigt
    if($requestCredentials) {
        $requestBody .=
            '&lt;RequesterCredentials&gt;' .
            '&lt;eBayAuthToken&gt;&lt;![CDATA[' . $this-&gt;getToken() . ']]&gt;&lt;/eBayAuthToken&gt;' .
            '&lt;/RequesterCredentials&gt;';
    }

    // Auch diese Optionen benötigen wir nur für reguläre Anfragen
    if($aditionalXml) {
        $requestBody .=
            '&lt;ErrorLanguage&gt;' . $this-&gt;_errorLanguage . '&lt;/ErrorLanguage&gt;' .
            '&lt;WarningLevel&gt;'  . $this-&gt;_warningLevel  . '&lt;/WarningLevel&gt;';
    }

    $requestBody .=
        $request . '&lt;/' . $verb . '&gt;';

    $this-&gt;_request-&gt;setUri($serverUrl);
    $this-&gt;_request-&gt;setRawData($requestBody);
    $response = $this-&gt;_request-&gt;request('POST');

    $this-&gt;responseHeader   = $response-&gt;getHeaders();
    $this-&gt;responseBody     = $response-&gt;getBody();

    // die Rückgabe wandeln wir in ein (hoffentlich gültiges)
    // XML Element um
    $xml = @simplexml_load_string($this-&gt;responseBody);

    // Existiert in der Rückgabe kein ACK-Feld (zB. weil der ebay
    // Server nicht geantwortet hat) oder ist es nicht 'Success',
    // so ist etwas schief gelaufen
    if(!isset($xml-&gt;Ack) || $xml-&gt;Ack != 'Success') {
        $errors = 'Keine Antwort von eBay';
        if(isset($xml-&gt;Errors))
            $errors = $xml-&gt;Errors;
        return array('Success' =&gt; false, 'Response' =&gt; $errors);
    }

    return array('Success' =&gt; true, 'Response' =&gt; $xml);
}</pre>
<p>Die in Zeile 21 verwendete gettoken() Methode (siehe unten) gibt mir den mit dem User Account verknüpften Token zurück (Siehe Schaubild oben), ist aber optional und setzt ein User-Model voraus. Alternativ oder zu Testzwecken lässt sich der Token auch in der keys.xml hinterlegen und der Funktionsaufruf in Zeile 21 durch ein $this-&gt;_token() ersetzen.</p>
<pre name="code" class="php">public function getToken()
{
    $accountId        = Zend_Auth::getInstance()-&gt;getIdentity()-&gt;account_id;
    $modelAccount    = new Model_Account();
    return $modelAccount-&gt;getEbayToken($accountId);
}</pre>
<p>Mit dieser Implementierung können wir nun beliebige eBay trading API Anfragen versenden. <a title="Zum dritten Teil" href="http://blog.root-of-all-evil.com/?p=205" target="_self">Im dritten Teil dieses Guides beschreibe ich die Implementierung der Klasse Ebay_Auth_ConsentFlow</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Das Zend Framework und die eBay trading API &#8211; Teil 1</title>
		<link>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/</link>
		<comments>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 13:42:49 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=131</guid>
		<description><![CDATA[Webapplikationen, die die eBay trading API verwenden und damit für einen eBay Nutzer in seinem Namen Aktionen auf der eBay-Webseite durchführen, müssen einen Authorisationsprozess durchlaufen. Nutzer der Webapplikation müssen sich als eBay Nutzer identifizieren und die Applikation authorisieren Aktionen in ihrem Namen durchzufüren. Diesen Prozess möchte ich hier exemplarisch in einer Webapplikation mit Hilfe des Zend Framework abbilden und so den ersten Teil einer jeden eBay-Webapplikation beispielhaft beschreiben.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/" title="Das Zend Framework und die eBay trading API - Teil 1"></a><p>Erst mit guter Dokumentation macht es Sinn.</p>
<p>Und gut dokumentiert, das ist sowohl das <a title="Die umfangreiche Zend Framework Dokumentation" href="http://framework.zend.com/docs/" target="_blank">Zend Framework</a>, wie auch die <a title="Die eBay Trading API Dokumentation" href="http://developer.ebay.com/DevZone/XML/docs/WebHelp/wwhelp/wwhimpl/js/html/wwhelp.htm" target="_blank">eBay trading API</a>. Sinn macht es also beide zu kombinieren um schnell große eBay-Webapplikationen zu schaffen. Das Zend Framework erlaubt ein rapid PHP development und die eBay trading API ermöglicht es so ziemlich alles, was der Nutzer auf der eBay-Webseite sowieso schon tun kann in die eigenen Webapplikation zu klonen. Natürlich gibt es auch hier best practices &#8211; wie ich das ganze angegangen bin, dass möchte ich hier im folgenden beschreiben.</p>
<h3>Was werde ich hier in Teil 1 beschreiben?</h3>
<p>Webapplikationen, die die eBay trading API verwenden und damit für einen eBay Nutzer in seinem Namen Aktionen auf der eBay-Webseite durchführen, müssen einen Authorisationsprozess durchlaufen. Nutzer der Webapplikation müssen sich als eBay Nutzer identifizieren und die Applikation authorisieren Aktionen in ihrem Namen durchzufüren. Diesen Prozess möchte ich hier exemplarisch in einer Webapplikation mit Hilfe des Zend Framework abbilden und so den ersten Teil einer jeden eBay-Webapplikation beispielhaft beschreiben.<span id="more-131"></span></p>
<h3>Was benötigen wir um mit der eBay trading API zu arbeiten?</h3>
<ol>
<li><strong>Einen eBay Developers Program Account</strong> (<a title="Sofort beim eBay Developers Program anmelden" href="https://developer.ebay.com/join/Default.aspx" target="_blank">https://developer.ebay.com</a>)<br />
Das eBay Developers Program bietet Zugriff auf die eBay APIs und eine umfangreiche Dokumentation und Support. Es existieren Foren, Referenzen und zahlreiche Code-Beispiele. Ein solcher Account ist zwingen notwendig um die eBay trading API überhaupt ansprechen und nutzen zu können.</li>
<li><strong>Mindestens einen eBay Sandbox Account</strong> (<a title="Sofort bei der eBay Sandbox einen Account anlegen" href="https://scgi.sandbox.ebay.com/ws/eBayISAPI.dll?RegisterEnterInfo&amp;siteid=0&amp;UsingSSL=1&amp;co_partnerId=2" target="_blank">https://sandbox.ebay.com</a>)<br />
Es ist notwendig seine Applikationen in der eBay Sandbox zu entwickeln. Die Sandbox ist eine der original eBay Umgebung ähnelnde Spielwiese in der man zunächst einmal nichts kaputt machen und nach Lust und Laune seine Programme entwickeln und testen kann. Mindestens einen Account brauchen wir hier um in dessen Namen die trading API nutzen zu können. Empfehlen kann ich auch einen zweiten Account um beispielsweise und zu testzwecken Produkte des ersten Accounts zu ersteigern.</li>
<li><strong>Ein Set Sandbox API Keys</strong> (werden über den developers Account angelegt)<br />
Dazu zählen:</p>
<ul>
<li>Die <em>devID</em> &#8211; sie identifiziert uns als Entwickler beim Verwenden der eBay trading API</li>
<li>Die <em>AppID</em> &#8211; sie identifiziert unsere Applikation beim Verwenden der eBay trading API</li>
<li>Eine <em>CertID</em> &#8211; ein Zertifikat, dass wir beim Ansprechen der eBay trading API benötigen</li>
<li>Ein<em> RuName </em>- mit dem wir das eBay Anmeldeformular beim Authorisierungsprozess gestalten können<br />
Der RuName wird beim Konfigurieren des<em> Consent Flow</em> (der Authorisierungsprozess) im developers Account generiert. Uns wird beispielsweise die Möglichkeit gegeben das Anmeldeformular mit einem Logo unserer Applikation zu versehen.</li>
</ul>
</li>
</ol>
<h3>Was benötigen wir um mit dem Zend Framework zu arbeiten?</h3>
<ol>
<li>Eine aktuelle Version des <a title="Der Zend Server in der kostenlose Community Edition" href="http://www.zend.com/de/community/zend-server-ce" target="_blank">Zend Servers (Community Edition)</a> und das dazugehörige <a title="Das Zend Framework herunterladen" href="http://framework.zend.com/" target="_blank">Zend Framework</a>. Ich verwende das Zend Framework in der Version 1.9.5 und den Zend Server mit der PHP Version 5.2.11.</li>
<li>Ich empfehle das Entwicklertool <a title="Das Zend Studio Entwicklertool" href="http://www.zend.com/de/products/studio/downloads" target="_blank">Zend Studio</a> und Erfahrung, was das Arbeiten mit PHP, XML, dem Zend Framework und die Konfiguration eines Webservers angeht. Sollte das Zend Framework bis jetzt völlig unbekannt sein, dann möchte ich zunächst auf die zahlreichen Bücher zum Thema und die vielen Tutorials im Internet verweisen. Ich werde hier keine Einführung in das Framework geben.</li>
</ol>
<h3>Was benötigen wir sonst noch für unsere eBay Webapplikation?</h3>
<ol>
<li>Einen MySQL Server oder eine andere Datenbank. Ich verwende hier eine MySQL Datenbank in Verbindung mit der Zend_Db_Table Class, die eine abstraktion Layer besitzt und damit auch für andere Datenbanktypen verwendet werden kann.</li>
<li>Ein JavaScript Framework für unsere Ajax-Calls. Natürlich ist kein Framework notwendig, aber es macht die Frontendentwicklung und vor allem unsere Ajax Funktionen wunderbar einfach zu implementieren. Ich verwende <a title="Mootools JavaScript Framework" href="http://mootools.net/" target="_blank">mootools</a>, kann aber auch <a title="Das jQuery Javascript Framework" href="http://jquery.com" target="_blank">jQuery</a> empfehlen. Wichtig bei der Auswahl des Frameworks ist es, dass die Ajax-Requests ein XmlHttpRequest-Header mitsenden.</li>
<li>Eine Basis-Applikation mit einem eingerichtetem Layout, die es dem Benutzer erlaubt sich in unserer Applikation einzuloggen.</li>
</ol>
<h3>Der eBay User Consent Flow</h3>
<p>Wenn all das geklärt wurde, dann werden wir hier in Teil1 zunächst mit der Theorie beginnen: Wie sieht der User Consent Flow bei eBay aus? Dazu folgende Grafik:<a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" rel="lightbox[131]"><img class="aligncenter size-full wp-image-139" title="eBayUserConsentFlow" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" alt="Der eBay User Consent Flow" width="384" height="377" /></a></p>
<ol>
<li><strong>Schritt</strong><br />
Unsere Applikation wird die eBay API nach einer SessionID beten. Dazu schicken wir den ruName unserer Applikation mit, damit eBay das konfigurierte Anmeldeformular (inklusive unseres tollen Applikationslogos und der Redirect-URLs) generieren und mit der SessionID verknüpfen kann. Als Antwort erhalten wir also eine SessionID, die wir dann verwenden um die Parameter der URL des Anmeldeformulars zu generieren und den Benutzer dann im zweiten Schritt &#8230;<span style="color: #888888;"> </span></li>
<li><strong>Schritt</strong><br />
&#8230; an diese URL weiterzuleiten. Dort gibt er sein eBay Passwort und Nutzernamen ein und bestätigt, dass er unserer Webapplikation erlaubt in seinem Namen auf eBay Aktionen durchzuführen. Hat er bestätigt, leitet eBay den Benutzer wieder zurück zu unserer Applikation, die daraufhin im dritten Schritt &#8230;</li>
<li><strong>Schritt</strong><br />
&#8230; eine fetchToken Anfrage an die eBay API senden kann. Mit der fetchToken Anfrage geben wir gleich die zuvor erhaltene SessionID mit. Wurde diese SessionID verwendet und hat sich der Nutzer mit dieser SessionID im Zuge des Schritt 2 auch korrekt angemeldet, so erhalten wir einen ca. 900 Zeichen langes Token zurück gibt. Dieses Token muss unsere Applikation bei jeder API-Anfrage mitsenden und sich so autorisieren.</li>
</ol>
<p>Wie die Theorie mit dem Zend Framework möglichst schnell und unkompliziert in die Praxis umgesetzt werden kann werde ich<a title="Zum zweiten Teil dieses Guides" href="http://blog.root-of-all-evil.com/?p=161" target="_self"> im zweiten Teil dieses Guides</a> beschreiben. Ich gehe konkret auf die benötigten Klassen ein und werde zahlreiche Code-Beispiele geben.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

