2010年12月25日土曜日

CodeIgniterでGoogleContactsAPIのテスト(6)

時間がかかると云ってた割にはすぐに更新がきました。もっと苦労するかと思っていましたがすんなりと実装することが出来ました。ん?すんなり?嘘です。思いきりどハマりしたところが何箇所かありましたねぇ。

ということで今回はGoogleContactsのグループデータの取得、登録、更新そして削除についてまとめてご紹介します。

まずは一覧の取得方法です。

try {
 // perform login and set protocol version to 3.0
 $client = Zend_Gdata_ClientLogin::getHttpClient($this->user, $this->pass, 'cp');
 $gdata = new Zend_Gdata($client);
 $gdata->setMajorProtocolVersion(3);

 // perform query and get feed of all results
 $query = new Zend_Gdata_Query('http://www.google.com/m8/feeds/groups/default/full');
 $query->maxResults = 0;
 $query->setParam('orderby', 'lastmodified');
 $query->setParam('sortorder', 'descending');
 $feed = $gdata->getFeed($query);

 $data['title'] = (string)$feed->id;
 $data['totalResults'] = (String)$feed->totalResults;

 // parse feed and extract contact information
 // into simpler objects
 $groups = array();
 foreach($feed as $entry){
  $obj = new stdClass;
  $xml = simplexml_load_string($entry->getXML());
  if (! isset($xml->systemGroup)) {
   $obj->edit = (string)$entry->getEditLink()->href;
   $obj->group_name = (string) $entry->title;
  } else {
   $obj->edit = 'system_group';
   $val = $this->config->item('system_groups','config_contacts');
   $obj->group_name = $val[(string)$xml->systemGroup['id']];
  }
  $groups[] = $obj;
 }

} catch (Exception $e) {
 die('ERROR:' . $e->getMessage());
}

$data['groups'] = $groups;

return $data;

contactの時と何が違うかというと宛先URLが変っただけですね。グループデータの取得についてはhttp://www.google.com/m8/feeds/groups/default/fullこちらからの取得になります。それ以降はcontactsの時と同じ処理ですのでおわかり頂けるかと思います。

続いては登録部分です。

try {
 // perform login and set protocol version to 3.0
 $client = Zend_Gdata_ClientLogin::getHttpClient($this->user, $this->pass, 'cp');
 $gdata = new Zend_Gdata($client);
 $gdata->setMajorProtocolVersion(3);

 // create new entry
 $doc = new DOMDocument();
 $doc->formatOutput = true;
 $entry = $doc->createElement('atom:entry');
 $entry->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:atom', 'http://www.w3.org/2005/Atom');
 $entry->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:gd', 'http://schemas.google.com/g/2005');
 $doc->appendChild($entry);

 // add category element
 $category = $doc->createElement('atom:category');
 $category->setAttribute('scheme', 'http://schemas.google.com/g/2005#kind');
 $category->setAttribute('term','http://schemas.google.com/contact/2008#group');
 $entry->appendChild($category);

 // add title element
 $title = $doc->createElement('atom:title', $this->input->post('group_name', TRUE));
 $title->setAttribute('type', 'text');
 $entry->appendChild($title);

 $entryResult = $gdata->insertEntry( $doc->saveXML(), 'https://www.google.com/m8/feeds/groups/default/full');

} catch (Exception $e) {
 die('ERROR:' . $e->getMessage());
}

return $entryResult->id;

登録もputするURLがgroups用になっているだけでそれ以外には項目がグループの方がかなり少ないといったところでしょうか。本来「gd:extendedProperty」という項目にグループの情報を登録することが出来るのですが登録自体は成功するもののデータ更新時にこのinfoデータをxmlから取得するのが上手くいかず登録から断念することになりました。取得した$feedの中に改行が入ってしまっていたりしたのでなにかバグがあるのかも?
作成するxmlはデベロッパーガイドを参考にして作成しています。

続いては削除です。

try {
 // perform login and set protocol version to 3.0
 $client = Zend_Gdata_ClientLogin::getHttpClient($this->user, $this->pass, 'cp');
 // set GData delete headers
 $client->setHeaders('If-Match: *');
 $gdata = new Zend_Gdata($client);
 $gdata->setMajorProtocolVersion(3);

 // delete entry
 $gdata->delete($this->input->post('edit',TRUE));
} catch (Exception $e) {
 die('ERROR:' . $e->getMessage());
}

削除もcontactsと同様editタグに指定されているキーを送ってあげることで簡単に削除が出来ます。今回もIf-Match:*を指定して簡単に削除を行なっています。

最後に更新です。

try {
 // perform login and set protocol version to 3.0
 $client = Zend_Gdata_ClientLogin::getHttpClient($this->user, $this->pass, 'cp');
 $client->setHeaders('If-Match: *');
 $gdata = new Zend_Gdata($client);
 $gdata->setMajorProtocolVersion(3);

 $query = new Zend_Gdata_Query($this->input->post('edit'));
 $entry = $gdata->getEntry($query);
 $xml = simplexml_load_string($entry->getXML());

 $xml->title = $this->input->post('group_name');

 $entryResult = $gdata->updateEntry($xml->saveXML(), $entry->getEditLink()->href);

} catch (Exception $e) {
 die('ERROR:' . $e->getMessage());
}

return $entryResult->id;

更新も項目が少ないのでとても短かなソースになっています。editデータを送りqueryを実行、取得したxmlデータの中でtitleタグに新しいグループ名を代入してZendFrameworkのupdateEntryコマンドで送信して完了です。

contactsの方で苦労したせいかgroupデータについてはわりと簡単に実装することが出来ました。えっ?ハマったところ?データをjavascriptでいじる部分でハマっただけです。(笑

0 件のコメント:

コメントを投稿