2010年12月15日水曜日

CodeIgniterでGoogleContactsAPIのテスト(2)

さてIBMのサイトで公開されているZendFrameworkでGoogleContactsにアクセスするサンプルをCodeIgniter上で動かすテスト本番です。

配布されているサンプルはcontacts-index.phpにて一覧表示を行ないcontacts-delete.php(削除)とcontacts-save.php(新規追加)にリンクが貼られています。削除についてはそれぞれの連絡先のIDが埋め込まれておりそのまま削除を実行し結果を表示。新規追加については入力フォームを表示し自身を呼びだしGoogleへデータ追加した後その追加されたIDを表示するという構造になっています。

これをCodeIgniterに移植するにあたって以下のような方針を立てました。

・メールアドレスとパスワードはconfig_contacts.phpを作成して登録
・GoogleDataAPIにアクセスするモデルはgdata_model.php。
このモデル内でのみGoogleDataAPIにアクセスし結果をコントローラcontactsに返す。

○作成するメソッドデータ
ページ メソッド名 URL ビュー名
一覧 index() http://localhost/test/ contacts_view
入力 add() http://localhost/test/add/ add_contacts_view
登録 post() http://localhost/test/post/
登録後は一覧表示に遷移
contacts_view
削除 delete() http://localhost/test/delete/
削除確認ダイアログを表示
削除後は一覧表示に遷移
delete_view

こんな形で実装していくことにしました。

そんなこんなでまずはindexメソッドを実装してみたいと思います。
indexメソッドではGoogleDataAPIにアクセスして一覧を取得するという動作を予定しています。
つまりはIBMサンプルの中のcontacsts-index.phpの内容をmodelに移動して動作させればいいということになりますね。まずはGmailアドレスとパスワードを保持するconfig_contacts.phpから作成しましょう。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$config['contacts_user'] = 'test.kaepapa@gmail.com';
$config['contacts_pass'] = '********';

/* End of file config_contacts.php */
/* Location: ./system/application/config/config_contacts.php */

パスワードについては*で伏せてあります。これでcontrollerやmodelそしてviewから以下の手法でアクセスすることが出来るようになります。

$this->config->load('config_contacts', TRUE);
$user = $this->config->item('contacts_user','config_contacts');
$pass = $this->config->item('contacts_pass','config_contacts');

そしてcontacs_index.phpのロジック部分をgdata_model.phpに移設しました。


<?php

class Gdata_model extends Model {

    private $user;
    private $pass;

    public function __construct() {
        parent::Model();
        // load Zend Gdata libraries
        require_once 'Zend/Loader.php';
        Zend_Loader::loadClass('Zend_Gdata');
        Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
        Zend_Loader::loadClass('Zend_Http_Client');
        Zend_Loader::loadClass('Zend_Gdata_Query');
        Zend_Loader::loadClass('Zend_Gdata_Feed');

        $this->config->load('config_contacts', TRUE);
        $this->user = $this->config->item('contacts_user','config_contacts');
        $this->pass = $this->config->item('contacts_pass','config_contacts');

    }

    public function getContactsList() {

        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/contacts/default/full');
            $query->maxResults = 0;
            $query->setParam('orderby', 'lastmodified');
            $query->setParam('sortorder', 'descending');
            $feed = $gdata->getFeed($query);

            $data['title'] = $feed->title;
            $data['totalResults'] = $feed->totalResults;

            // parse feed and extract contact information
            // into simpler objects
            $contacts = array();
            foreach($feed as $entry){
                $obj = new stdClass;
                $xml = simplexml_load_string($entry->getXML());
                $obj->edit = $entry->getEditLink()->href;
                $obj->name = (string) $entry->title;
                $obj->orgName = (string) $xml->organization->orgName;
                $obj->orgTitle = (string) $xml->organization->orgTitle;

                foreach ($xml->email as $e) {
                    $obj->emailAddress[] = (string) $e['address'];
                }

                foreach ($xml->phoneNumber as $p) {
                    $obj->phoneNumber[] = (string) $p;
                }
                foreach ($xml->website as $w) {
                    $obj->website[] = (string) $w['href'];
                }

                $contacts[] = $obj;
            }
        } catch (Exception $e) {
            die('ERROR:' . $e->getMessage());
        }
        $data['contacts'] = $contacts;
        return $data;
    }
}

/* End of file gdata_model.php */
/* Location: ./system/application/models/gdata_model.php */

コンストラクタにてZendGdataライブラリを読み込みと独自設定ファイルを読み込んでいます。それ以外のgetContactsListメソッドについてはほぼcontacts_index.phpをそのまま利用している状況です。

続いてはcontrollerであるcontacts.phpを作成しました。

<?php

class Contacts extends Controller {

 public function __construct(){
  parent::Controller();
  $this->load->model('gdata_model');
 }

 public function index(){
  $data = $this->gdata_model->getContactsList();
  $this->load->view('contacts-index', $data);
 }
}

/* End of file contacts.php */
/* Location: ./system/application/controllers/contacts.php */

コンストラクタで先程作成したmodelをロードしています。そしてデフォルトメソッドでcontactsの一覧配列を取得してviewに渡しています。

続いてcontacts-index.phpの内容を見てみます。

<!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="ja" lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Listing contacts</title>
<style>
 body {
  font-family: Verdana;
 }
 div.name {
  color: red;
  text-decoration: none;
  font-weight: bolder;
 }
 div.entry {
  display: inline;
  float: left;
  width: 450px;
  height: 150px;
  border: 2px solid;
  margin: 10px;
  padding: 5px;
 }
 td {
  vertical-align: top;
 }
 span.links {
  float: right;
 }
</style>
</head>
<body>
 <h2>Contacts</h2>
 <h2><?php echo $title ?></h2>
 <div>
 <?php echo $totalResults ?> contact(s) found.
 </div>
 <div>
  <a href="contacts/add">Add a new contact</a>
 </div>

 <?php
 // display results
 foreach ($contacts as $r) {
 ?>
 <div class="entry">
  <div class="name"><?php echo (!empty($r->name)) ? $r->name : 'Name not available'; ?>
  <span class="links"><a href="contacts-delete.php?id=<?php echo $r->edit; ?>">Delete</a></span>
  </div>
  <div class="data">
  <table>
   <tr>
   <td>Organization:</td>
   <td><?php echo $r->orgName; ?></td>
   </tr>
   <tr>
   <td>Email:</td>
   <td><?php echo @join(', ', $r->emailAddress); ?></td>
   </tr>
   <tr>
   <td>Phone:</td>
   <td><?php echo @join(', ', $r->phoneNumber); ?></td>
   </tr>
   <tr>
   <td>Web:</td>
   <td><?php echo @join(', ', $r->website); ?></td>
   </tr>
  </table>
  </div>
 </div>
 <?php
 }
 ?>
</body>
</html>

サンプルからphpコードをごっそりと抜いて一部変数名が変更になっているくらいで済んでしまいました。

これでばっちりと当初と同様連絡先一覧の取得が出来ていますのでCI化が進んでいるといった感じでしょうか。すんなりと進んだように書いてあいますがもちろんいろいろとハマりまくっての結果です。どうも私はまだPHP自体を理解できていないようで変数が空になっていてエラーを乱発してしまったのは内緒です。(汗

0 件のコメント:

コメントを投稿