PHP5 サイボウズガルーン3API ラッパーインターフェース(仮)

一部社内利用と、筆者が趣味で作成中の「サイボウズガルーン3 用 PHP5インターフェースクラス」を試験公開します。
が、まだデバッグ中であり、マニュアルもな〜んにもありません(笑)。よって一部動かないメソッドとか多数残っています。
それでもよければ、持って行ってください。

ダウンロード
(2014/07/25追記: うはwwwバグってました。日本語文字コード周りが以前のものはまるで駄目だったので書き換えました)

以下、初期設定と簡単な使用例を記します。

前提条件

インストールと初期設定


プログラム例

例1. ユーザ[ユーザ名]に割り当てられているアドレス帳のタイトル一覧取得
<?php
    require("CybozuGaroonAPI.php");
    
    $api = new CybozuGaroonAPI();
    $api->setUser("ユーザ名", "パスワード");           // ログインユーザの指定
    $shared_books = $api->AddressGetReadAllowBooks();  // 権限の有るアドレス帳のID一覧を取得する
    $book_list[-1] = "個人アドレス帳";
    if (is_array($shared_books)) {
        foreach ($shared_books as $book_id) {
            $book = $api->AddressGetSharedBooksById($book_id);
            $book_list[$book_id] = $book->name;        // アドレス帳のブック名を取得する
        }
    }
    var_dump($book_list);
?>
例2.ユーザの追加
<?php
    require("CybozuGaroonAPI.php");
    
    $client = new CybozuGaroonAPI();
    // $client->setUser("Administrator", "password");    // 管理者ID/passをCbgrnSoapAPI_inc.phpで定義していれば必要ない
    try {
        $user_info = new CbgrnUserInfoType();            // 追加するユーザのユーザ情報を格納するクラス
        $user_info->primary_group = 6;
        $user_info->sort_key = "テストユーザ";
        $user_info->email_address = "foo@bar.com";
        $user_info->description = "ユーザのメモ";
        $user_info->post = "課長";
        $user_info->telephone_number = "000-000-0000";
        $user_info->url = "http://www.bar.com";
        $user_info->locale = 3;
        $user_info->base = 3;
        $user_info->organization = 6;
                                            // ログインID, 表示名,   パスワード, ユーザ情報
        $result = $client->AdminAddUserAccount("text", "テストユーザ", "test", $user_info);
        var_dump($result);
    } catch (SoapFault $e) {  // エラーが発生した時の例外処理
        echo "[" . $e->faultcode . "]" . $e->getMessage() . "\n";
        echo "Request:\n" . $client->__getLastRequest() . "\n";
    }
?>

今後の課題

開発中の気付き

WSDLファイルの問題

サイボウズガルーンにおけるAPIは、wsdlファイルに関して、あまり関心を払っていないようです。 そのため、上記のbase.wsdlがパースエラーになったり、プログラム応答のxmlと、WSDLが不一致であったり します。具体的には、

xml名前空間修飾子があると動かない

おそらくガルーンAPIに挑戦した方の多くがこれにハマると思います。 例えば、
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
              xmlns:ns1="http://wsdl.cybozu.co.jp/schedule/2008"
              xmlns:ns2="http://schemas.cybozu.co.jp/schedule/2008"
              xmlns:ns3="dummyNameSpace">
      :<中略>
<ns1:ScheduleAddEvents>
<parameters>
    <schedule_event id="dummy" event_type="normal" version="dummy" public_type="public" detail="title" description="description">
        <ns2:members>
            <ns2:member>
                <ns2:user id="6"/>
            </ns2:member>
            <ns2:member>
                <ns2:facility id="6" order="2"/>
            </ns2:member>
        </ns2:members>
        <ns2:when>
            <ns2:datetime start="2013-07-12T23:30:00+00:00" end="2013-07-13T01:00:00+00:00"/>
        </ns2:when>
    </schedule_event>
</parameters>
</ns1:ScheduleAddEvents>
のようにリクエストxmlを書くと(PHP-SOAPはこんな出力になる)、xml上では正しい(はず)のですが、 サイボウズガルーンAPIは読み取ってくれません。 何が原因かというと、ns2:という名前空間識別子があるとそれを正しく認識できないようです。
(なぜか、この例の ns1: はOKなんですけどね)

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
              xmlns:ns1="http://wsdl.cybozu.co.jp/schedule/2008"
              xmlns:ns2="http://schemas.cybozu.co.jp/schedule/2008"
              xmlns:ns3="dummyNameSpace">
      :<中略>
<ns1:ScheduleAddEvents>
<parameters>
    <schedule_event id="dummy" event_type="normal" version="dummy" public_type="public" detail="title" description="description">
        <members>
            <member>
                <user id="6"/>
            </member>
            <member>
                <facility id="6" order="2"/>
            </member>
        </members>
        <when>
            <datetime start="2013-07-12T23:30:00+00:00" end="2013-07-13T01:00:00+00:00"/>
        </when>
    </schedule_event>
</ns1:ScheduleAddEvents>
</parameters>
このように ns2: を飛ばしてxmlを生成し、SOAPサーバーにリクエストを投げると答えが返ってきます。
おそらく2段目以降のxmlメンバを名前空間付きでパースしてないんじゃないかと思われます。
このライブラリでは仕方ないので、__doRequest()でリクエストxmlを無理やり ns2: → space と書き換えて リクエストを通しています。
(必ずns2:という名前空間になるとは限らないので、かなり危険な実装です)
また、同様の問題が、SOAPヘッダ部にもあって、やっぱり<Username>とかに名前空間がつくとダメっぽいです。 こちらは、生でSOAPヘッダを生成することで、回避しました。

マニュアルの誤記大杉

APIマニュアルが公開されていますが、少なくとも私が印刷した では、かなりの数の誤記が有ります。すぐに分かるものは良いのですが、かなり悩んだものが有りました。 直して欲しいところです。


なお、このページで公開するソフトウェア並びに文章は、当社の業務とは関係なく作成したものであり、 当社並びに筆者はなんら責任を負いません。利用は各自自己責任でおねがいします。
自由に使って頂いて結構ですが、著作権は放棄しません。また、再配布もご遠慮願います。
デバッグ中ということも有り、仕様は予告なく変更します。特にメソッドの引数は多分変わっていきます
問い合わせ等は、基本的に受け付けておりません。が、筆者が興味をもった内容については、 ご回答する場合がございます。それでもよければ、
webmaster@hokoku-kogyo.co.jp (@を@に変えてね)
まで、メール下さいm(_ _)m
「動いたぜ〜」とかいうメールは作者の励みになります。ご返事は出来兼ねますが、喜んで受け付けます(笑)
「うちで働けゴルァヽ(`Д´)ノ」ご相談に応じる用意は有ります。が、別チャンネルでw