Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 12 Web Services
  gp 12.1 Services_Google
  gp 12.2 Services_Amazon
  gp 12.3 Services_Weather
    gp 12.3.1 weather.com
    gp 12.3.2 Globalweather
  gp 12.4 Services_Ebay


Rheinwerk Computing

12.2 Services_Amazon  toptop


Besprochene Version: 0.2.0 Lizenz: BSD
Klassendatei(en): Services/Amazon.php

Auch Amazon bietet Web Services an. Mit diesen können Sie recht einfach und schnell einen eigenen Shop erstellen. Im Endeffekt ist es natürlich nicht Ihr Shop, sondern nur eine Darstellung des Amazon-Angebots auf Ihrer Webseite. Erfolgt ein Verkauf über Ihre Webseite, erledigt Amazon die Lieferung und Zahlungsabwicklung, so dass Sie keinen Aufwand damit haben. Damit Sie nicht leer ausgehen, bezahlt Amazon Ihnen eine Provision.

Das Paket Services_Amazon sieht zurzeit keine Unterstützung eines Warenkorbs auf der eigenen Seite vor, so dass mit seiner Hilfe kein kompletter Shop implementiert werden kann. Des Weiteren werden bei der Suche auch keine zShops durchsucht.

Um die Web Services nutzen zu können, benötigen Sie eine Subscription-ID, mit der Sie sich gegenüber Amazon identifizieren müssen. Diese können Sie unter der URL http://www.amazon.com/webservices kostenlos beantragen. [Hierzu benötigen Sie momentan einen Account bei amazon.com. Ein deutscher Account funktioniert nicht. ]

Services_Amazon ist momentan noch in einem frühen Entwicklungsstadium, so dass hier und da noch Probleme auftreten können. Ich würde Ihnen empfehlen, dass Sie die Ausgabe von Notices unterdrücken:

error_reporting(E_ALL ^ E_NOTICE);

Das zweite Problem ist, dass sich der Entwickler von Services_Amazon auf die amerikanische Website von Amazon fokussiert hat, so dass für die deutsche Variante einige Anpassungen notwendig sind.

Der wichtigste Punkt dabei ist die Methode, die die Kategorien generiert. Die Produktkategorien können nicht bei Amazon abgerufen werden und sind daher in einer Methode abgelegt, so dass Sie diese direkt auslesen können. Um eine korrekte Funktion und Darstellung zu gewährleisten, muss diese Methode in eine deutsche Variante konvertiert werden. Hierzu habe ich eine Funktion auf Basis der Methode erstellt, die über deutsche Kategorienamen und Texte verfügt.

Die eingedeutschte Variante der Methode/Funktion lautet so:

function getModes() { 
     return array( 
             'books-de'        => 'B&uuml;cher', 
             'books-de-intl-us'=> 'Englische B&uuml;cher', 
             'classical-de'    => 'Klassische Musik', 
             'dvd-de'          => 'DVD', 
             'electronics-de'  => 'Elektronik', 
             'garden-de'       => 'Garten &amp; Freizeit', 
             'kitchen-de'      => 'K&uuml;che &amp; Haushalt', 
             'magazines-de'    => 'Zeitschriften', 
             'music-de'        => 'Musik', 
             'pc-de'           => 'Computer &amp; Zubeh&ouml;r', 
             'photo-de'        => 'Kamera &amp; Foto', 
             'software-de'     => 'Software', 
             'toys-de'         => 'Spielwaren', 
             'universal-de'    => 'Heimwerken', 
             'vhs-de'          => 'Video', 
             'video-games-de'  => 'PC- &amp; Videospiele'); 
    }

Listing 12.2 Eingedeutschte Variante der Funktion getModes(  )

Da die Kategorien sich ändern können, prüfen Sie bitte unter http:// www.amazon.com/gp/aws/sdk/, ob die Kategorien noch aktuell sind.

