SugarCRM

最終回 クラウドコネクタで外部サービスのデータを取り込む


河村 嘉之
オープンソースCRM株式会社
2009/8/5


コネクタ実装ファイルの作成

 次にコネクタ実装ファイルを作成します。クラウドコネクタでは、この実装クラスのベースとなるクラスを提供しています。

 ベースクラスには、REST形式で提供されているサービスへアクセスする「ext_restクラス」とSOAP形式で提供されているサービスへアクセスする「ext_soapクラス」があります。ここでは、REST形式のサービスにアクセスするので、ext_restクラスを継承したクラスを作成します。このクラス名は、ext_rest_zipcodeとなります。この名前は配置したディレクトリ(この例ではext/rest/zipcode)を基に決定します。

 このクラスでは、検索条件を指定してサービスからデータの一覧を取得する「getListメソッド」、キーを指定してサービスから1件のデータを取得する「getItemメソッド」を実装します。getListメソッドの第1引数にはコネクタの検索条件に入力された値が配列として渡されて、戻り値はデータの配列になります。データは、vardefs.phpの中で指定したフィールドをキーとして持つ配列です。getItemメソッドの第1引数にはid属性にデータを特定する値が格納された配列が渡されて、戻り値は1件のデータになります。

 コンストラクタでは、親クラスのコンストラクタの呼び出しに加えて、「_enable_in_wizard」と「_enable_in_hover」の2つの変数を設定しています。「_enable_in_wizard」は、コネクタが「データを取得」ウィザードで利用可能かを指定するものですが、「データを取得」ウィザードはSugar Community Editionでは利用できません。「_enable_in_hover」は、指定したフィールドの上にマウスを置いた場合、コネクタから取得した値を表示するかどうかを指定するものです。どちらもbooleanで指定し、trueを指定した場合は、それらの機能が有効になります。

<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
require_once('include/connectors/sources/ext/rest/rest.php');
class ext_rest_zipcode extends ext_rest {
         public function __construct(){
                  parent::__construct();
                  $this->_enable_in_wizard = true;
                  $this->_enable_in_hover = true;
         }

         public function getItem($args=array(), $module=null){
                  $zipcode = $args['id'];
                  $properties = $this->getProperties();
                  $url = $properties['service_url'] . '/' . $zipcode . '.json';
                  $data = json_decode($this->fetchUrl($url));
                  $address = array();
                  $address['zipcode'] = $data->zipcode;
                  $address['prefecture'] = $data->address->prefecture;
                  $address['city'] = $data->address->city;
                  $address['town'] = $data->address->town;
                  return $address;
         }
         public function getList($args=array(), $module=null){
                  $zipcode = $args['zipcode'];
                  $properties = $this->getProperties();
                  $url = $properties['service_url'] . '/search?q=' . $zipcode . '&type=json';
                  $data = json_decode($this->fetchUrl($url));
                  $result = array();
                  foreach ($data->result as $entry) {
                           $url = $entry->link . '.json';
                           $d = json_decode($this->fetchUrl($url));
                           $address = array();
                           $address['id'] = $d->zipcode;
                           $address['zipcode'] = $d->zipcode;
                           $address['prefecture'] = $d->address->prefecture;
                           $address['city'] = $d->address->city;
                           $address['town'] = $d->address->town;
                           $result[] = $address;
                  }
                  return $result;
         }

         public function __destruct(){
                  parent::__destruct();
         }
}
?>

 言語ファイルには、以下のようにvardefs.phpで指定したフィールドに対するラベルと設定画面の入力フィールドのラベルを設定します。

