| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 17175 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.gdata.gbase">
- <title>Google Base verwenden</title>
- <para>
- Die Google Base Daten <acronym>API</acronym> wurde entwickelt um Entwicklern zwei Dinge zu
- gestatten:
- <itemizedlist>
- <listitem>
- <para>
- Google Base Daten abzufragen um Anwendungen und Mashups zu erstellen.
- </para>
- </listitem>
- <listitem>
- <para>
- Google Base Elemente einzugeben und programtechnisch handzuhaben.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Es gibt zwei Feeds an Elementen: Feed Fetzen und benutzerdefinierte Feeds für Elemente. Der
- Feed Fetzen enthält alle Google Base Daten und ist für jeden lesbar um Abfragen darauf
- durchzuführen ohne der Notwendigkeit sich zu Authentifizieren. Der benutzerdefinierte Feed
- für Elemente ist ein benutzer spezifisches Subset an Daten und nur ein Benutzer/Eigentümer
- kann auf diesen Feed zugreifen um eigene Daten einzufügen, zu aktualisieren oder zu löschen.
- Abfragen werden für beide Typen von Feeds auf dem selben Weg erstellt.
- </para>
- <para>
- Siehe <ulink
- url="http://code.google.com/apis/base/">http://code.google.com/apis/base</ulink> für
- weitere Informationen über die Google Base <acronym>API</acronym>.
- </para>
- <sect2 id="zend.gdata.gbase.connect">
- <title>Verbinden zum Base Service</title>
- <para>
- Die Google Base <acronym>API</acronym> basiert, wie alle GData <acronym>API</acronym>s,
- auf dem Atom Publishing Protokoll (APP), einem <acronym>XML</acronym> basierenden Format
- für gemanagte Web-basierende Ressourcen. Der Verkehr zwischen einem Client und den
- Google Base Servern findet über <acronym>HTTP</acronym> statt, und erlaubt sowohl
- authentifizierte als auch nicht authentifizierte Verbindungen.
- </para>
- <para>
- Bevor irgendeine Transaktion stattfinden kann, muß diese Verbindung hergestellt werden.
- Das Erstellen einer Verbindung zu den Base Server enthält zwei Schritte: Erstellen eines
- <acronym>HTTP</acronym> Clients und das Binden einer
- <classname>Zend_Gdata_Gbase</classname> Serviceinstanz an diesen Client.
- </para>
- <sect3 id="zend.gdata.gbase.connect.authentication">
- <title>Authentifizierung</title>
- <para>
- Die Google Base <acronym>API</acronym> erlaubt Zugriff auf beide, sowohl öffentliche
- als auch private Base Feeds. Öffentliche Feeds benötigen keine Authentifizierung,
- sind aber nur lesbar und bieten nur reduzierte Funktionalität. Private Feeds bieten
- die größte Funktionalität benötigen aber eine authentifizierte Verbindung zu den
- Base Servern. Es gibt drei authentifizierung Schematas die von Google Base
- unterstützt werden:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <firstterm>ClientAuth</firstterm>
- bietet dirakte Benutzername/Passwort Authentifizierung zu den Base Servern.
- Da es dieses Schema notwendig macht das Benutzer die Anwendung mit Ihrem
- Passwort versorgen, ist diese Authentifizierung nur dann notwendig wenn
- andere Authentifizierung Schemata unzureichend sind.
- </para>
- </listitem>
- <listitem>
- <para>
- <firstterm>AuthSub</firstterm>
- erlaubt die Authentifizierung zu den Base Servern über einen Google Proxy
- Server. Das bietet das gleiche Level an Bequemlichkeit wie ClientAuth, aber
- ohne die Sicherheitsrisiken was es zu einer idealen Wahl für Web-basierte
- Anwendungen macht.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Die <classname>Zend_Gdata</classname> Bibliothek bietet Unterstützung für alle drei
- Authentifizierungs Schemata. Im Rest dieses Kapitels wird angenommen das man mit den
- Authentifizierungs Schemata umgehen kann und wie eine notwendige Authentifizierte
- Verbindung erstellt wird. Für weitere Informationen kann in das Kapitel <xref
- linkend="zend.gdata.introduction.authentication" /> oder die <ulink
- url="http://code.google.com/apis/gdata/auth.html">Übersicht der
- Authentifizierung im Entwickler Guide der Google Data
- <acronym>API</acronym></ulink> gesehen werden.
- </para>
- </sect3>
- <sect3 id="zend.gdata.gbase.connect.service">
- <title>Eine Service Instanz erstellen</title>
- <para>
- Im mit Google Base zu interagieren, bietet diese Bibliothek die
- <classname>Zend_Gdata_Gbase</classname> Service Klasse. Diese klasse bietet ein
- standardmäßiges Interface zu Google Data und den Atom Publishing Protokoll Modellen
- und unterstützt in der Durchführung von Anfragen von und zu den Base Servern.
- </para>
- <para>
- Sobald ein Authentifizierungs Schema ausgewählt wurde, besteht der nächste Schritt
- darin eine Instanz von <classname>Zend_Gdata_Gbase</classname> zu erstellen. Diese
- Klasse nimmt eine Instanz von <classname>Zend_Http_Client</classname> als einziges
- Argument. Das bietet ein Interface für AuthSub und ClientAuth Authentifizierungen,
- da beide einen speziellen authentifizierten <acronym>HTTP</acronym> Client für die
- Erstellung benötigen. Wenn keine Argumente angegeben wurden, wird automatisch eine
- nicht authentifizierte Instanz von <classname>Zend_Http_Client</classname> erstellt.
- </para>
- <para>
- Das nachfolgende Beispiel zeigt wir eine Base Service Klasse erstellt wird indem die
- ClientAuth Authentifizierung verwendet wird:
- </para>
- <programlisting language="php"><![CDATA[
- // Parameter für die ClientAuth Authentifizierung
- $service = Zend_Gdata_Gbase::AUTH_SERVICE_NAME;
- $user = "sample.user@gmail.com";
- $pass = "pa$$w0rd";
- // Erstellt einen authentifizierten HTTP Client
- $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
- // Erstellt eine Instanz des Base Services
- $service = new Zend_Gdata_Gbase($client);
- ]]></programlisting>
- <para>
- Ein Base Service der AuthSub verwendet kann ähnlich erstellt werden, durch einen
- etwas längeren Code:
- </para>
- <programlisting language="php"><![CDATA[
- /*
- * Empfängt die aktuelle URL so das der AuthSub Server weiß wohin er
- * umleiten soll nachdem die Authentifizierung des Benutzers vollständig ist.
- */
- function getCurrentUrl()
- {
- global $_SERVER;
- // Filtert php_self um Sicherheits Risiken zu vermeiden
- $php_request_uri =
- htmlentities(substr($_SERVER['REQUEST_URI'],
- 0,
- strcspn($_SERVER['REQUEST_URI'], "\n\r")),
- ENT_QUOTES);
- if (isset($_SERVER['HTTPS']) &&
- strtolower($_SERVER['HTTPS']) == 'on') {
- $protocol = 'https://';
- } else {
- $protocol = 'http://';
- }
- $host = $_SERVER['HTTP_HOST'];
- if ($_SERVER['HTTP_PORT'] != '' &&
- (($protocol == 'http://' && $_SERVER['HTTP_PORT'] != '80') ||
- ($protocol == 'https://' && $_SERVER['HTTP_PORT'] != '443'))) {
- $port = ':' . $_SERVER['HTTP_PORT'];
- } else {
- $port = '';
- }
- return $protocol . $host . $port . $php_request_uri;
- }
- /**
- * Einen AuthSub authentifizierten HTTP Client erhalten, und den Benutzer zum
- * AuthSub Server umleiten um sich anzumelden wenn das notwendig ist.
- */
- function getAuthSubHttpClient()
- {
- global $_SESSION, $_GET;
- // Wenn es keine AuthSub Session gibt oder kein Einmal-Token auf uns wartet,
- // den Benutzer zum AuthSub Server umleiten um eine zu erhalten.
- if (!isset($_SESSION['sessionToken']) && !isset($_GET['token'])) {
- // Parameter für den AuthSub Server
- $next = getCurrentUrl();
- $scope = "http://www.google.com/base/feeds/items/";
- $secure = false;
- $session = true;
- // Den Benutzer zum AuthSub Server umleiten um sich anzumelden
- $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($next,
- $scope,
- $secure,
- $session);
- header("HTTP/1.0 307 Temporary redirect");
- header("Location: " . $authSubUrl);
- exit();
- }
- // Konvertiert einen AuthSub Einmal-Token in einen Session-Token wenn das notwendig ist
- if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
- $_SESSION['sessionToken'] =
- Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
- }
- // An diesem Punkt sind wir durch AuthSub authentifiziert und können eine
- // authentifizierte Instanz des HTTP Clients erhalten
- // Erstellt einen authentifizierten HTTP Client
- $client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);
- return $client;
- }
- // -> Script Ausführung beginnt hier <-
- // http://code.google.com/apis/gdata/reference.html#Queries
- // Sicherstellen das der Benutzer eine gültige Session hat sodas wir die
- // AuthSub Session aufnehmen können sobald diese vorhanden ist.
- session_start();
- // Erstellt eine Instanz des Base Services, leitet den Benutzer zum AuthSub Server um
- // wenn das notwendig ist.
- $service = new Zend_Gdata_Gbase(getAuthSubHttpClient());
- ]]></programlisting>
- <para>
- Letztendlich kann ein nicht authentifizierter Server erstellt werden für die
- Verwendung mit Feed Fetzen:
- </para>
- <programlisting language="php"><![CDATA[
- // Erstellt eine Instanz des Base Services und verwendet einen nicht
- // authentifizierten HTTP Client
- $service = new Zend_Gdata_Gbase();
- ]]></programlisting>
- </sect3>
- </sect2>
- <sect2 id="zend.gdata.gbase.retrieve">
- <title>Elemente empfangen</title>
- <para>
- Benutzerdefinierte Feeds oder Feed Fetzen können abgefragt werden um Elemente zu
- erhalten. Es benötigt zwei Schritte um eine Abfrage zu senden und über den
- zurückgegebenen Feed zu iterieren.
- </para>
- <sect3 id="zend.gdata.gbase.retrieve.query">
- <title>Eine strukturierte Anfrage senden</title>
- <para>
- Eine strukturierte Anfrage kann gesendet werden um Elemente vom eigenen
- benutzerdefinierten Feed oder von einem öffentlichen Feed Fetzen zu erhalten.
- </para>
- <para>
- Wenn Elemente empfangen werden indem die Base <acronym>API</acronym> verwendet wird,
- werden speziell konstruierte Abfrage <acronym>URL</acronym>s verwendet um zu
- beschreiben welche Evente zurückgegeben werden sollen. Die
- <classname>Zend_Gdata_Gbase_ItemQuery</classname> und
- <classname>Zend_Gdata_Gbase_SnippetQuery</classname> Klassen vereinfachen diese
- Aufgabe durch die automatische Erstellung einer Anfrage <acronym>URL</acronym>
- basierend auf den angegebenen Parametern.
- </para>
- <sect4 id="zend.gdata.gbase.retrieve.query.customeritems">
- <title>Benutzerdefinierte Feed Elemente Anfragen</title>
- <para>
- Um eine Abfrage auf Benutzerdefinierte Feed Elemente durchzuführen, gibt es die
- <methodname>newItemQuery()</methodname> und
- <methodname>getGbaseItemFeed()</methodname> Methoden:
- </para>
- <programlisting language="php"><![CDATA[
- $service = new Zend_Gdata_Gbase($client);
- $query = $service->newItemQuery();
- $query->setBq('[title:Programming]');
- $query->setOrderBy('modification_time');
- $query->setSortOrder('descending');
- $query->setMaxResults('5');
- $feed = $service->getGbaseItemFeed($query);
- ]]></programlisting>
- <para>
- Eine komplette Liste dieser Parameter ist im <ulink
- url="http://code.google.com/apis/base/items-feed.html#QueParameters">Abfrage
- Parameter Kapitel</ulink> der Benutzerdefinierten Feed Elemente
- Dokumentation vorhanden.
- </para>
- </sect4>
- <sect4 id="zend.gdata.gbase.retrieve.query.snippets">
- <title>Feed Fetzen abfragen</title>
- <para>
- Um eine Abfrage über öffentliche Feed Fetzen durchzuführen, gibt es die
- <methodname>newSnippetQuery()</methodname> und
- <methodname>getGbaseSnippetFeed()</methodname> Methoden:
- </para>
- <programlisting language="php"><![CDATA[
- $service = new Zend_Gdata_Gbase();
- $query = $service->newSnippetQuery();
- $query->setBq('[title:Programming]');
- $query->setOrderBy('modification_time');
- $query->setSortOrder('descending');
- $query->setMaxResults('5');
- $feed = $service->getGbaseSnippetFeed($query);
- ]]></programlisting>
- <para>
- Eine komplette Liste dieser Parameter ist im <ulink
- url="http://code.google.com/apis/base/items-feed.html#QueParameters">Abfrage
- Parameter Kapitel</ulink> der Feed Fetzen Dokumentation vorhanden.
- </para>
- </sect4>
- </sect3>
- <sect3 id="zend.gdata.gbase.retrieve.iterate">
- <title>Über die Elemente iterieren</title>
- <para>
- Google Base Elemente können Element-Spezifische Attribute enthalten, wie
- <code><g:main_ingredient></code> und <code><g:weight></code>.
- </para>
- <para>
- Um über alle Attribute eines gegebenen Elements zu iterieren, gibt es die
- <methodname>getGbaseAttributes()</methodname> Methode die über alle Ergebnisse
- iteriert:
- </para>
- <programlisting language="php"><![CDATA[
- foreach ($feed->entries as $entry) {
- // Alle Attribute erhalten und den Namen und den Textwert
- // jedes Attributes ausgeben
- $baseAttributes = $entry->getGbaseAttributes();
- foreach ($baseAttributes as $attr) {
- echo "Attribut " . $attr->name . " : " . $attr->text . "<br>";
- }
- }
- ]]></programlisting>
- <para>
- Oder es kann auf spezielle Attributnamen gesehen werden und über die passenden
- Ergebnisse iteriert werden:
- </para>
- <programlisting language="php"><![CDATA[
- foreach ($feed->entries as $entry) {
- // Gibt alle Hauptzutaten aus <g:main_ingredient>
- $baseAttributes = $entry->getGbaseAttribute("main_ingredient");
- foreach ($baseAttributes as $attr) {
- echo "Hauptzutaten: " . $attr->text . "<br>";
- }
- }
- ]]></programlisting>
- </sect3>
- </sect2>
- <sect2 id="zend.gdata.gbase.crud">
- <title>Benutzerdefinierte Elemente einfügen, aktualisieren und löschen</title>
- <para>
- Ein Benutzer/Eigentümer kann auf seine eigenen Benutzerdefinierten Feed Elemente
- zugreifen um Sie hinzuzufügen, zu aktualisieren oder Ihre Elemente zu löschen. Diese
- Operationen sind für den öffentlichen Feed Fetzen nicht vorhanden.
- </para>
- <para>
- Eine Feed Operation kann getestet werden bevor diese wirklich ausgeführt wird durch das
- setzen des Dry-Run Flags (<varname>$dryRun</varname>) auf <constant>TRUE</constant>.
- Sobald sichergestellt ist das die Daten übertragen werden sollen, muß es auf
- <constant>FALSE</constant> gesetzt werden um die Operation durchzuführen.
- </para>
- <sect3 id="zend.gdata.gbase.crud.insert">
- <title>Ein Element einfügen</title>
- <para>
- Elemente können hinzugefügt werden durch Verwenden der
- <methodname>insertGbaseItem()</methodname> Methode des Base Services:
- </para>
- <programlisting language="php"><![CDATA[
- $service = new Zend_Gdata_Gbase($client);
- $newEntry = $service->newItemEntry();
- // Überschrift hinzufügen
- $title = "PHP Entwickler Handbuch";
- $newEntry->title = $service->newTitle(trim($title));
- // Etwas Inhalt hinzufügen
- $content = "Wichtiges Handbuch für PHP Entwickler.";
- $newEntry->content = $service->newContent($content);
- $newEntry->content->type = 'text';
- // Produkt Typ definieren
- $itemType = "Produkte";
- $newEntry->itemType = $itemType;
- // Ein spezielles Element Attribut hinzufügen
- $newEntry->addGbaseAttribute("product_type", "book", "text");
- $newEntry->addGbaseAttribute("price", "12.99 USD", "floatUnit");
- $newEntry->addGbaseAttribute("quantity", "10", "int");
- $newEntry->addGbaseAttribute("weight", "2.2 lbs", "numberUnit");
- $newEntry->addGbaseAttribute("condition", "New", "text");
- $newEntry->addGbaseAttribute("author", "John Doe", "text");
- $newEntry->addGbaseAttribute("edition", "First Edition", "text");
- $newEntry->addGbaseAttribute("pages", "253", "number");
- $newEntry->addGbaseAttribute("publisher", "My Press", "text");
- $newEntry->addGbaseAttribute("year", "2007", "number");
- $newEntry->addGbaseAttribute("payment_accepted", "Google Checkout", "text");
- $dryRun = true;
- $createdEntry = $service->insertGbaseItem($newEntry, $dryRun);
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.gdata.gbase.crud.modify">
- <title>Ein Element modifizieren</title>
- <para>
- Jedes Atribut eines Element kann aktualisiert werden wenn durch Sie iteriert wird:
- </para>
- <programlisting language="php"><![CDATA[
- // Die Überschrift aktualisieren
- $newTitle = "PHP Entwickler Handbuch zweite Editiondbook Second Edition";
- $entry->title = $service->newTitle($newTitle);
- // <g:price> Attribute finden und den Preis aktualisieren
- $baseAttributes = $entry->getGbaseAttribute("price");
- if (is_object($baseAttributes[0])) {
- $newPrice = "16.99 USD";
- $baseAttributes[0]->text = $newPrice;
- }
- // <g:pages> Attribute finden und die anzahl an Seiten aktualisieren
- $baseAttributes = $entry->getGbaseAttribute("pages");
- if (is_object($baseAttributes[0])) {
- $newPages = "278";
- $baseAttributes[0]->text = $newPages;
- // Den Attribut Typ von "number" zu "int" aktualisieren
- if ($baseAttributes[0]->type == "number") {
- $newType = "int";
- $baseAttributes[0]->type = $newType;
- }
- }
- // <g:label> Attribute entfernen
- $baseAttributes = $entry->getGbaseAttribute("label");
- foreach ($baseAttributes as $note) {
- $entry->removeGbaseAttribute($note);
- }
- // Neue Attribute hinzufügen
- $entry->addGbaseAttribute("note", "PHP 5", "text");
- $entry->addGbaseAttribute("note", "Web Programming", "text");
- // Die Änderungen abspeichern durch Aufruf von save() am Element-Objekt selbst
- $dryRun = true;
- $entry->save($dryRun);
- // Oder die Änderungen durch Aufruf von updateGbaseItem() am Service Objekt abspeichern
- // $dryRun = true;
- // $service->updateGbaseItem($entry, $dryRun);
- ]]></programlisting>
- <para>
- Nach der Durchführung der Änderungen, muß entweder die
- <methodname>save($dryRun)</methodname> Methode am
- <classname>Zend_Gdata_Gbase_ItemEntry</classname> Objekt oder die
- <methodname>updateGbaseItem($entry, $dryRun)</methodname> Methode am
- <classname>Zend_Gdata_Gbase</classname> Objekt aufgerufen werden um die Änderungen
- abzuspeichern.
- </para>
- </sect3>
- <sect3 id="zend.gdata.gbase.crud.delete">
- <title>Ein Element löschen</title>
- <para>
- ein Element kann gelöscht werden indem die
- <methodname>deleteGbaseItem()</methodname> Methode aufgerufen wird:
- </para>
- <programlisting language="php"><![CDATA[
- $dryRun = false;
- $service->deleteGbaseItem($entry, $dryRun);
- ]]></programlisting>
- <para>
- Alternativ kann <methodname>delete()</methodname> auf dem
- <classname>Zend_Gdata_Gbase_ItemEntry</classname> Objekt aufgerufen werden:
- </para>
- <programlisting language="php"><![CDATA[
- $dryRun = false;
- $entry->delete($dryRun);
- ]]></programlisting>
- </sect3>
- </sect2>
- </sect1>
|