Der Konstruktor der Klasse benötigt vier Parameter, um ein Objekt zurückzuliefern, das seine Dienste korrekt versieht.

Als ersten Parameter müssen Sie die Subscription ID angeben, um sich gegenüber Amazon zu identifizieren. Der zweite Parameter ist die Amazon Partner ID, die Sie im Rahmen des Partnerprogramms erhalten. Diese Partner ID referenziert das Abrechnungskonto, auf dem die Provision gutgeschrieben wird.

Der dritte Parameter ist der Landescode, an dem Amazon erkennt, in welcher Sprache die Produkte sein sollen, die eine Abfrage zurückliefert. Wenn Sie hier den String 'de' übergeben, werden Produkte aus dem deutschen Sprachraum zurückgegeben.

Der letzte Parameter ist die URL des zu verwendenden Servers. In diesem Fall verwende ich http://webservices.amazon.de/onca/xml2.

In Listing 12.3 finden Sie ein sehr einfaches Beispiel dafür, wie Amazon abgefragt werden kann.

// Notices ausblenden 
error_reporting(E_ALL ^ E_NOTICE); 
require_once 'Services/Amazon.php'; 
 
// Neues Objekt ableiten 
$amazon   = new Services_Amazon( 
                    '1PBBDQGXAQFNHY3R7BR2', 
                    'wwwnetztzexx-21', 'de', 
                    'http://webservices.amazon.de/onca/xml2'); 
 
// Nach dem Stichwort Galileo in der Kategorie Buecher suchen 
$products = $amazon->searchKeyword('Galileo', 'books-de', 1); 
 
// Ist ein Fehler aufgetreten? 
if(true===PEAR::isError($products)) 
{ 
   die($products->message); 
} 
 
// Erstes Buch auslesen 
$buch=$products[0]; 
// Daten ausgeben 
echo " 
<table><tr><td> 
<img src='$buch[imagesmall]'/> 
</td><td> 
Titel: $buch[name]<br /> 
Verlag: $buch[manufacturer]<br /> 
Preis: $buch[ourprice]<br /> 
</td></tr></table>";

Listing 12.3 Einfache Suchabfrage bei Amazon

Abbildung 12.2 Ausgabe der Informationen aus Listing 12.3 im Browser

Nachdem das Objekt instanziiert wurde, wird in diesem Beispiel die Methode searchKeyword() genutzt. Sie sucht innerhalb einer Kategorie nach einem bestimmten Schlüsselwort, das an erster Stelle der Parameterliste übergeben wurde. In diesem Fall wird also nach Galileo gesucht. Der zweite Parameter ist der Name der Kategorie, in der gesucht werden soll. Die 1 an der dritten Stelle bedeutet, dass die Daten von Seite 1 ermittelt werden sollen. Diese Zahl dient dazu, ein Blättern durch die Daten zu ermöglichen.

Die Methode liefert ein Array mit Datensätzen für die gefundenen Produkte zurück. In diesem Beispiel wird nur das erste Element des Arrays ausgelesen. Hierbei handelt es sich wiederum um ein Array, das teilweise ausgegeben wird.

Die Suche mithilfe der Methode searchKeyword() ist am einfachsten zu handhaben. Sie kann mit allen Kategorien arbeiten.