<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
$connector_strings = array (
         'LBL_ID' => 'ID',
         …
         'service_url' => 'URL',
);
?>

 formatters以下のディレクトリには、フォーマット実装ファイルとともに表示用のテンプレートやアイコンなどを配置します。ここでは、コネクタに対応するフィールドの横に表示されるアイコンにマウスを合わせたときにポップアップを表示するようにします。

 ポップアップを生成するコードを以下に記述します。このクラスのファイルは、formatters/ext/rest/[コネクタ名]/[コネクタ名].phpになります。クラウドコネクタでは、ポップアップ表示用のベースクラスとして「default_formatter」を用意しています。ここでは、このクラスを継承してポップアップ用のクラスを作成します。このクラスのgetDetailViewFormatメソッドでマウスを合わせたときに表示される内容を作成し、getIconFilePathメソッドでコネクタに対応するフィールドに表示されるアイコンのファイルへのパスを指定します。

 getDetailViewFormatメソッドの中で、表示される内容を生成する際に直接HTMLの内部を生成してもいいのですが、表示部分に関しては、テンプレートに分けてしまった方がコードの可読性が上がります。そこでこのコードでは、テンプレートを利用して表示の内容を生成しています。ここで読み込まれるテンプレートは、formatters/ext/rest/[コネクタ名]/tpls/default.tlpになります。

<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
require_once('include/connectors/formatters/default/formatter.php');
require_once('include/connectors/sources/SourceFactory.php');
class ext_rest_zipcode_formatter extends default_formatter {
  public function getDetailViewFormat() {
    $mapping = $this->getSourceMapping();
    $mapping_name = $mapping['beans'][$this->_module]['zipcode'];
    if(!empty($mapping_name)) {
      $this->_ss->assign('mapping_name', $mapping_name);
      return $this->fetchSmarty();
    }
    return '';
  }
  public function getIconFilePath() {
    return 'custom/modules/Connectors/connectors/formatters/ext/rest/zipcode/zipcode.png';
  }
}
?>

 ここで、テンプレートの中身を見てみましょう。このテンプレートでは、表示用のHTMLコードの一部と、JavaScriptのコードを記述します。JavaScriptには、コネクタのアイコンにマウスを合わせた際に呼び出される関数を定義します。

 この関数の名前は、コネクタの名前に従って決定します。例えば、コネクタのコードがformattersディレクトリ以下のext/rest/zipcode以下に配置されている場合は、show_ext_rest_zipcodeという名前になります。この関数では、SugarCRMのサーバにアクセスし、クラウドコネクタを経由して外部のサービスから取得したデータを非同期に取得し、その結果をダイアログに表示する処理を記述しています。

<div style="visibility:hidden;" id="ext_rest_zipcode_popup_div"></div>
<script type="text/javascript">
function show_ext_rest_zipcode(event)
{literal}
{
  var callback = {
    success: function(data) {
      eval('result = ' + data.responseText);
      if(typeof result != 'Undefined') {
        output = '<p>';
        count = 0;
        for(var i in result) {
          output += '<b>' + result[i]['zipcode'] + ': </b>' + result[i]['prefecture'] +
            result[i]['city'] + result[i]['town'] + '<br>';
          count++;
        }
        output += '</p>';
{/literal}
        cd = new CompanyDetailsDialog("{{$source}}_popup_div",
          output, event.clientX, event.clientY);
{literal}
        cd.setHeader("郵便番号検索: " + count + "件見つかりました");
        cd.display();
      } else {
        alert("Unable to retrieve information for record");
      }
    },
  }
{/literal}
  url =
'index.php?module=Connectors&action=RetrieveAddress&source_id={{$source}}&module_id={{$module}}&zipcode={$fields.{{$mapping_name}}.value}&to_pdf=1';
var cObj = YAHOO.util.Connect.asyncRequest('POST', url, callback);
{literal}
}
{/literal}
</script>

 また、このJavaScriptコードからSugarCRMにアクセスして、データを取得する際に呼び出されるアクションを作成します。上記JavaScriptでは、ConnectorsモジュールのRetrieveAddressアクションとして呼び出していましたので、以下のコードをcustom/modules/Connectors/RetrieveAddress.phpとして配置しておきます。このコードでは、クラウドコネクタを取得し、そのgetListメソッドを呼び出して、外部サービスからデータを取得し、その結果をJSONで返しています。

