目次


Google Base を PHP で検索、更新する

PHP を使って Google Base のデータを処理し、カスタム Web アプリケーションに統合する

Comments

はじめに

ほとんどの検索エンジンが機能する仕組みは、Web を巡回し、検出したコンテンツに索引を付け、コンテンツをフィルタリングして大容量データベースに保存し、これらのデータベースを検索して特定の検索クエリーと一致する結果を見つけるというものです。この巡回/索引付けのプロセスは、最大限の効率性を達成するために、またデータの照合と分類に偏りがないようにするために、人間が介入することなく行われます。

この点において、Google Base は特異な存在です。Google Base は、2005年後半にサービスの提供を開始したオンライン・データベースで、ユーザーが直接コンテンツをアップロードすることができます。さらに、ユーザーがコンテンツに各種の説明的な属性でタグを付け、この情報が Google の中心となっている検索エンジンで検出されるようにすることができます。このシステムには、例えば「jobs」、「travel」、「events」などの事前に定義された一連の項目タイプがあり、ユーザーがコンテンツを説明する際には、これらの事前定義された項目タイプを使うことも、あるいは新しい項目タイプを作成することもできます。アップロードできるデータの種類には制限がありません。親しい友達の名前と誕生日や、地元の「バトル・オブ・バンド」コンテストの次回の開催日時と場所、そして職場での現在の求人情報など、どんな情報でもアップロードすることができます。

もちろん、情報のオンライン・ストレージを提供するという部分は、Google Base の全体像の半分でしかありません。Google Base が提供する残りの半分は、情報を検索してアクセスできる機能です。Google Base にアップロードされたコンテンツには自動的に索引が付けられ、Google 検索エンジンから一般公開されます。さらに重要な点として、Google Base のコンテンツは Google Base Data API を介して使用できるということです。アプリケーション開発者はこの API を使って、ユーザーが作成したコンテンツを検索して取得し、そのコンテンツをカスタム・アプリケーションに統合することができます。REST モデルに準拠した Google Base Data API には、XML対応の開発ツールキットでアクセスすることができます。この API にはすでに、PHP、.NET、Python、Java 技術など、よく使われている多くのプログラミング言語に対応したクライアント・ライブラリーがあります。

この記事では Google Base Data API を取り上げ、Google Base で多種多様なカテゴリーの情報を検索し、検索結果をカスタム PHP アプリケーションに統合して使用する方法を説明します。記事には、各種の属性を使用してデータを検索する方法、システムにデータを追加する方法、そしてシステムのデータを更新、削除する方法を説明するサンプル・コードも記載します。それでは早速、本題に入りましょう。

Google Base のフィードについて

Google Base を使用したアプリケーションの開発に取り掛かる前に、Google Base がどのように機能するのかを理解しておく必要があります。REST をベースとしたサービスの例に漏れず、一連の動作は、指定のリソースに対する HTTP リクエストによって開始されます。この HTTP リクエストには 1 つ以上の入力パラメーターが設定されたクエリーが含まれ、サーバーはこのクエリーに対し、XML 対応のあらゆるクライアントで構文解析できるように Atom フィードで応答します。

この動作を確かめるには、お好みの Web ブラウザーで以下の URL にアクセスしてみてください。

http://www.google.com/base/feeds/snippets?
    bq=product+manager[itemtype:jobs][location:CA]

注: 見やすくするため、上記の URL は複数の行に分けて記載していますが、実際には一続きのストリングとして使用してください

カリフォルニア州 (CA) 内のプロダクト・マネージャー (product manager) の仕事 (jobs) を Google Base で検索する URL の例
http://www.google.com/base/feeds/snippets?bq=product+manager[itemtype:jobs][location:CA]

上記のリクエストによって、Google Base からエントリーの一覧が返されます。この例の場合、返されるのはカリフォルニア州内のプロダクト・マネージャーの仕事のリストです。このメソッドに対する XML レスポンス (検索結果ページのソース・コードを表示すると確認することができます) には、リストアップされたエントリーごとの詳細情報が含まれます。その一例をリスト 1 に示します。

リスト 1. Google Base のフィードの例
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
 xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' 
 xmlns:gm='http://base.google.com/ns-metadata/1.0' 
 xmlns:g='http://base.google.com/ns/1.0' 
 xmlns:batch='http://schemas.google.com/gdata/batch'>
  <id>http://www.google.com/base/feeds/snippets</id>
  <updated>2010-01-14T06:50:03.819Z</updated>
  <title type='text'>Items matching query: 
   product manager[itemtype:jobs][location:CA]</title>
  <link rel='alternate' type='text/html' href='http://base.google.com'/>
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' 
   href='http://www.google.com/base/feeds/snippets'/>
  <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' 
   href='http://www.google.com/base/feeds/snippets/batch'/>
  <link rel='self' type='application/atom+xml' 
   href='http://www.google.com/base/feeds/snippets?start-index=1&
   max-results=25&bq=product+manager%5Bitemtype%3A
   jobs%5D%5Blocation%3ACA%5D'/>
  <link rel='next' type='application/atom+xml' 
   href='http://www.google.com/base/feeds/snippets?start-index=26
   &max-results=25&bq=product+manager%5Bitemtype%3Ajobs
   %5D%5Blocation%3ACA%5D'/>
  <author>
    <name>Google Inc.</name>
    <email>base@google.com</email>
  </author>
  <generator version='1.0' uri='http://base.google.com'>GoogleBase
  </generator>
  <openSearch:totalResults>11299</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
  <entry>
    <id>http://www.google.com/base/feeds/snippets/6996651848910375403</id>
    <published>2010-01-08T12:57:46.000Z</published>
    <updated>2010-01-13T12:31:03.000Z</updated>
    <category scheme='http://base.google.com/categories/itemtypes' term='Jobs'/>
    <title type='text'>SR. PRODUCT MANAGER: Internet Video Markets</title>
    <content type='html'>As a SR. PRODUCT MANAGER, you're a take-charge person. 
    A born leader. A people person who sees the big picture, as well as the minute 
    details.     You generate powerful ideas and know how to get them implemented. 
    If this describes 
    you, you'll want to  ...</content>
    <link rel='alternate' type='text/html' 
     href='http://www.net-temps.com/job/37zk/USA_5192/sr_product_manager_internet.
     html?r=goo'/>
    <link rel='self' type='application/atom+xml' 
     href='http://www.google.com/base/feeds/snippets/6996651848910375403'/>
    <author>
      <name>Net-Temps</name>
    </author>
    <g:job_function type='text'>Marketing</g:job_function>
    <g:location type='location'>San Francisco, CA, us</g:location>
    <g:employer type='text'>Manpower</g:employer>
    <g:label type='text'>analysis</g:label>
    <g:label type='text'>business</g:label>
    <g:label type='text'>product</g:label>
    <g:label type='text'>access</g:label>
    <g:label type='text'>management</g:label>
    <g:label type='text'>marketing</g:label>
    <g:label type='text'>manager</g:label>
    <g:label type='text'>temporary job</g:label>
    <g:label type='text'>temp</g:label>
    <g:education type='text'>masters</g:education>
    <g:education type='text'>bachelors</g:education>
    <g:item_language type='text'>EN</g:item_language>
    <g:id type='text'>1237852</g:id>
    <g:job_type type='text'>contract</g:job_type>
    <g:job_type type='text'>contractor</g:job_type>
    <g:target_country type='text'>US</g:target_country>
    <g:expiration_date type='dateTime'>2010-01-20T12:31:03Z
    </g:expiration_date>
    <g:job_industry type='text'>Marketing</g:job_industry>
    <g:customer_id type='int'>1106811</g:customer_id>
    <g:item_type type='text'>Jobs</g:item_type>
  </entry>
  ...