Allerdings gibt es eine recht stattliche Anzahl von Funktionen, die Ihnen weitere Suchmöglichkeiten eröffnen. Der Vorgang des Suchens wird dadurch, dass nicht alle Suchfunktionen für alle Produktarten genutzt werden können, ein wenig kompliziert. Nachfolgend finden Sie eine Liste mit den momentan definierten Suchmethoden. Jede der Methoden bekommt als ersten Parameter den Suchbegriff übergeben, so dass ich bei der Erläuterung nicht mehr darauf eingehen werde.

  • searchActor() Die Methode sucht nach einem Schauspieler und erwartet als zweiten Parameter die Kategorie, in der gesucht wird. Die Methode ist für Audio- und Video-Produkte zulässig.
  • searchAsin() Amazon vergibt für jedes Produkt eine eindeutige Nummer, die ASIN (Amazon Standard Identification Number). Diese Methode bekommt eine ASIN übergeben und liefert das damit identifizierte Produkt zurück. Zwar wird nur ein Wert zurückgegeben, aber auch diese Rückgabe erfolgt in einem Array.
  • searchDirector() Die Methode bekommt als ersten Parameter den Namen eines Regisseurs und als zweiten den Namen der Video-Kategorie übergeben. Als dritten Parameter können Sie eine Seitenzahl übergeben.
  • searchIsbn() Mit searchIsbn() können Sie nach einer International Standard Book Number (oder kurz ISBN) suchen, die nur für Bücher vergeben wird.
  • searchManufacturer() Mit dieser Methode können Sie nach dem Hersteller eines Produkts suchen. Unter den Begriff »Hersteller« fallen auch Verlage oder Music Labels. Als zweiter Parameter muss die Kategorie übergeben werden und als dritter die Nummer der Seite, die ausgegeben werden soll.
  • searchSimilar() Um vergleichbare Produkte in einer Kategorie zu finden, können Sie searchSimilar() nutzen. Die Methode bekommt eine ASIN und eine Kategorie übergeben. Darüber hinaus können Sie noch eine Seitenzahl übergeben, wenn es nötig ist.
  • searchWishlist() Amazon unterstützt »Wunschzettel«. Hierbei kann ein Benutzer eine Liste mit Artikeln anlegen, die jemand anderes ihm schenken kann. searchWishlist() bekommt die Kennung einer Wishlist übergeben, deren Produkte sie dann ausliest und zurückgibt.

Des Weiteren sind noch die Methoden searchArtist() und searchAuthor() deklariert. Da in diesen beiden Fällen aber leider die Kennung der Kategorie mit in die Funktion kodiert wurde, können sie für Amazon Deutschland zurzeit nicht genutzt werden.

Vor diesem Hintergrund finden Sie in Listing 12.4 eine eigene Implementation dieser Methoden.

Die Informationen, die Amazon zurückgibt, werden, wie schon erwähnt, in einem Array zurückgegeben. Innerhalb des Arrays sind die Daten für 10 Produkte enthalten, die die Indizes von 0 bis 9 haben. Zusätzlich gibt es noch die Array-Elemente page und pages. Im ersten finden Sie die Information, auf welcher Seite der Produktliste Sie sich gerade befinden, und im zweiten die Gesamtzahl der Seiten, die gefunden wurden.

Wenn Sie Informationen zu einem Produkt aus dem Array auslesen, erhalten Sie ein assoziatives Array. Die Informationen zu den Produkten hängen vom Produkt ab. Welche Art von Artikel Sie gefunden haben, ist am Array-Schlüssel type zu erkennen. Hier ist die englische Bezeichnung der Kategorie abgelegt, also beispielsweise 'Book' für ein Buch, 'Electronics' für Computer und Elektronik oder 'Toy' für Spielzeug.

Die Informationen, die in dem Array vorhanden sind, hängen von der Kategorie des Produkts ab. Der Autor des Pakets hat die Daten so weit eingeschränkt, dass die Unterschiede nur marginal sind. Für die wichtigsten Kategorien habe ich die Felder in Tabelle 12.2 zusammengestellt. Nutzen Sie eine andere Kategorie, würde ich Sie bitten, den zurückgelieferten Datensatz einmal mit var_dump() zu betrachten, um herauszufinden, welche Array-Felder vorhanden sind.


Tabelle 12.2 Informationen, die zu den Produkten zurückgegeben werden
Information Music Book DVD Electronics Software
url X X X X X
asin X X X X X
name X X X X X
artists X        
authors   X      
release X X X   X
manufacturer X X X X X
imagesmall X X X X X
imagemedium X X X X X
imagelarge X X X X X
listprice X X X X X
ourprice X X X X X

