SugarCRM

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


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


カスタマイズの具体的な手順

■追加するフィールドの定義ファイルの作成

 新しく追加するフィールドの定義情報を記述したファイルを作成します。フィールドなどモデル関連の定義情報は、階層化された連想配列として$dictionary変数に格納されています。そこで、ここに新しく追加したいフィールドの情報を追加します。

 ここでは取引先担当者モジュールにフィールドを追加したいので、「$dictionary[‘Contact’][‘fields’]」の下に新しく追加したいフィールドの名前で項目を作成し、そこに新しいフィールドを定義します。ここに指定できる項目は、vardefs.phpでフィールドに設定できるものと同様です。また、$dictionary変数の下の要素はモジュール名(Contacts)ではなく、Beanのクラス名(Contact:単数形)ですので注意してください。

 ここでの記述は、vardefs.phpで構築した定義情報に新しいフィールドの情報を追加するような形式になります。

<?php
$dictionary['Contact']['fields']['count_down_birthday'] = array(
  'name' => 'count_down_birthday',
  'vname' => 'LBL_COUNT_DOWN_BIRTHDAY',
  'type' => 'int',
  'function' => array(
    'name' => 'countDownBirthday',
    'returns' => 'html',
    'include' => 'custom/CustomCode.php'
  ),
  'source' => 'nondb',
  'len' => '3',
  'comment' => 'How many days to his/her birthday?'
);
?>

 ここでは、新たに、整数型で長さが3の「count_down_birthday」というフィールドを追加しています。今回は、DBからデータを取得するのではなく、取引先担当者の誕生日(birthdate)から値を計算して表示するフィールドのため、カスタムロジックを利用します。そのため、sourceに「nondb」、functionにそのロジックを指定しています。このフィールドを表示するために、ロジックの実装ファイルとして「custom/CustomCode.php」を読み込んで、そこに定義された「countDownBirthday」という関数が呼ばれます。

 このファイルを、「custom/Extension/modules/Contacts/Ext/Vardefs」ディレクトリ以下に配置します。ここではファイル名を「CountDownBirthday.php」としていますが、このディレクトリにファイルを置けば、どのような名前のファイルでもSugarCRMに読み込まれて処理されます。そのため、ほかのカスタマイズとかち合わないような名前を付けておけばいいでしょう。

■追加するラベルの言語ファイルの作成

 上記の定義情報では、vnameとして「LBL_COUNT_DOWN_BIRTHDAY」が指定されています。この文字列をキーにして、このフィールドを表示する際のラベルを取得します。そこで、言語ごとにこのラベルに対応する文字列を定義しておきます。以下は日本語用の言語ファイルですが、必要に応じて英語などの言語ファイルも用意しましょう。

<?php
$mod_strings['LBL_COUNT_DOWN_BIRTHDAY'] = '誕生日までの日数';
?>

 このファイルを、「custom/Extension/modules/Contacts/Ext/Language」ディレクトリ以下に配置します。

 ここでファイル名は、日本語の言語ファイルであれば「ja」、英語の言語ファイルであれば「en_us」など、対応する言語の名前のプレフィックスに続いて「.」+任意の名前を付けることができます。そこで、管理のしやすさを考え、先ほどの定義情報で付けた名前とそろえればいいでしょう。ここでは、日本語用の言語ファイルとして、「ja.ContDownBirthday.php」、英語用の言語ファイルとして「en_us.ContDownBirthday.php」を用意します。

■カスタムロジックの実装

 今日から次の誕生日までの日数を計算するカスタムロジックを実装します。先ほどの「count_down_birthday」フィールドのfunction属性のname属性にcountDownBirthday、include属性にcustom/CustomCode.phpを指定しました。そこで、custom/CustomCode.phpファイルを作成し、その中にcountDownBirthday関数を作成します。

 この関数は、$focus、$field、$value、$viewの4つの引数を取ります。$focusには、対象のBeanのインスタンスが与えられます。今回は取引先担当者なので、Contactクラスのインスタンスが与えられます。$fieldには対象のフィールド名、$valueにはその値が与えられますが、今回のフィールドはデータベースから取得されるものではないので、$valueは空になります。$viewには、例えば詳細ビューであれば「DetailView」のように、現在表示中のビューのタイプが入ります。

 以下のロジックでは、いまの日付とそこから直近の誕生日を求め、その差分を日数で計算しています。また、残り日数が31日を切った場合は色を赤にして強調表示するようにしています。この関数の結果は、HTMLの断片として返されます。

<?php
function countDownBirthday($focus, $field, $value, $view) {
  if ($focus->birthdate == '') return '';

  $birthdate = explode('/', $focus->birthdate);
  $today = explode('/', date('Y/m/d'));
  $b_sec = mktime(0, 0, 0, $birthdate[1], $birthdate[2], $today[0]);
  $t_sec = mktime(0, 0, 0, $today[1], $today[2], $today[0]);
  if ($t_sec > $b_sec) {
    $b_sec = mktime(0, 0, 0, $birthdate[1], $birthdate[2], $today[0] + 1);
  }
  $diff = $b_sec - $t_sec;
  $diff_days = $diff / 86400;
  if ($diff_days < 31) {
    return '<font color=\'red\'>'.$diff_days.'</font>';
  } else {
    return $diff_days;
  }
}
?>

■再構築

 以上で、新しいフィールドを追加する準備が整いました。次に、このフィールドの情報を、再構築を行うことによりSugarCRMに反映させます。手順は以下のようになります。

  1. 管理権限を持つユーザーでログインする。
  2. 「管理」画面の「システム管理→リペア(再構築)」を呼び出す。

    画面9
    画面1 SugarCRM管理画面で「システム管理→リペア(再構築)」を呼び出す

  3. 「クイックリペア&再構築」を呼び出し、対象となるモジュールを選択し、「リペア(再構築)」ボタンを押して再構築を実行する。
画面2
画面2 「リペア(再構築)」ボタンを押して再構築を実行する

 これにより、新しいフィールドの情報がSugarCRMに取り込まれました。

■ビューへのフィールドの追加

 再構築により、新しいフィールドの情報がSugarCRMに取り込まれましたが、この状態ではどこにも表示されません。そこで、スタジオ機能を利用して、詳細ビューなどにこの新しいフィールドを追加します。スタジオ機能の利用方法に関しては、連載第2回を参照してください。

今回のまとめ

 今回は、モジュールのモデルの定義の仕方を説明し、それをカスタマイズしてみました。これによって、SugarCRMの各モジュールのフィールドがどのようにデータベースのテーブルと結び付いているかがご理解いただけたと思います。

 今回は、1つのBeanの中で収まる分野を中心に解説しましたが、次回はBean同士の関連の定義方法と、関連するBeanの表示方法について解説します。

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

本日 月間