</feed>

他の Google API と同様、Google Base Data API は REST リクエストに対し、要求されたデータを含めた Atom フィードで応答します。興味の対象となる主なフィードは 2 つあります。1 つは Google Base の全項目のリストが含まれる公開フィード (スニペット・フィード)、もう 1 つは、特定のユーザーによってアップロードされた項目のリストが含まれる非公開フィードです。前者は誰でもアクセスして検索することができますが、後者は認証に成功したフィード利用者でないと使用することができません。この記事では、この両方のフィードについて説明します。

リスト 1 に記載されているのは、カリフォルニア州内のプロダクト・マネージャーの仕事を検索するというリクエストに対して生成されたスニペット・フィードの例です。これは標準 Atom フィードで、最も外側にある <feed> 要素のなかに、結果セットの現在のページ、次のページ、前のページの URL が含まれる <link> 要素、そして検索の要約統計情報が含まれる <openSearch:> 要素があります。

最も外側の <feed> 要素には 1 つ以上の <entry> 要素もあり、そのそれぞれが、検索クエリーと一致した項目を表します。エントリーごとに、タイトル、テキストまたは HTML コンテンツのブロック、詳細情報の URL などの記述メタデータが含まれます。各 <entry> のなかには、関連情報への URL リンクを示す <link> 要素もあります。

ここでおそらく最も重要な点は、各エントリーに、項目タイプに関する追加情報が含まれる属性 (<g:> という名前空間が設定された要素) の一式があることです。Google Base には事前定義された項目タイプが数多くあり、そのそれぞれが推奨される属性を持っています。これらの属性は、2 つの理由で重要です。まずパブリッシャーの観点から言うと、属性で記述的情報を追加することによって、各エントリーにタグやマークアップを設定することができます。そしてユーザーの観点からは、属性を使って検索結果をフィルタリングできるからです。

属性の働きを良く理解するには、リスト 1 を生成するために使用した URL を見てください。リクエスト URL に組み込まれた locationitemtype の 2 つの属性は、フィルターの役割を果たします。結果セットはこの 2 つの属性によって、jobs 項目タイプに属し、かつ場所の州コードが CA に設定されたエントリーに絞り込まれます。

当然のことながら、仕事をリストアップするための情報要件は、例えばイベントをリストアップしたり、不動産をリストアップしたりする際の情報要件とはかなり違います。そのため、Google Base でサポートしている項目タイプごとに使用可能な属性のリストが異なるということは指摘に値します。例えば、jobs 項目タイプには場所、雇用主、学歴、給与などの属性が組み込まれている一方、recipes 項目タイプには料理、材料、何人分か、そして所要時間などの属性が組み込まれています。全項目タイプのリストと、それぞれに推奨される属性を調べる方法は、Google Base Data API Reference Guide で説明しています (「参考文献」にリンクを記載)。

SimpleXML による Google Base フィードの構文解析

背景情報を説明したところで、早速 Google Base のデータと PHP アプリケーションの統合について検討していきます。統合方法として最もシンプルなのは、PHP の SimpleXML 拡張を使用する方法です。SimpleXML は、XML にエンコードされたデータにアクセスするためのオブジェクト指向の API となります。あるいは SimpleXML の代わりに、PHP の DOM または XMLReader 拡張を使用して同じタスクを行うこともできますが、リスト 2 に一例として、SimpleXML を使用してリスト 1 の XML フィードを構文解析し、エンコードされたデータを Web ページに変換する方法を示します。

リスト 2. SimpleXML で Google Base のフィードを構文解析する
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Retrieving Google Base snippets</title>
    <style type="text/css">
    .title {
      font-weight: holder; 
    }
    .attr {
      margin-left: 15px;  
    }
    .result {
      margin-bottom: 5px;  
      float: left;
      width: 450px;
      margin-left: 20px; 
    }
    </style>
  </head>
  <body>
    <?php
    // define snippet feed URL
    $url = 'http://www.google.com/base/feeds/snippets?bq=
     product+manager[itemtype:jobs][location:CA]';
    
    // get feed XML and load into SimpleXML object
    $sxml = simplexml_load_file($url);
    
    // get summary counts from opensearch: namespace
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults;  
    ?>
    
    <h2><?php echo $sxml->title; ?></h2>
    <div id="summary">
      <?php echo $total; ?> result(s) found.
    </div>
    
    <br/>
  
    <div id="results")
      <?php $count = 1; ?>
      <?php foreach ($sxml->entry as $entry): ?>
      
      <?php
      // iterate over attributes
      // get employer, location, industry and type
      $attrs = $entry->children('http://base.google.com/ns/1.0');
      $valsEmployer = array();         
      $valsLocation = array();         
      $valsIndustry = array();         
      $valsEducation = array();         
      $valsType = array();         
      foreach ($attrs as $key => $value) { 
          switch ($key) {
            case 'employer':
              $valsEmployer[] = $value;                   
              break;                  
            case 'location':
              $valsLocation[] = $value;                   
              break;                  
            case 'job_industry':
              $valsIndustry[] = $value;                   
              break;                  
            case 'job_type':
              $valsType[] = $value;                   
              break;                  
            case 'education':
              $valsEducation[] = $value;                   
              break;                  
          }
        }
      ?>
        
      <div class="result">      
        <div class="title">
          <?php echo $count; ?>. 
          <?php echo $entry->title; ?>
        </div>
        <div class="attr">          
        Employer: <?php echo implode(', ', $valsEmployer); ?> <br/>
        Location: <?php echo implode(', ', $valsLocation); ?> <br/>
        Industry: <?php echo implode(', ', $valsIndustry); ?> <br/>
        Type: <?php echo implode(', ', $valsType); ?> <br/>
        Education: <?php echo implode(', ', $valsEducation); ?> <br/>
        </div>
      </div>
      <?php $count++; ?>
      <?php endforeach; ?>
    </div>  
    
  </body>