<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');

require_once('include/connectors/sources/SourceFactory.php');
$source_id = $_REQUEST['source_id'];
$zipcode = $_REQUEST['zipcode'];
$module = $_REQUEST['module_id'];
$source = SourceFactory::getSource($source_id);
$arg = array();
$arg['zipcode'] = $zipcode;
echo json_encode($source->getList($arg, $module));
?>

結びに代えて

 今回は、クラウドコネクタを利用して外部のサービスからデータを取得し、それをSugarCRMで利用する方法を説明しました。クラウドコネクタを利用することにより、SugarCRMのフィールドの上に外部のサービスから取得したデータを重ねて表示するといったことが可能になります。

 クラウドコネクタは、SugarCRM 5.2から導入された新しい機能です。そのため現時点ではまだ、マウスを合わせた際に取得したデータを表示する処理やJavaScriptからデータを取得するために呼び出すアクションなどで、多くのコードを記述しなければいけません。今後のバージョンではこのあたりの処理をもっと簡単に記述できるよう、フレームワークが進化することに期待したいと思います。

 今回で本連載は最後になりますが、オープンソースで提供されているCRMアプリケーションSugarCRMの最大の特徴であるカスタマイズのしやすさをご理解いただけたのではないかと思います。今後もぜひSugarCRMを活用してください。

2/2
 

Index
徹底解剖、SugarCRM(最終回)
 クラウドコネクタで外部サービスのデータを取り込む
  Page 1
 クラウドコネクタの機能
 クラウドコネクタの設定
 オリジナルクラウドコネクタの作成
 コネクタを構成するファイルの内容
  Page 2
 コネクタ実装ファイルの作成
 結びに代えて

Linux Square全記事インデックス


 Linux Squareフォーラム 仮想化技術関連記事
連載:実践! Xenで実現するサーバ統合
有力な仮想化技術として注目を集めるようになった「Xen」。このXenを活用してサーバ統合を実践していく手順を具体的に紹介します
特集:サーバの仮想化技術とビジネス展開の可能性
jailからUML/VMwareまで
1台のマシンで複数のサーバを動かす「仮想化技術」。VMwareやUMLの登場により、WebサイトだけでなくOS自体を仮想化できるようになった
特集:仮想化技術のアプローチと実装
VMwareから要注目技術Xenまで

1台のサーバで複数の仮想マシンを実行する仮想化技術は、空間コストを引き下げる可能性を持つ。最新の仮想化技術を概観してみよう
特集:仮想OS「User Mode Linux」活用法
技術解説からカーネルカスタマイズまで
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
特集:仮想化技術の大本命「Xen」を使ってみよう
インストール & Debian環境構築編

高いパフォーマンスで本命の1つとなった仮想マシンモニタ「Xen」。日本語による情報が少ないXenを、実際に動かしてみよう
特集:仮想化技術の大本命「Xen」を使ってみよう
Xen対応カスタムカーネル構築編

Xen環境およびその上で動作する仮想マシン用カーネルを自分で構築しよう。これにより、自由にカスタマイズしたカーネルを利用できる
特集:IPv6、UML、セキュリティ機能の統合
全貌を現したLinuxカーネル2.6[第4章]

今回は、これまでに紹介し切れなかった機能を一気に紹介する。これを読めば、カーネル2.6の正式リリースが楽しみになるだろう
Linux Squareプロダクトレビュー VMware Workstation 4
PC/AT互換機エミュレータとして不動の地位を築いたVMware。その新バージョンがリリースされた。新機能を早速試してみよう
古くて新しい「サーバ仮想化技術」の行方
サーバ仮想化を実現するための技術がソフトウェア、ハードウェアの両面で出そろってきた。ハイパーバイザーのさらなる高速化に向けた動きを紹介する
Linux Squareフォーラム全記事インデックス


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間