Die meisten Felder sind sicher selbsterklärend. Das Feld url beinhaltet die URL, unter der der Artikel bei Amazon betrachtet werden kann. In der URL ist die Partner ID enthalten, so dass Amazon im Falle eines Kaufs die Provision gutschreiben kann.

Das Feld release, das normalerweise das Veröffentlichungsdatum enthält, ist immer vorhanden. In einigen Fällen, wie beispielsweise bei Hardware (Electronics), ist allerdings kein Wert enthalten.

Anzumerken ist, dass sowohl die Felder artists als auch authors wiederum ein indiziertes Array beinhalten, in dem die Daten zu den einzelnen Künstlern bzw. Autoren alle in einem eigenen Feld abgelegt sind.

In Listing 12.4 habe ich ein kleines Frontend auf Basis des Pakets erstellt. Um das Script nicht zu lang werden zu lassen, habe ich mich auf die Produkt-Kategorien Bücher, DVD und Musik beschränkt.

error_reporting(E_ALL ^ E_NOTICE); 
require_once 'Services/Amazon.php'; 
 
// Erweiterung der Klasse Services_Amazon, um die Methoden 
// searchArtist() und searchAuthor() implementieren zu koennen 
class myAmazon extends Services_Amazon 
{ 
   // Fuer Deutschland angepasster Konstruktor mit 
   // deutschem Locale und Server 
   function __construct($token = null, $affid = null, 
          $locale = 'de', 
          $baseurl = 'http://webservices.amazon.de/onca/xml2') 
   { 
      parent::Services_Amazon($token, 
                              $affid,$locale,$baseurl); 
   } 
 
   function searchArtist($artist, $page = 1) 
   { 
      return $this->_sendRequest( 
                          array('ArtistSearch' =>$artist, 
                                'mode' => 'music-de'), $page); 
   } 
 
 
   function searchAuthor($author, $page = 1) 
   { 
       return $this->_sendRequest( 
                          array('AuthorSearch' => $author, 
                                'mode' => 'books-de'), $page); 
   } 
} 
 
// Funktion zum Ausgeben des Suchformulars 
function form($string = '') 
{ 
echo <<<EOF 
   <form method='GET'> 
      Produktart 
      <select name="kategorie"> 
         <option value="music-de">Musik</option> 
         <option value="books-de">Buch</option> 
         <option value="dvd-de">DVD</option> 
     </select><br /> 
      Suchen nach 
      <select name="typ"> 
         <option value="keyword">Stichwort</option> 
         <option value="artist">Musiker / Band</option> 
         <option value="author">Autor</option> 
         <option value="actor">Schauspieler</option> 
     </select><br /> 
     Suchbegriff <input name="string" value="$string"/><br /> 
     <input type="submit" value="Suchen" /> 
EOF; 
} 
 
$trans = array ( 
                'Book' => 
                      array ('type' => 'Buch', 
                             'name' => 'Titel', 
                             'authors' => 'Autoren', 
                             'release' => 'Erscheinungsdatum', 
                             'ourprice' => 'Preis', 
                             'manufacturer' => 'Verlag' 
                         ), 
             'DVD' => 
                      array ('type' => 'DVD', 
                             'name' => 'Titel', 
                             'release' => 'Erscheinungsdatum', 
                             'ourprice' => 'Preis', 
                             'manufacturer' => 'Vertrieb' 
                         ), 
             'Music' => 
                      array ('type' => 'Musik', 
                             'artists' => 'K&uuml;nstler', 
                             'name' => 'Titel', 
                             'release' => 'Erscheinungsdatum', 
                             'ourprice' => 'Preis', 
                             'manufacturer' => 'Music Label' 
                         ) 
        ); 
 