</html>

図 1 は、上記のコードによる出力例です。

図 1. SimpleXML を使用して Google Base を検索した結果
このスクリーン・キャプチャーには、SimpleXML を使用して Google Base でカリフォルニア州 (CA) 内のプロダクト・マネージャー (product manager) の仕事 (jobs) を検索した結果が示されています。
このスクリーン・キャプチャーには、SimpleXML を使用して Google Base でカリフォルニア州 (CA) 内のプロダクト・マネージャー (product manager) の仕事 (jobs) を検索した結果が示されています。
SimpleXML を使用して Google Base を検索した結果のテキスト・バージョン (図 1)
Items matching query: product manager[itemtype:jobs][location:CA]

10433 result(s) found.

1. SR. PRODUCT MANAGER: Internet Video Markets
   Employer: Manpower
   Location: San Franciso, CA, us
   Industry: Marketing
   Type: contract, contractor
   Education: masters, bachelors

2. Product Manager/Sr. Product Manager
   Employer: Life Technologies
   Location: Foster City, CA, 94404
   Industry: Pharmaceutical
   Type: Any
   Education: masters, bachelors, doctorate

3. Product Manager- Brand Manager- Entertainment- Computer Soft
   Employer: Cybercoders.com
   Location: Los Angeles, CA, 90001
   Industry: Marketing
   Type: Any
   Education: bachelors

リスト 2 ではまず初めに、simplexml_load_file() オブジェクトを使用してフィードの URL にリクエストを送信し、そのレスポンスを SimpleXML オブジェクトに変換します。続いて foreach() ループを使用した繰り返し処理により、レスポンスに含まれる <entry> の各要素を処理し、エントリーごとに属性を <g:element> ノード・コレクションに格納します。そして SimpleXML の children() メソッドを名前空間 g: と併せて使用して、このノード・コレクションを $attrs という名前の SimpleXMLElement オブジェクトとして返します。

これで、このオブジェクトからは SimpleXML を使って個々の属性と値を取得できるようになります。例えば、各エントリーの <g:location> 要素に格納されている勤務地情報には、$attrs->location 連想配列としてアクセスすることができます。この情報は複合 HTML ページに組み込まれ、単純な CSS スタイル設定によって使用可能になります。

Zend_Gdata による Google Base フィードの構文解析

Google Base フィードを構文解析するもう 1 つの方法では、SimpleXML を使った手動によるフィードの構文解析をまるごと排除し、代わりに Zend Framework の Zend_Gdata クライアント・ライブラリーを使用します。このライブラリーは、PHP アプリケーションと Google Data API の統合を図る開発者専用に設計されたものです。

Zend_Gdata ライブラリーは Zend Framework の一部としてダウンロードすることも、スタンドアロンのパッケージとしてダウンロードすることもできます (「参考文献」にリンクを記載)。このライブラリーには Google Base Data API を操作するための専用モジュールが組み込まれており、事前定義されたクラスとメソッドによってデータ・アクセスと認証を単純化することができます。このライブラリーはコミュニティーによってテストされた確かなコード・ベースをアプリケーションに提供するだけでなく、このライブラリーを使うことによって、XML ツリーをナビゲートしたり、カスタム名前空間を処理したりするといった詳細な部分を作成する代わりに、アプリケーションのコア機能に専念できるようになります。

リスト 3 は、Zend_Gdata クライアント・ライブラリーを実際に使用して、リスト 2 と同様の構文解析を行う方法を示します。

リスト 3. Zend_Gdata を使用して Google Base のフィードを構文解析する
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Gbase');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

try {
  // initialize service object
  // no authentication needed for public snippets feed
  $service = new Zend_Gdata_Gbase();

  // prepare and execute search query on snippets feed
  $query = $service->newSnippetQuery();
  $query->setBq('product manager[location:CA][itemtype:jobs]');
  $feed = $service->getGbaseSnippetFeed($query);
} catch (Exception $e) {
  die('ERROR:' . $e->getMessage());  
}
?>
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Retrieving Google Base snippets</title>
    <style type="text/css">
    .title {
      font-weight: bolder; 
    }
    .attr {
      margin-left: 15px;  
    }
    .result {
      margin-bottom: 5px;  
      float: left;
      width: 450px;
      margin-left: 20px; 
    }
    </style>
  </head>
  <body>
    
    <h2><?php echo $feed->title; ?></h2>
    <div id="summary">
    <?php echo $feed->totalResults; ?> result(s) found.
    </div>
    
    <br/>
  
    <div id="results")
      <?php $count = 1; ?>
      <?php foreach ($feed as $entry): ?>
      
      <?php
      // iterate over attributes
      // get employer, location, industry, education and type
      $valsEmployer = array();         
      $valsLocation = array();         
      $valsIndustry = array();         
      $valsType = array();         
      $valsEducation = array();         
      foreach ($entry->getGbaseAttributes() as $attr) { 
        if ($attr->getText()) {
          switch ($attr->getName()) {
            case 'employer':
              $valsEmployer[] = $attr->getText();                   
              break;                  
            case 'location':
              $valsLocation[] = $attr->getText();                   
              break;                  
            case 'job_industry':
              $valsIndustry[] = $attr->getText();                   
              break;                  
            case 'job_type':
              $valsType[] = $attr->getText();                   
              break;                  
            case 'education':
              $valsEducation[] = $attr->getText();                   
              break;                  
          }
        }
      }
      ?>
        
      <div class="result">      
        <div class="title">
          <?php echo $count; ?>. 
          <a href="<?php echo $entry->getLink('alternate')->getHref(); ?>"
          >
            <?php echo $entry->getTitle(); ?>
          </a>          
        </div>
        <div class="attr">          
        Employer: <?php echo implode(', ', $valsEmployer); ?> <br/>
        Location: <?php echo implode(', ', $valsLocation); ?> <br/>
        Industry: <?php echo implode(', ', $valsIndustry); ?> <br/>
        Type: <?php echo implode(', ', $valsType); ?> <br/>
        Education: <?php echo implode(', ', $valsEducation); ?> <br/>
        </div>
      </div>
      <?php $count++; ?>
      <?php endforeach; ?>
    </div>  
    
  </body>
