SugarCRM

第5回 モデルの定義をカスタマイズしてみよう


オープンソースのSFA/CRMアプリケーション「SugarCRM」は、利用者に合わせてカスタマイズを加えていくことで、より真価を発揮することができます。この連載では、ソースコードの内容を把握した上でさまざまなカスタマイズを加えていくまでを紹介します(編集部)

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


 本連載の第3回「ソースコードを読む前に知っておきたい基本動作」では、SugarCRMの基本動作について説明しました。SugarCRMでは、バージョン5.0からMVCパターンに基づいてアプリケーションが設計されています。そのため、アプリケーションは、表示を担当する「ビュー」、データとロジックを担当する「モデル」、それらをコントロールする「コントローラ」に分離されて構成されています。

 前回は、ビューの部分にフォーカスして、どのように表示する画面が生成されるか、そしてそれをカスタマイズするためにはどうすればよいかなどを説明しました。今回はモデルの部分にフォーカスして、データベースの項目とSugarCRM上のフィールドをどのように関連付けるかを説明したいと思います。

モデルを担当する「Bean」

 SugarCRMでモデルを担当するのは、SugarBeanと呼ばれるクラスを継承したクラスです。これらのクラスをここでは「Bean」と呼びます。

 Beanは、データベースからデータを取得したり、アプリケーションで行った変更をデータベースに反映させたりする処理を担当します。このような処理は多くのモジュールで共通ですので、Beanの親クラス(SugarBean)にまとめて定義されています。SugarBeanのソースコードは、data/SugarBean.phpです。

 一方、個々のモジュールに特化した処理は、それぞれのモジュールごとにSugarBeanを継承したBeanクラスで実装します。このクラスの名前は、通常モジュール名を単数形にしたもので、この実装ファイルは、モジュールのディレクトリに「クラス名.php」という名前で置かれます。例えば取引先担当者(Contacts)モジュールであればクラス名はContactになり、この実装ファイルはmodules/Contacts/Contact.phpになります。

 Beanのインスタンスは、MVCパターンのコントローラを担当するSugarControllerによって作成され、そこから必要に応じてメソッドが呼び出されます。また、ビューのコンポーネントであるSugarViewが必要なデータを取得する際にもこのBeanを利用します。このあたりの詳しい挙動は本連載の第3回を参照してください。

Beanのフィールドとデータベースの関連付け

 Beanのソースコードを見ても、このクラスのフィールドとデータベースのカラムをどのように関連付けるかは定義されていません。そして、このような定義情報がソースコード中にロジックとともに混在してしまうのも、あまり管理しやすいものではありません。

 そこでSugarCRMでは、このような定義情報を別のファイルとして切り出しています。この定義ファイルは「vardefs.php」という名前で、各モジュールのディレクトリに置かれています。例えば、取引先担当者モジュールではmodules/Contacts/vardefs.phpがそのファイルになります。

 ここからこのvardefs.phpの内容を見ていきましょう。最初に主要な部分を抜粋し、解説します。

<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
...
$dictionary['Contact'] = array(
 'table' => 'contacts',
 'audited'=>true,
 'unified_search' => true,
 'duplicate_merge'=>true,
 'fields' => array (
 ...
 ),
 'indices' => array (
 ...
 ),
 'relationships' => array (
 ...
 ),
 'optimistic_locking'=>true,
);
require_once('include/SugarObjects/VardefManager.php');
VardefManager::createVardef(
 'Contacts', 'Contact', array('default', 'assignable', 'person')
);
?>

 この定義情報は、$dictionary変数で保持されている配列にBeanのクラス名をキーにして格納されます。この定義情報には、以下のような項目が定義されています。

項目名 説明
table
格納先のデータベーステーブル名
audited
このモジュールを監査対象とするかどうか
unified_search
このモジュールを統合サーチの対象とするかどうか
duplicate_merge
このモジュールで重複のマージを行うかどうか
fields
このモジュールとデータベースフィールドの関連付けの定義
indices
データベースに作成するインデックス
relationships
ほかのモジュールへの関連付けの定義
optimistic_locking
楽観的ロック機能を有効にするかどうか
表1 定義情報で定義されている項目

■定義情報の共通化

 この定義ファイルのfields項目を見てみると、そのモデルクラスが持つすべてのフィールドが定義されてはいません。例えば、取引先担当者では、当然ながら姓(last_name)や名(first_name)があるはずですが、このファイルにはありません。これらのフィールドはどこで定義されているのでしょう? その答えは、この定義ファイルの末尾に書かれている以下のコードにあります。

require_once('include/SugarObjects/VardefManager.php');
VardefManager::createVardef(
 'Contacts', 'Contact', array('default', 'assignable', 'person')
);

 このコードでは、VardefManager::createVardefメソッドを呼び出していますが、ここに「person」を指定することによって「担当者(person)」が持つフィールド情報が取り込まれます。このように、多くのモジュールに共通する基本的な定義情報をいくつかのタイプにまとめることにより、個々のモジュールで毎回定義する必要がなくなるため、効率よく開発を進めることができます。Sugar Community Edition 5.0では、以下の4つのタイプが利用できます。

タイプ 説明
ベーシック(basic)
ID、作成者、作成日時、変更者、変更日時などの基本フィールドのみを持つ
会社情報(company)
ベーシックに加えて、所在地、業種、Webサイトなどの会社に関連するフィールドを持つ
ケース(issue)
ベーシックに加えて、対応状況、優先度、解決方法などの問題点に関連するフィールドを持つ
担当者(person)
ベーシックに加えて、姓、名、部署、職位などの人に関連するフィールドを持つ
※Sugar Community Edition 5.1では上記に加えて、商談(sales)、ファイル(file)が追加されました
表2 Sugar Community Editionに用意されている4つのタイプ

 連載の2回目でモジュールビルダーを利用して新しいモジュールを作成した際に、UI上でタイプを指定しましたが、実は、その際に選択したタイプは上記の表のタイプと同じものです。このようなタイプをSugarCRMでは「SugarObjects」と呼びます。

 SugarObjectsのソースコードはincludes/SugarObjects以下にあり、それぞれのタイプは、そこのtemplatesディレクトリ以下のタイプ名に対応した名前のディレクトリで定義されています。各タイプでどのようなフィールドが定義されているかを確かめたい場合は、そのタイプのディレクトリにあるvardefs.phpを参照してください。

第4回へ
1/3

Index
徹底解剖、SugarCRM(5)
 モデルの定義をカスタマイズしてみよう
Page 1
 モデルを担当する「Bean」
 Beanのフィールドとデータベースの関連付け
  Page 2
 画面を定義する「メタデータアーキテクチャ」
 モデルのカスタマイズ
  Page 3
 カスタマイズの具体的な手順
 今回のまとめ

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 記事ランキング

本日 月間