Zend_Gdata_Gbase.xml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 15103 -->
  4. <sect1 id="zend.gdata.gbase">
  5. <title>Google Base の使用法</title>
  6. <para>
  7. Google Base データ API は、開発者が以下のことを行えるように設計されています。
  8. <itemizedlist>
  9. <listitem>
  10. <para>
  11. Google Base のデータに対して問い合わせを行うアプリケーションやマッシュアップを作成する
  12. </para>
  13. </listitem>
  14. <listitem>
  15. <para>
  16. Google Base のアイテムをプログラム上で登録したり管理したりする
  17. </para>
  18. </listitem>
  19. </itemizedlist>
  20. </para>
  21. <para>
  22. アイテムのフィードには二種類があります。snippets フィードと customer items フィードです。
  23. snippets フィードにはすべての Google Base のデータが含まれ、
  24. 認証なしで誰でも問い合わせることができます。
  25. customer items フィードは特定の顧客に特化したデータの一部で、
  26. そのカスタマー/オーナーだけがフィードにアクセスしてデータを追加、更新、削除することができます。
  27. どちらのフィードに対しても、クエリの作成方法は同じです。
  28. </para>
  29. <para>
  30. Google Base API についての詳細は
  31. <ulink url="http://code.google.com/apis/base/">http://code.google.com/apis/base</ulink>
  32. を参照ください。
  33. </para>
  34. <sect2 id="zend.gdata.gbase.connect">
  35. <title>Base サービスへの接続</title>
  36. <para>
  37. Google Base API は、他の GData API と同様に Atom Publishing Protocol (APP)
  38. を使用しています。これは、ウェブベースのリソースを扱うための
  39. XML 形式のフォーマットです。クライアントと Booble Base サーバとの間は
  40. HTTP による通信を行い、認証済みの接続と未認証の接続の両方に対応しています。
  41. </para>
  42. <para>
  43. トランザクションを実行するには、まずこの接続を作成する必要があります。
  44. Base サーバへの接続を作成するには、次の二段階の手順を踏みます。
  45. まずは HTTP クライアントを作成し、それから <classname>Zend_Gdata_Gbase</classname>
  46. サービスのインスタンスをそのクライアントにバインドします。
  47. </para>
  48. <sect3 id="zend.gdata.gbase.connect.authentication">
  49. <title>認証</title>
  50. <para>
  51. Google Base API は、公開 (public) フィードと非公開 (private)
  52. フィードの両方にアクセスすることができます。
  53. 公開フィードへのアクセスには認証は不要です。
  54. しかし読み込み専用のアクセスとなり、機能も制限されます。
  55. 非公開フィードに対してはほぼすべての機能を使用できますが、
  56. Base サーバに対する認証済みの接続が必要となります。
  57. Google Base がサポートする認証方式には三種類あります。
  58. </para>
  59. <itemizedlist>
  60. <listitem>
  61. <para>
  62. <firstterm>ClientAuth</firstterm>
  63. は、ユーザ名/パスワードによる認証を Base サーバに対して直接行います。
  64. この方式では、アプリケーションが直接パスワードを扱う必要があります。
  65. したがって、この認証方式を使うのは、他の方式が使えない場合のみにしましょう。
  66. </para>
  67. </listitem>
  68. <listitem>
  69. <para>
  70. <firstterm>AuthSub</firstterm>
  71. は、Google プロキシサーバを経由した認証を行います。
  72. ClientAuth と同じくらい簡単に使用でき、セキュリティのリスクもありません。
  73. ウェブベースのアプリケーションでは、これが最も望ましい方式です。
  74. </para>
  75. </listitem>
  76. </itemizedlist>
  77. <para>
  78. <classname>Zend_Gdata</classname> ライブラリは、これら三種類の認証方式にすべて対応しています。
  79. 本章のこれ以降では、読者が認証方式についてよく知っていること、
  80. そして認証済み接続の作成方法を知っていることを前提として説明を進めます。
  81. 詳細な情報は、<xref linkend="zend.gdata.introduction.authentication" />
  82. あるいは
  83. <ulink url="http://code.google.com/apis/gdata/auth.html">Google Data API Developer's Guide
  84. の Authentication Overview</ulink>
  85. を参照ください。
  86. </para>
  87. </sect3>
  88. <sect3 id="zend.gdata.gbase.connect.service">
  89. <title>サービスのインスタンスの作成</title>
  90. <para>
  91. Google Base に対する作業を行うために
  92. <classname>Zend_Gdata_Gbase</classname> サービスクラスが用意されています。
  93. このクラスは Google Data および Atom Publishing Protocol
  94. に対する共通のインターフェイスを提供し、
  95. Base サーバとの間のリクエストのやりとりを支援します。
  96. </para>
  97. <para>
  98. 使用する認証方式が決まったら、次に行うのは
  99. <classname>Zend_Gdata_Gbase</classname> のインスタンスを作成することです。
  100. このクラスの引数には <classname>Zend_Http_Client</classname>
  101. のインスタンスを指定します。これが AuthSub および ClientAuth
  102. 認証へのインターフェイスとなる認証済みの HTTP クライアントです。
  103. 引数を省略した場合は、未認証の
  104. <classname>Zend_Http_Client</classname> のインスタンスを自動的に作成します。
  105. </para>
  106. <para>
  107. 以下の例は、ClientAuth 認証を使用した Base サービスクラスを作成するものです。
  108. </para>
  109. <programlisting role="php"><![CDATA[
  110. // ClientAuth 認証用のパラメータ
  111. $service = Zend_Gdata_Gbase::AUTH_SERVICE_NAME;
  112. $user = "sample.user@gmail.com";
  113. $pass = "pa$$w0rd";
  114. // 認証済み HTTP クライアントを作成します
  115. $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
  116. // Base サービスのインスタンスを作成します
  117. $service = new Zend_Gdata_Gbase($client);
  118. ]]>
  119. </programlisting>
  120. <para>AuthSub を使用した Base サービスの作成方法も同様ですが、少し冗長になります。</para>
  121. <programlisting role="php"><![CDATA[
  122. /*
  123. * 現在の URL を取得し、AuthSub サーバが認証完了後に
  124. * リダイレクトする先を取得できるようにします
  125. */
  126. function getCurrentUrl()
  127. {
  128. global $_SERVER;
  129. // php_self をフィルタリングし、セキュリティ脆弱性を避けます
  130. $php_request_uri =
  131. htmlentities(substr($_SERVER['REQUEST_URI'],
  132. 0,
  133. strcspn($_SERVER['REQUEST_URI'], "\n\r")),
  134. ENT_QUOTES);
  135. if (isset($_SERVER['HTTPS']) &&
  136. strtolower($_SERVER['HTTPS']) == 'on') {
  137. $protocol = 'https://';
  138. } else {
  139. $protocol = 'http://';
  140. }
  141. $host = $_SERVER['HTTP_HOST'];
  142. if ($_SERVER['HTTP_PORT'] != '' &&
  143. (($protocol == 'http://' && $_SERVER['HTTP_PORT'] != '80') ||
  144. ($protocol == 'https://' && $_SERVER['HTTP_PORT'] != '443'))) {
  145. $port = ':' . $_SERVER['HTTP_PORT'];
  146. } else {
  147. $port = '';
  148. }
  149. return $protocol . $host . $port . $php_request_uri;
  150. }
  151. /**
  152. * AuthSub 認証済みの HTTP を取得し、必要に応じて
  153. * AuthSub サーバにリダイレクトします
  154. */
  155. function getAuthSubHttpClient()
  156. {
  157. global $_SESSION, $_GET;
  158. // AuthSub セッションやワンタイムトークンがない場合は、
  159. // ユーザを AuthSub サーバにリダイレクトしてそれを取得させます
  160. if (!isset($_SESSION['sessionToken']) && !isset($_GET['token'])) {
  161. // AuthSub サーバに渡すパラメータ
  162. $next = getCurrentUrl();
  163. $scope = "http://www.google.com/base/feeds/items/";
  164. $secure = false;
  165. $session = true;
  166. // ユーザを AuthSub サーバにリダイレクトし、サインインさせます
  167. $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($next,
  168. $scope,
  169. $secure,
  170. $session);
  171. header("HTTP/1.0 307 Temporary redirect");
  172. header("Location: " . $authSubUrl);
  173. exit();
  174. }
  175. // AuthSub ワンタイムトークンを、必要に応じてセッションに変換します
  176. if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
  177. $_SESSION['sessionToken'] =
  178. Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
  179. }
  180. // この時点で AuthSub による認証がすんでおり、
  181. // 認証済みの HTTP クライアントのインスタンスを取得することができます
  182. // 認証済みの HTTP クライアントを作成します
  183. $client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);
  184. return $client;
  185. }
  186. // -> スクリプトの実行はここから始まります <-
  187. // http://code.google.com/apis/gdata/reference.html#Queriesthat
  188. // より、ユーザは正規のセッションを保持しています。そこで
  189. // AuthSub セッショントークンを保存します
  190. session_start();
  191. // Base サービスのインスタンスを作成し、必要に応じて
  192. // AuthSub サーバにリダイレクトします
  193. $service = new Zend_Gdata_Gbase(getAuthSubHttpClient());
  194. ]]>
  195. </programlisting>
  196. <para>最後に、snippets フィード用の未認証のサーバを作成する方法を示します。</para>
  197. <programlisting role="php"><![CDATA[
  198. // Base サービスのインスタンスを、未認証の HTTP クライアントで作成します
  199. $service = new Zend_Gdata_Gbase();
  200. ]]>
  201. </programlisting>
  202. </sect3>
  203. </sect2>
  204. <sect2 id="zend.gdata.gbase.retrieve">
  205. <title>アイテムの取得</title>
  206. <para>
  207. customer items フィードや snippets フィードに問い合わせて、
  208. アイテムを取得することができます。
  209. これは、まずクエリを送信して
  210. 返ってきたフィードを順に取得するという二段階の手順で行います。
  211. </para>
  212. <sect3 id="zend.gdata.gbase.retrieve.query">
  213. <title>構造化クエリの送信</title>
  214. <para>
  215. 構造化クエリを送信することで、あなた自身の customer items
  216. フィードや公開 snippets フィードの内容を問い合わせることができます。
  217. </para>
  218. <para>
  219. Base API でデータを取得する際には、特別な構造のクエリ URL
  220. を使用してどんなイベントがほしいのかを指定します。
  221. <classname>Zend_Gdata_Gbase_ItemQuery</classname> および
  222. <classname>Zend_Gdata_Gbase_SnippetQuery</classname>
  223. クラスのおかげで、この作業が簡単にできるようになります。
  224. パラメータを指定すると、これらのクラスがクエリ URL を作成してくれるのです。
  225. </para>
  226. <sect4 id="zend.gdata.gbase.retrieve.query.customeritems">
  227. <title>Customer Items フィードに対する問い合わせ</title>
  228. <para>
  229. customer items フィードに対するクエリを実行するには
  230. <code>newItemQuery()</code> メソッドおよび <code>getGbaseItemFeed()</code>
  231. メソッドを実行します。
  232. </para>
  233. <programlisting role="php"><![CDATA[
  234. $service = new Zend_Gdata_Gbase($client);
  235. $query = $service->newItemQuery();
  236. $query->setBq('[title:Programming]');
  237. $query->setOrderBy('modification_time');
  238. $query->setSortOrder('descending');
  239. $query->setMaxResults('5');
  240. $feed = $service->getGbaseItemFeed($query);
  241. ]]>
  242. </programlisting>
  243. <para>
  244. 使用できるパラメータの一覧は、Customer Items フィードのドキュメントにある
  245. <ulink url="http://code.google.com/apis/base/items-feed.html#QueParameters">
  246. クエリパラメータのセクション</ulink> を参照ください。
  247. </para>
  248. </sect4>
  249. <sect4 id="zend.gdata.gbase.retrieve.query.snippets">
  250. <title>Snippets フィードに対する問い合わせ</title>
  251. <para>
  252. 公開 snippets フィードに対するクエリを実行するには
  253. <code>newSnippetQuery()</code> メソッドおよび
  254. <code>getGbaseSnippetFeed()</code> メソッドを実行します。
  255. </para>
  256. <programlisting role="php"><![CDATA[
  257. $service = new Zend_Gdata_Gbase();
  258. $query = $service->newSnippetQuery();
  259. $query->setBq('[title:Programming]');
  260. $query->setOrderBy('modification_time');
  261. $query->setSortOrder('descending');
  262. $query->setMaxResults('5');
  263. $feed = $service->getGbaseSnippetFeed($query);
  264. ]]>
  265. </programlisting>
  266. <para>
  267. 使用できるパラメータの一覧は、Snippets フィードのドキュメントにある
  268. <ulink url="http://code.google.com/apis/base/snippets-feed.html#Parameters">
  269. クエリパラメータのセクション</ulink> を参照ください。
  270. </para>
  271. </sect4>
  272. </sect3>
  273. <sect3 id="zend.gdata.gbase.retrieve.iterate">
  274. <title>アイテムに対する順次処理</title>
  275. <para>
  276. Google Base のアイテムには、<code>&lt;g:main_ingredient&gt;</code>
  277. や <code>&lt;g:weight&gt;</code> といったアイテム固有の属性が含まれています。
  278. </para>
  279. <para>
  280. 指定したアイテムのすべての属性を順に処理するには、
  281. <code>getGbaseAttributes()</code> を実行してその結果を処理します。
  282. </para>
  283. <programlisting role="php"><![CDATA[
  284. foreach ($feed->entries as $entry) {
  285. // すべての属性を取得し、各属性について名前とテキスト値を表示します
  286. $baseAttributes = $entry->getGbaseAttributes();
  287. foreach ($baseAttributes as $attr) {
  288. echo "属性 " . $attr->name . " : " . $attr->text . "<br>";
  289. }
  290. }
  291. ]]>
  292. </programlisting>
  293. <para>
  294. あるいは、特定の属性の名前を指定してそれにマッチする結果を取得することもできます。
  295. </para>
  296. <programlisting role="php"><![CDATA[
  297. foreach ($feed->entries as $entry) {
  298. // すべての主原料 <g:main_ingredient> を表示します
  299. $baseAttributes = $entry->getGbaseAttribute("main_ingredient");
  300. foreach ($baseAttributes as $attr) {
  301. echo "主原料: " . $attr->text . "<br>";
  302. }
  303. }
  304. ]]>
  305. </programlisting>
  306. </sect3>
  307. </sect2>
  308. <sect2 id="zend.gdata.gbase.crud">
  309. <title>Customer Items の追加、更新、削除</title>
  310. <para>
  311. カスタマー/オーナーは、自分自身の Customer Items
  312. フィードに対する追加、更新あるいは削除を行うことができます。
  313. これらの操作は、公開 snippets フィードに対して行うことはできません。
  314. </para>
  315. <para>
  316. 実際に処理を行う前に、どのような操作が行われるのかを確かめることができます。
  317. その場合は dry-run フラグ (<code>$dryRun</code>) を <code>true</code>
  318. に設定します。期待通りの結果が得られることを確認したら、このフラグを
  319. <code>false</code> にして実際の操作を行います。
  320. </para>
  321. <sect3 id="zend.gdata.gbase.crud.insert">
  322. <title>アイテムの追加</title>
  323. <para>
  324. アイテムを追加するには、Base サービスの
  325. <code>insertGbaseItem()</code> メソッドを使用します。
  326. </para>
  327. <programlisting role="php"><![CDATA[
  328. $service = new Zend_Gdata_Gbase($client);
  329. $newEntry = $service->newItemEntry();
  330. // タイトルを追加します
  331. $title = "PHP Developer Handbook";
  332. $newEntry->title = $service->newTitle(trim($title));
  333. // コンテンツを追加します
  334. $content = "Essential handbook for PHP developers.";
  335. $newEntry->content = $service->newContent($content);
  336. $newEntry->content->type = 'text';
  337. // 製品の型を定義します
  338. $itemType = "Products";
  339. $newEntry->itemType = $itemType;
  340. // アイテム固有の属性を追加します
  341. $newEntry->addGbaseAttribute("product_type", "book", "text");
  342. $newEntry->addGbaseAttribute("price", "12.99 USD", "floatUnit");
  343. $newEntry->addGbaseAttribute("quantity", "10", "int");
  344. $newEntry->addGbaseAttribute("weight", "2.2 lbs", "numberUnit");
  345. $newEntry->addGbaseAttribute("condition", "New", "text");
  346. $newEntry->addGbaseAttribute("author", "John Doe", "text");
  347. $newEntry->addGbaseAttribute("edition", "First Edition", "text");
  348. $newEntry->addGbaseAttribute("pages", "253", "number");
  349. $newEntry->addGbaseAttribute("publisher", "My Press", "text");
  350. $newEntry->addGbaseAttribute("year", "2007", "number");
  351. $newEntry->addGbaseAttribute("payment_accepted", "Google Checkout", "text");
  352. $dryRun = true;
  353. $createdEntry = $service->insertGbaseItem($newEntry, $dryRun);
  354. ]]>
  355. </programlisting>
  356. </sect3>
  357. <sect3 id="zend.gdata.gbase.crud.modify">
  358. <title>アイテムの変更</title>
  359. <para>
  360. アイテムの各属性要素の値を変更することができます。
  361. </para>
  362. <programlisting role="php"><![CDATA[
  363. // タイトルを更新します
  364. $newTitle = "PHP Developer Handbook Second Edition";
  365. $entry->title = $service->newTitle($newTitle);
  366. // <g:price> 属性を探し、価格を更新します
  367. $baseAttributes = $entry->getGbaseAttribute("price");
  368. if (is_object($baseAttributes[0])) {
  369. $newPrice = "16.99 USD";
  370. $baseAttributes[0]->text = $newPrice;
  371. }
  372. // <g:pages> 属性を探し、ページ数を更新します
  373. $baseAttributes = $entry->getGbaseAttribute("pages");
  374. if (is_object($baseAttributes[0])) {
  375. $newPages = "278";
  376. $baseAttributes[0]->text = $newPages;
  377. // 属性の型を "number" から "int" に変更します
  378. if ($baseAttributes[0]->type == "number") {
  379. $newType = "int";
  380. $baseAttributes[0]->type = $newType;
  381. }
  382. }
  383. // <g:label> 属性を削除します
  384. $baseAttributes = $entry->getGbaseAttribute("label");
  385. foreach ($baseAttributes as $note) {
  386. $entry->removeGbaseAttribute($note);
  387. }
  388. // 新たな属性を追加します
  389. $entry->addGbaseAttribute("note", "PHP 5", "text");
  390. $entry->addGbaseAttribute("note", "Web Programming", "text");
  391. // エントリオブジェクトの save() を実行して変更内容を保存します
  392. $dryRun = true;
  393. $entry->save($dryRun);
  394. // あるいは、サービスオブジェクトの updateGbaseItem() をコールして変更を保存します
  395. // $dryRun = true;
  396. // $service->updateGbaseItem($entry, $dryRun);
  397. ]]>
  398. </programlisting>
  399. <para>
  400. 変更した後は、<classname>Zend_Gdata_Gbase_ItemEntry</classname>
  401. オブジェクトの <code>save($dryRun)</code> メソッドを実行するか
  402. <classname>Zend_Gdata_Gbase</classname> オブジェクトの
  403. <code>updateGbaseItem($entry, $dryRun)</code>
  404. メソッドをコールしてその内容を保存する必要があります。
  405. </para>
  406. </sect3>
  407. <sect3 id="zend.gdata.gbase.crud.delete">
  408. <title>アイテムの削除</title>
  409. <para>
  410. アイテムを削除するには、<code>deleteGbaseItem()</code>
  411. メソッドをコールします。
  412. </para>
  413. <programlisting role="php"><![CDATA[
  414. $dryRun = false;
  415. $service->deleteGbaseItem($entry, $dryRun);
  416. ]]>
  417. </programlisting>
  418. <para>
  419. あるいは、<classname>Zend_Gdata_Gbase_ItemEntry</classname> オブジェクトの
  420. <code>delete()</code> を実行することもできます。
  421. </para>
  422. <programlisting role="php"><![CDATA[
  423. $dryRun = false;
  424. $entry->delete($dryRun);
  425. ]]>
  426. </programlisting>
  427. </sect3>
  428. </sect2>
  429. </sect1>