</html>

リスト 3 では、まず Zend のクラス・ライブラリーをロードし、それから Zend_Gdata_Gbase サービス・クラスのインスタンスを初期化しています。以降の Google Base Data API とのやりとりでは一貫して、このクラスが制御ポイントの役割を果たします。今回アクセスしようとしているのは公開スニペット・フィードだけなので、サービス・オブジェクトは認証の資格情報を必要としませんが、ユーザーの非公開フィードを処理するとなると (この記事の後半で説明) 事態は変わってきます。

Zend_Gdata_Books のメソッドのうち、公開スニペット・フィードで使用する可能性が最も高いメソッドは、検索クエリーと一致する項目のフィードを返す getGbaseSnippetFeed() です。このメソッドには、setBq() クラスのメソッドによってクエリー・ストリングが設定された、構成済みの Zend_Gdata_Gbase_SnippetQuery オブジェクトのインスタンスが渡されます。getGbaseSnippetFeed() メソッドへのレスポンスはリスト 1 に記載されているような Atom フィードです。このフィードは自動的に構文解析されて、それぞれにフィード内の 1 つの <entry> を表す Zend_Gdata_Gbase_SnippetEntry オブジェクトの配列に変換されます。

各エントリーの個々の属性は、Zend_Gdata_Gbase_Extension_BaseAttribute オブジェクトとして表現され、このオブジェクトのそれぞれが、getName() メソッドと getText() メソッドを公開します。これらの属性の完全なコレクションを取得するには、Zend_Gdata_Gbase_SnippetEntry オブジェクトの getGbaseAttributes() メソッドを使用することができます。属性のコレクションを取得すれば、あとは至って簡単にコレクションを繰り返し処理し、必要な値を抽出し、抽出した値を HTML ページに表示することができます。注意する点として、getLink() メソッドは各エントリーのサード・パーティー URL へのリンクも返します。

図 2 に、リスト 3 による出力を示します。

図 2. Zend_Gdata を使用して Google Base を検索した結果
このスクリーン・キャプチャーには、Zend_Gdata を使用して Google Base でカリフォルニア州内のプロダクト・マネージャーの仕事を検索した結果が示されています。
このスクリーン・キャプチャーには、Zend_Gdata を使用して Google Base でカリフォルニア州内のプロダクト・マネージャーの仕事を検索した結果が示されています。
Zend_Gdata を使用して Google Base を検索した結果のテキスト・バージョン (図 2)
Items matching query: product manager[location:CA][itemtype:jobs]

10342 result(s) found.

1. SR. PRODUCT MANAGER: Internet Video Markets
   Employer: Manpower
   Location: San Franciso, CA, us
   Industry: Marketing
   Type: contract, contractor
   Education: masters, bachelors

2. Product Manager/Sr. Product Manager
   Employer: Life Technologies
   Location: Foster City, CA, 94404
   Industry: Pharmaceutical
   Type: Any
   Education: masters, bachelors, doctorate

3. Product Manager- Brand Manager- Entertainment- Computer Soft
   Employer: Cybercoders.com
   Location: Los Angeles, CA, 90001
   Industry: Marketing
   Type: Any
   Education: bachelors

この基本を理解できていれば、リスト 3 を変更して対話性を向上させるのは極めて簡単なことです。例えばリスト 4 では、ユーザーが検索キーワードを指定して、別の項目タイプで一致を検索できるように検索フォームを追加しています。

リスト 4. ユーザー指定の基準で Google Base を検索する
<?php
if (isset($_POST['submit'])) {
  // load Zend Gdata libraries
  require_once 'Zend/Loader.php';
  Zend_Loader::loadClass('Zend_Gdata_Gbase');
  Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
  
  try {
    // initialize service object
    // no authentication needed for public snippets feed
    $service = new Zend_Gdata_Gbase();
  
    // prepare and execute search query on snippets feed
    $query = $service->newSnippetQuery();
    $queryStr = $_POST['q'] . '[itemtype:' . $_POST['itemtype'] . ']';
    $query->setBq($queryStr);
    $feed = $service->getGbaseSnippetFeed($query);
  } catch (Exception $e) {
    die('ERROR:' . $e->getMessage());  
  }
}
?>
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Searching Google Base snippets</title>
    <style type="text/css">
    .title {
      font-weight: bolder; 
    }
    .attr {
      border-collapse: collapse;
      margin-top: 3px;
    }
    .result {
      margin-bottom: 5px;  
      float: left;
      width: 450px;
      margin-left: 10px; 
    }
    </style>
  </head>
  <body>
    
    <h2>Search</h2>
    <form method="post">
    Search for: 
    <input type="text" name="q" />
    in section:
    <select name="itemtype">
      <option value="events and activities">Events</option>
      <option value="housing">Housing</option>
      <option value="jobs">Jobs</option>
      <option value="news and articles">News</option>
      <option value="personals">Personals</option>
      <option value="recipes">Recipes</option>
      <option value="reviews">Reviews</option>
      <option value="services">Services</option>
    </select>
    <input type="submit" name="submit" value="Search" />
    </form>
    
    <?php if (isset($feed)): ?>
    <h2><?php echo $feed->title; ?></h2>
    <div id="summary">
    <?php echo $feed->totalResults; ?> result(s) found.
    </div>
    
    <br/>
  
    <div id="results")
      <?php $count = 1; ?>
      <?php foreach ($feed as $entry): ?>      
      <div class="result">      
        <div class="title">
          <?php echo $count; ?>. 
          <a href="<?php echo $entry->getLink('alternate')->getHref(); ?>"
          >
            <?php echo $entry->getTitle(); ?>
          </a>          
        </div>
        <table border="1" class="attr">                  
        <?php /* get and display all attributes */ ?>
        <?php /* convert hyperlinks using preg */ ?>
        <?php foreach ($entry->getGbaseAttributes() as $attr):  ?>
          <?php if ($attr->getText()): ?>
            <tr>
              <td><?php echo strtoupper($attr->getName()); ?></td> 
              <td><?php echo (preg_match('/^(http(s?)):/', 
               $attr->getText())) ? 
                '<a href="' . $attr->getText(). '">click here</a>' : 
                substr($attr->getText(), 0, 50); ?></td>
            </tr>
          <?php endif; ?>
        <?php endforeach; ?>        
        </table>
      </div>
      <?php $count++; ?>
      <?php endforeach; ?>
    </div>  
    <?php endif; ?>
    
  </body>
</html>

上記のスクリプトは複雑そうに見えますが、心配は要りません。内容は見た目よりも単純です。このスクリプトはまず、検索用の入力フィールドが含まれるフォームと、Google Base の項目タイプの (要約) リストをセットアップします。そしてユーザーが入力した値に基づいて Zend_Gdata_Gbase_SnippetQuery オブジェクトを生成し、それを getGbaseSnippetFeed() メソッドに渡して、入力パラメーターと一致する検索結果のフィードを取得します。続いて検索結果のフィードに含まれる各エントリーを処理し、それぞれのエントリーの属性を getGbaseAttributes() メソッドによって表示します。

図 3 は、キーワード「wine」が含まれるレビューを検索した結果、生成された出力の例です。

図 3. キーワード「wine」が含まれるレビューを Google Base で検索した結果
このスクリーン・キャプチャーには、キーワード「wine」が含まれるレビューを Google Base で検索した結果が示されています。
このスクリーン・キャプチャーには、キーワード「wine」が含まれるレビューを Google Base で検索した結果が示されています。

Google Base を検索した結果のフィルタリング

上記の例から明らかなように、属性をクエリー・フィルターとして使用するだけで、Google Base から返された検索結果をフィルタリングすることができます。これらの属性は通常、角括弧で囲みます。以下に、その例を記載します。

  • カリフォルニア州 (CA) 内のプロダクト・マネージャー (product manager) の仕事 (jobs) を Google Base で検索する URL の例
    http://www.google.com/base/feeds/snippets?bq=product+manager[itemtype:jobs][location:CA]
  • 材料 (ingredients) にベーコン (bacon) が含まれるレシピ (recipes) を Google Base で検索する URL の例
    http://www.google.com/base/feeds/snippets?bq=[itemtype:recipes][ingredients:bacon]
  • ニューヨーク (new york) 市の現代美術 (modern art) 展 (events and activities) を Google Base で検索する URL の例
    http://www.google.com/base/feeds/snippets?bq=modern+art[itemtype:events%20and%20activities][location:new%20york]

上記の属性とは別に、以下のパラメーターのいくつかを REST クエリーに追加することで簡単に API 出力をカスタマイズすることができます。

  • start-index パラメーター: フィードに含めるエントリーの開始オフセットを指定します。
  • max-results パラメーター: フィードに含めるエントリー数を指定します。
  • q パラメーター: 全文検索に使用することができます。
  • crowdby パラメーター: 指定された属性値を持つ項目の重複数を制限します。
  • orderby パラメーター: 検索結果のソート方法を指定します。

リスト 5 に、これらのパラメーターを使用した例を記載します。

リスト 5. Google Base を検索した結果のフィルタリング
<?php
if (isset($_POST['submit'])) {
  // load Zend Gdata libraries
  require_once 'Zend/Loader.php';
  Zend_Loader::loadClass('Zend_Gdata_Gbase');
  Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
  
  try {
    // initialize service object
    // no authentication needed for public snippets feed
    $service = new Zend_Gdata_Gbase();
  
    // prepare and execute search query on snippets feed
    // attach attribute filters
    $query = $service->newSnippetQuery();
    $queryStr = $_POST['q'] . '[itemtype:events and activities]';
    if (!empty($_POST['location'])) {
      $queryStr .= '[location: '. $_POST['location'] . ']';
    }
    if (!empty($_POST['event_type'])) {
      $queryStr .= '[event_type: '. $_POST['type'] .']';
    }    
    
    // display 20 results per page
    // crowd by content field
    $query->setBq($queryStr);
    $query->setMaxResults(20);
    $query->setCrowdBy('content:2');
    $feed = $service->getGbaseSnippetFeed($query);
  } catch (Exception $e) {
    die('ERROR:' . $e->getMessage());  
  }
}
?>
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Searching Google Base snippets</title>
    <style type="text/css">
    .title {
      font-weight: bolder; 
    }
    .attr {
      border-collapse: collapse;
      margin-top: 3px;
    }
    .result {
      margin-bottom: 5px;  
      float: left;
      width: 450px;
      margin-left: 10px; 
    }
    </style>
  </head>
  <body>
    
    <h2>Search Events</h2>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    Keywords: 
    <input type="text" name="q" />
    
    Location: 
    <input type="text" name="location"  size="10" />
    
    Event type: 
    <input type="text" name="type" size="10" />
    
    <input type="submit" name="submit" value="Search" />
    </form>
    
    <?php if (isset($feed)): ?>
    <h2><?php echo $feed->title; ?></h2>
    <div id="summary">
    <?php echo $feed->totalResults; ?> result(s) found.
    </div>
    
    <br/>
  
    <div id="results")
      <?php $count = 1; ?>
      <?php foreach ($feed as $entry): ?>      
      <div class="result">      
        <div class="title">
          <?php echo $count; ?>. 
          <a href="<?php echo $entry->getLink('alternate')->getHref(); ?>"
          >
            <?php echo $entry->getTitle(); ?>
          </a>          
        </div>
        <table border="1" class="attr">                  
        <?php /* get and display all attributes */ ?>
        <?php // convert hyperlinks using preg */ ?>
        <?php foreach ($entry->getGbaseAttributes() as $attr):  ?>
          <?php if ($attr->getText()): ?>
            <tr>
              <td><?php echo strtoupper($attr->getName()); ?></td> 
              <td><?php echo (preg_match('/^(http(s?)):/', 
               $attr->getText())) ? 
                '<a href="' . $attr->getText(). '">click here</a>' : 
                substr($attr->getText(), 0, 50); ?></td>
            </tr>
          <?php endif; ?>
        <?php endforeach; ?>        
        </table>
      </div>
      <?php $count++; ?>
      <?php endforeach; ?>
    </div>  
    <?php endif; ?>
    
  </body>
</html>

リスト 5 は、イベントのキーワード、場所、種類の各フィールドが含まれる単純なイベント検索フォームを生成します。フィールドの入力はそれぞれ対応する属性に変換されて、Google Base クエリーに追加されます。フィードに表示する検索結果の件数を制御するために setMaxResults() メソッドを使用すると同時に、重複を制限する属性と値を setCrowdBy() メソッドで定義します (この例の場合、コンテンツが重複するエントリーは 2 つに制限されます)。

図 4 に一例として、ニューヨーク市の現代美術展を検索した結果を示します。

図 4. Google Base で検索条件を指定してイベントを検索した結果
このスクリーン・キャプチャーには、ニューヨーク市の現代美術展を検索するように条件を指定して Google Base を検索した結果が示されています。
このスクリーン・キャプチャーには、ニューヨーク市の現代美術展を検索するように条件を指定して Google Base を検索した結果が示されています。

Google Base への項目の追加

これまでのサンプル・コードはすべて公開スニペット・フィードで動作してきましたが、前述したように、認証済みのユーザーは非公開フィードにもアクセスすることができます。非公開フィードには、ユーザーが独自に Google Base に追加した項目が含まれます。Google Base Data API は非公開フィードにプログラムでアクセスするための手段となり、ユーザーはこの API を呼び出すことによって項目を追加、編集、削除することができます。以降のセクションで、この非公開フィードでの操作を詳しく説明していきます。

まずは、新しい項目を追加する操作です。これは至って単純な操作で、XML にエンコードした <entry> ブロックを非公開フィードの URL に POST するだけで新しい項目を追加することができます。リスト 6 は、エントリー・ブロックの一例です。

リスト 6. Google Base のエントリー・ブロックの例
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom">
  <atom:title type="text">Chicken Tikka Masala</atom:title>
  <atom:content type="text">Cut the chicken into fine pieces. Fry until golden. 
   Add onions, spices and fry for 4-5 minutes and golden. Add chopped tomatoes,
   curd and seasoning. Allow to simmer for 10 minutes.</atom:content>
  <item_type xmlns="http://base.google.com/ns/1.0" type="text">recipes</item_type>
  <main_ingredient xmlns="http://base.google.com/ns/1.0" type="text">
    chicken
  </main_ingredient>
  <servings xmlns="http://base.google.com/ns/1.0" type="int">4</servings>
  <cooking_time xmlns="http://base.google.com/ns/1.0" type="number">30
  </cooking_time>
  <author xmlns="http://base.google.com/ns/1.0" type="text">Mr. Fantastic Cook
  </author>
  <ingredients xmlns="http://base.google.com/ns/1.0" type="text">chicken
  </ingredients>
  <ingredients xmlns="http://base.google.com/ns/1.0" type="text">onions
  </ingredients>
  <ingredients xmlns="http://base.google.com/ns/1.0" type="text">tomatoes
  </ingredients>
  <ingredients xmlns="http://base.google.com/ns/1.0" type="text">turmeric
  </ingredients>
  <ingredients xmlns="http://base.google.com/ns/1.0" type="text">coriander
  </ingredients>
  <ingredients xmlns="http://base.google.com/ns/1.0" type="text">curd
  </ingredients>
  <ingredients xmlns="http://base.google.com/ns/1.0" type="text">mustard seeds
  </ingredients>
</atom:entry>

非公開フィードは、その名の通り公開されていないため、非公開フィードに含まれるデータの操作は、その操作を行うフィード利用者のユーザー名とパスワードで認証された場合にのみ許可されます。認証には、Google が承認する 2 つの認証メソッド、AuthSub または ClientLogin のいずれかを使用します。このような認証を手動で行うのは、かなり厄介な作業です。さらに、通常の認証処理の間に発生する可能性のあるさまざまなシナリオを考慮するとなると大量のコードが必要になります。

幸い、ユーザーは認証に伴う作業についてそれほど心配する必要はありません。Zend_GData クライアント・ライブラリーが、すべての詳細を代わって処理してくれます。リスト 7 に、非公開フィードに新しい項目を追加する方法を示します。

リスト 7. Google Base にエントリーを追加する
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Gbase');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "user@gmail.com";
$pass = "secret";

try {
  // perform login 
  // initialize service object
  $client = Zend_Gdata_ClientLogin::getHttpClient(
    $user, $pass, 'gbase');
  $service = new Zend_Gdata_Gbase($client);

  // initialize new item
  // set title, content and type
  $item = $service->newItemEntry();  
  $item->setItemType('recipes');
  $item->title = new Zend_Gdata_App_Extension_Title('Chicken Tikka Masala');
  $item->content = new Zend_Gdata_App_Extension_Content(
   'Cut the chicken into fine pieces. Fry until golden. Add onions, 
   spices and fry for 4-5 minutes and golden. Add chopped tomatoes, 
   curd and seasoning. Allow to simmer for 10 minutes.');
  
  // set type attributes 
  $item->addGbaseAttribute('main_ingredient', 'chicken', 'text');
  $item->addGbaseAttribute('servings', '4', 'int');
  $item->addGbaseAttribute('cooking_time', '30', 'number');
  $item->addGbaseAttribute('author', 'Mr. Fantastic Cook', 'text');
  $item->addGbaseAttribute('ingredients', 'chicken', 'text');
  $item->addGbaseAttribute('ingredients', 'onions', 'text');
  $item->addGbaseAttribute('ingredients', 'tomatoes', 'text');
  $item->addGbaseAttribute('ingredients', 'turmeric', 'text');
  $item->addGbaseAttribute('ingredients', 'coriander', 'text');
  $item->addGbaseAttribute('ingredients', 'curd', 'text');
  $item->addGbaseAttribute('ingredients', 'mustard seeds', 'text');
  
  // save to server
  $entry = $service->insertGbaseItem($item);
    
  // display success message
  echo "Entry added successfully with ID: " . $entry->getId();  
} catch (Exception $e) {
  die('ERROR:' . $e->getMessage());  
}
?>

リスト 7 は、最初に Zend のクラス・ライブラリーをロードし、次に Zend_Gdata サービス・クラスのインスタンスを初期化します。前に記載した例とは異なり、今回このクラスが利用するのは Zend_Http_Client オブジェクトです。必要なユーザー認証情報が提供されているこのオブジェクトを使用して、Google Base サービスとの認証済みの接続をオープンするというわけです。

認証済み接続がオープンされたら、今度はサービス・オブジェクトの newItemEntry() メソッドを使用して Zend_Gdata_Gbase_ItemEntry クラスのインスタンスを初期化し、エントリー・オブジェクトの setItemType() メソッドを使って項目タイプを定義します。エントリーのタイトルとコンテンツも Zend_Gdata_App_Extension_Title クラス、Zend_Gdata_App_Extension_Content クラスそれぞれのインスタンスとして設定され、個々の属性がエントリー・オブジェクトの addGbaseAttribute() メソッドによって割り当てられます。エントリーが完成すると、サービス・オブジェクトの insertGbaseItem() メソッド呼び出しにより、エントリー全体が Google Base にPOST されます。

エントリーが正常に POST されると、新しいエントリー ID を示した結果ページが表示されます。図 5 は、結果ページの一例です。

図 5. Google Base に正常に項目が追加された場合の結果
このスクリーン・キャプチャーには、項目が Google Base に正常に追加されたことを示すメッセージが表示されています。
このスクリーン・キャプチャーには、項目が Google Base に正常に追加されたことを示すメッセージが表示されています。

追加した項目は Google Base のアカウントにも表示されます。図 6 は、その一例です。

図 6. 新しく追加された項目が表示された Google Base インターフェース

Google Base に保存されている項目の編集および削除

Google Base Data API では、エントリーを編集および削除することもできます。エントリーを削除するには、<link rel="self" ...> 要素に指定されたエントリーの URL に DELETE リクエストを送信します。Zend ライブラリーのコンテキストでは、この URL を Zend_Gdata_Gbase_ItemEntry オブジェクトの delete() メソッドに渡すだけでエントリーを削除することができます (リスト 8 を参照)。

リスト 8. Google Base からエントリーを削除する
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Gbase');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "user@gmail.com";
$pass = "secret";

try {
  // perform login 
  // initialize service object
  $client = Zend_Gdata_ClientLogin::getHttpClient(
    $user, $pass, 'gbase');
  $service = new Zend_Gdata_Gbase($client);

  // get and delete entry
  $id = 'http://www.google.com/base/feeds/items/1256392227904491772';  
  $entry = $service->getGbaseItemEntry($id);
  $entry->delete();
    
  // display success message
  echo "Entry deleted successfully with ID: " . $entry->getId();  
} catch (Exception $e) {
  die('ERROR:' . $e->getMessage());  
}
?>

エントリーを編集する場合も同様に、getGbaseItemEntry() でエントリー固有の URL を使用して該当するエントリーを取得し、更新対象の値を変更します。続いて、Zend_Gdata_Gbase_ItemEntry オブジェクトの save() メソッドを使用してエントリーの <link rel="self" ...> 要素に指定された URL に PUT リクエストを送信することにより、エントリーをサーバーに保存します。このプロセスは、リスト 9 に示すとおりです。

リスト 9. Google Base のエントリーを更新する
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Gbase');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "user@gmail.com";
$pass = "secret";

try {
  // perform login 
  // initialize service object
  $client = Zend_Gdata_ClientLogin::getHttpClient(
    $user, $pass, 'gbase');
  $service = new Zend_Gdata_Gbase($client);

  // get entry
  $id = 'http://www.google.com/base/feeds/items/11812821492318418471';  
  $item = $service->getGbaseItemEntry($id);
  
  // set new title
  $item->title = new Zend_Gdata_App_Extension_Title('Spaghetti Amatriciana');
  
  // set new content
  $item->content = new Zend_Gdata_App_Extension_Content('Cut 
   the bacon into thin strips and fry. Chop the onions and chillies and fry. 
   Add the bacon and tomato puree to the mixture. Simmer for 10 minutes, 
   then drain the pasta and mix.');
  
  // remove existing attributes
  // set new ones
  foreach ($item->getGbaseAttributes() as $attr) {
    $item->removeGbaseAttribute($attr);
  }
  $item->setItemType('recipes');
  $item->addGbaseAttribute('main_ingredient', 'pasta', 'text');
  $item->addGbaseAttribute('servings', '4', 'int');
  $item->addGbaseAttribute('cooking_time', '30', 'number');
  $item->addGbaseAttribute('author', 'Mr. Fantastic Cook', 'text');
  $item->addGbaseAttribute('ingredients', 'bacon', 'text');
  $item->addGbaseAttribute('ingredients', 'onions', 'text');
  $item->addGbaseAttribute('ingredients', 'tomatoes', 'text');
  $item->addGbaseAttribute('ingredients', 'green chillies', 'text');
  $item->addGbaseAttribute('ingredients', 'pasta', 'text');
  $item->addGbaseAttribute('ingredients', 'tomato puree', 'text');
  
  // save changes to server
  $item->save();
    
  // display success message
  echo "Entry updated successfully with ID: " . $item->getId();  
} catch (Exception $e) {
  die('ERROR:' . $e->getMessage());  
}
?>

リスト 9 は、まずエントリー固有の ID を使ってエントリーを取得し、新しいタイトルとコンテンツを割り当てています。次に、removeGbaseAttribute() メソッドによって既存の属性を削除してから、新しい属性一式を割り当てます。そして最後に、エントリー・オブジェクトを同じ ID で Google Base に保存します。

単純なアプリケーション

これまでのリストからおわかりのように、Google Base Data API を使って Google Base の項目を追加、削除、更新するのは極めて簡単な操作です。このセクションでは、これまでに説明した関数を中心とした単純な PHP アプリケーションを作成し、ユーザーが Google Base Data API を使用してイベント・リストを追加および削除できるようにします。

リスト 7 をベースにしたリスト 10 は、新しいイベント・リストを追加するためのフォームを作成し、フォームのデータを送信して Google Base に新規イベント・リストを追加します。

リスト 10. イベントのエントリーをユーザーの非公開 Google Base フィードに追加する
<?php if (isset($_POST['submit'])) {
  // load Zend Gdata libraries
  require_once 'Zend/Loader.php';
  Zend_Loader::loadClass('Zend_Gdata_Gbase');
  Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
  
  // set credentials for ClientLogin authentication
  $user = "user@gmail.com";
  $pass = "secret";
  
  try {
    // perform login 
    // initialize service object
    $client = Zend_Gdata_ClientLogin::getHttpClient(
      $user, $pass, 'gbase');
    $service = new Zend_Gdata_Gbase($client);

    //
    // perform input validation here
    // omitted for clarity
    //
      
    // initialize new item
    // set title, content and type
    $item = $service->newItemEntry();  
    $item->setItemType('events and activities');
    $item->title = new Zend_Gdata_App_Extension_Title($_POST['title']);
    $item->content = new Zend_Gdata_App_Extension_Content($_POST['content']);
    
    // set type attributes 
    foreach ($_POST['attr'] as $key => $value) {
      $item->addGbaseAttribute($key, $value);
    }
    
    // set date range
    $start = date('c', strtotime($_POST['start']));
    $item->addGbaseAttribute('event_date_range', $start);
    
    // save to server
    $entry = $service->insertGbaseItem($item);
      
    // display success message
    echo "Entry added successfully with ID: " . $entry->getId();  
    echo '<br/>';
    echo '<a href="list.php">Back to list</a>'; 
  } catch (Exception $e) {
    die('ERROR:' . $e->getMessage());  
  }
} else {
?>
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Adding events to Google Base</title>
  </head>
  <body>
    <h2>Add Event</h2>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <p>
      Title: <br/>
      <input type="text" name="title" />
    </p>
    
    <p>
      Description: <br/>
      <textarea name="content"></textarea>
    </p>
    
    <p>
      Venue: <br/>
      <input type="text" name="attr[venue]" />
    </p>
    
    <p>
      Address: <br/>
      <input type="text" name="attr[location]" />
    </p>
    
    <p>
      Type: <br/>
      <input type="text" name="attr[event_type]" />
    </p>
    
    <p>
      Start date/time (dd-mm-yyyy hh:mm): <br/>
      <input type="text" name="start" />
    </p>
    
    <input type="submit" name="submit" value="Submit" />
    </form>
  </body>  
</html>  
<?php  
}
?>

リスト 11 に記載するコードは、ユーザーの非公開フィードに対してクエリーを実行し、このフィードに保存されているすべてのエントリーを取得します。イベントのエントリーは、開催地と開催日時の情報と併せて一覧に表示されます。各エントリーには削除用のリンクもあります。このリンクが指すスクリプトをリスト 12 に記載します。

リスト 11. イベントのエントリーをユーザーの非公開 Google Base フィードに含める
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Gbase');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "user@gmail.com";
$pass = "secret";

try {
  // perform login 
  // initialize service object
  $client = Zend_Gdata_ClientLogin::getHttpClient(
    $user, $pass, 'gbase');
  $service = new Zend_Gdata_Gbase($client);

  // get item feed
  $feed = $service->getGbaseItemFeed();  
} catch (Exception $e) {
  die('ERROR:' . $e->getMessage());  
}
?>
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing events on Google Base</title>
    <style type="text/css">
    .title {
      font-weight: bolder; 
    }
    .attr {
      margin-left: 15px;  
    }
    .result {
      margin-bottom: 5px;  
      float: left;
      width: 450px;
      margin-left: 20px; 
    }
    </style>
  </head>
  <body>
    <h2>List Events</h2>
    <a href="add.php">Add a new event</a>    
    <br/>    <br/>

  
    <div id="results">
      <?php $count = 1; ?>
      <?php foreach ($feed as $entry): ?>
        <?php if ($entry->getItemtype() == 'events and activities'): ?>
        <?php
        // iterate over attributes
        // get required data
        foreach ($entry->getGbaseAttributes() as $attr) { 
          if ($attr->getText()) {
            switch ($attr->getName()) {
              case 'location':
                $location = $attr->getText();                   
                break;                  
              case 'venue':
                $venue = $attr->getText();                   
                break;                  
              case 'event_date_range':
                $date = $attr->getText();                   
                break;                  
              case 'event_type':
                $type = $attr->getText();                   
                break;                  
            }
          }
        }
        ?>
        
        <div class="result">      
          <div class="title">
            <?php echo $count; ?>. 
            <?php echo $entry->getTitle(); ?> 
            (<a href="delete.php?url=
             <?php echo $entry->getSelfLink()->getHref(); ?>"
             >delete</a>)
          </div>
          <div class="attr">          
          Description: <?php echo $entry->getContent(); ?> <br/>
          Venue: <?php echo (!empty($venue)) ? $venue : 
           'Unspecified'; ?> <br/>
          Address: <?php echo (!empty($location)) ? $location : 
           'Unspecified'; ?> <br/>
          Type: <?php echo (!empty($type)) ? $type : 
           'Unspecified'; ?> <br/>
          Date/time: <?php echo (!empty($date)) ? 
           date('d-m-Y h:i', strtotime($date)) : 'Unspecified'; ?> <br/>
          </div>
        </div>
        <?php $count++; ?>
        <?php endif; ?>
      <?php endforeach; ?>
    </div>  
</html>

リスト 12 はエントリーの URL を受け入れ、前にリスト 7 で説明した手法を使ってエントリーを Google Base から削除します。

リスト 12. イベントのエントリーをユーザーの非公開 Google Base フィードから削除する
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Gbase');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "user@gmail.com";
$pass = "secret";

try {
  // perform login 
  // initialize service object
  $client = Zend_Gdata_ClientLogin::getHttpClient(
    $user, $pass, 'gbase');
  $service = new Zend_Gdata_Gbase($client);

  // get and delete entry
  $id = $_GET['url'];  
  $entry = $service->getGbaseItemEntry($id);
  $entry->delete();
    
  // display success message
  echo "Entry deleted successfully with ID: " . $entry->getId(); 
  echo '<br/>';
  echo '<a href="list.php">Back to list</a>'; 
} catch (Exception $e) {
  die('ERROR:' . $e->getMessage());  
}
?>

まとめ

最後の数ページでは、SimpleXML と Zend クライアント・ライブラリーの組み合わせを使用して、Google Base Data API のデータを PHP アプリケーションに統合する方法を集中的に説明しました。この記事のサンプル・コードで説明した内容は以下のとおりです。

  • Google Base の 2 つの主要なフィード
  • Google Base が項目タイプと属性によってデータを分類する仕組み
  • 多種多様なフィルターを使用して Google Base のコンテンツを取得する方法
  • プログラムによってコンテンツを追加、変更、削除する方法
  • ユーザーの Google Base データへのインターフェースをカスタマイズして作成する例

以上のサンプル・コードが明らかにしているように、Google Base Data API は、開発者がコンテンツの集約と検索を中心とした独創的な新しいアプリケーションを作成する際に、すぐに使える強力かつ柔軟なツールです。ぜひ、実際に使って自分で確かめてみてください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source
ArticleID=485239
ArticleTitle=Google Base を PHP で検索、更新する
publish-date=02092010