// Auslesen des Suchbegriffs 
if (true===isset($_GET['string'])) 
{ 
   $string=$_GET['string']; 
} 
else 
{ 
   $string=''; 
} 
 
// Formular ausgeben 
form($string); 
 
// Wurde nach etwas gesucht? 
if (''===$string) 
{ 
   echo '<br />Bitte geben Sie einen Suchbegriff ein'; 
}_$ret_else 
{ 
   // Neues Objekt ableiten 
   $amazon=new myAmazon('1PB4RWXVQFGHY3W7BR2', 'wwnavsde-11'); 
   // Auslesen der Kategorie, in der gesucht wurde 
   $kat=$_GET['kategorie']; 
 
   if (true===isset($_GET['page'])) 
   { 
      $next=$_GET['page']; 
   } 
   else 
   { 
      $next=1; 
   } 
 
   // In Abhaengigkeit von der Kategorie suchen 
   switch ($_GET['typ']) 
   { 
      case 'keyword': $erg= 
                   $amazon->searchKeyword($string,$kat,$next); 
                   break; 
      case 'artist' : $erg= 
                   $amazon->searchArtist($string, $next); 
                   break; 
      case 'author' : $erg= 
                   $amazon->searchAuthor($string,$next); 
                   break; 
      case 'actor'  : $erg= 
                   $amazon->searchActor($string,$kat,$next); 
                   break; 
      default       : die ('Ungültige Suche'); 
   } 
   if(true===PEAR::isError($erg)) 
   { 
      die($erg->message); 
   } 
   // Ausgabe der Seitenzahlen 
   echo "<p>Seite $erg[page] von $erg[pages]<br />"; 
   // Gibt es weitere Seiten? 
   // Dann Link zum Weiterblaettern ausgeben 
   if ($erg['page'] < $erg['pages']) 
   { 
      $query="$_SERVER[PHP_SELF]?string=$string&"; 
      $query.="kategorie=$kat&typ=$_GET[typ]&"; 
      $query.="page=".($erg['page']+1); 
      echo "<a href='$query'> 
            Weiter &gt;&gt;</a></p>"; 
   } 
 
   // Ergebnisse ausgeben 
   foreach ($erg as $key => $product) 
   { 
      // Um sicherzustellen, dass die Elemente 
      // page und pages ausgeschlossen werden 
      if (true=== is_numeric($key)) 
      { 
         // Daten ausgeben 
         $type=$product['type']; 
         echo utf8_decode( 
              "<p><table><tr><td> 
               <img src='$product[imagemedium]'/> 
               </td><td> 
               {$trans[$type]['name']}: $product[name] 
              "); 
         switch ($type) 
         { 
            case 'Book': echo " 
                          <br />{$trans[$type]['authors']}: "; 
                         echo utf8_decode( 
                          implode (", ",$product['authors'])); 
                         break; 
            case 'Music':echo "<br /> 
                              {$trans[$type]['artists']}: "; 
                         echo utf8_decode(implode (", ", 
                                    $product['artists'])); 
                         break; 
         } 
 
         echo utf8_decode( 
              "<br />{$trans[$type]['manufacturer']}: 
                                  $product[manufacturer]<br /> 
               {$trans[$type]['ourprice']}: 
                                  $product[ourprice]<br /> 
               <a href='$product[url]'>Bei Amazon kaufen</a> 
               </td></tr></table></p>"); 
      } 
   } 
}

Listing 12.4 Amazon-Frontend auf Basis von Services_Amazon

Das Paket ist zum jetzigen Zeitpunkt sicherlich noch nicht perfekt, aber es gibt Ihnen die Möglichkeit, schnell ein Amazon-Frontend zu schreiben.

Abbildung 12.3 Ausgabe des Frontends im Browser

 <<   zurück
     
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: PHP PEAR
PHP PEAR
Jetzt Buch bestellen!
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Rheinwerk-Shop: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Rheinwerk-Shop: MySQL 5.6






 MySQL 5.6


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern