SugarCRM

第6回 Beanを関連付ける


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


関連の表示

 ここまでで、関連の定義方法について説明しました。ここからは、その情報をどのように「表示」するかを説明します。

フィールドとして表示

 あるBeanが参照するBeanが1つの場合、その項目を1つのフィールドとして表示することができます。例えば、取引先担当者(Contacts)と取引先(Accounts)は、多対1の関係になります。取引先担当者から見ると、最大1つの取引先を参照していることになります。

 関連の定義で用いた例では、取引先への参照は、typeをlinkとしてaccountsフィールドで保持されています。加えて、表示用に新たなフィールドを用意して、そのタイプをrelateにすることにより、関連するBeanの情報を1つのフィールドとして表示することができます。

 そこで、取引先担当者のvardefs.phpの中で、取引先への参照を以下のようにrelate型のフィールドとして定義します。これにより、account_nameフィールドが取引先モジュールへの参照を表示するフィールドになりました。

'account_name' =>
  array (
    'name' => 'account_name',
    'rname' => 'name',
    'id_name' => 'account_id',
    'vname' => 'LBL_ACCOUNT_NAME',
    'join_name'=>'accounts',
    'type' => 'relate',
    'link' => 'accounts',
    'table' => 'accounts',
    'isnull' => 'true',
    'module' => 'Accounts',
    'dbType' => 'varchar',
    'len' => '255',
    'source' => 'non-db',
    'unified_search' => true,
  ),

 このフィールドは、詳細ビューや一覧ビューでは、基本的にはrname属性に指定された関連先モジュールのフィールドがそのレコードに対するリンク付きで表示されます。一方編集ビューでは、入力フィールドの横にボタンが表示され、そのボタンを押すと対象のモジュールのレコード選択用のポップアップが表示されます。

 ここで表示される値を変更したい場合は、そのBeanのfill_in_additional_detail_fieldsメソッド(詳細ビュー)、fill_in_additional_list_fieldsメソッド(一覧ビュー)で変更することが可能です。

サブパネル

 1対多、多対多の関連など、対象のモジュールの複数のレコードを参照するような場合は、それらのレコードを詳細ビューのフィールドを表示する領域の下に、それぞれの関連ごとにリストで表示します。この領域を「サブパネル」と呼びます。

 サブパネルは、各モジュールのmetadataディレクトリのsubpaneldefs.phpで定義されます。例えば、取引先担当者では、modules/Contacts/metadata/subpaneldefs.phpになります。

 サブパネルの情報は、「$layout_defs['モジュール名']」→「subpanel_setup項目」に配列で定義されます。配列の要素として、vardefs.phpの中で関連を保持するために定義したフィールドの名前をキーに、サブパネルの定義を記述していきます。

 以下の例は、取引先担当者に関連するリードのサブパネルの定義です。module項目にLeadsを指定しています。order項目は、詳細ビューの中で表示する順番を指定します。小さい値ほど上に表示されるようになります。subpanel_nameで対象のサブパネルのリストに表示する項目の定義情報を指定します。この場合は、Leadsモジュールに対してdefaultという名前のサブパネルを指定しているため、modules/Leads/metadata/subpanels/default.phpが読み込まれます。top_buttonsは、サブパネルの上側に表示されるボタンを指定します。

<?php
...
$layout_defs['Contacts'] = array(
  'subpanel_setup' => array(
    ...
    'leads' => array(
      'order' => 30,
      'module' => 'Leads',
      'sort_order' => 'asc',
      'sort_by' => 'last_name, first_name',
      'subpanel_name' => 'default',
      'get_subpanel_data' => 'leads',
      'add_subpanel_data' => 'lead_id',
      'title_key' => 'LBL_LEADS_SUBPANEL_TITLE',
      'top_buttons' => array(
        array('widget_class' => 'SubPanelTopCreateLeadNameButton'),
        array(
          'widget_class' => 'SubPanelTopSelectButton',
          'popup_module' => 'Opportunities',
          'mode' => 'MultiSelect',
        ),
      ),
    ),
    ...
  ),
);
?>

 以下がサブパネルのレイアウトの定義です。この定義を基にサブパネルに表示する項目やレコードを決定します。このファイルは参照先のモジュール側に置かれます。以下のソースコードは、modules/Leads/metadata/subpanels/default.phpに記述されています。

 このように、サブパネル全体の骨組みの部分に関する定義は参照元のモジュール、表示する項目などの内容に関する定義は参照先のモジュールで指定することにより、役割分担を明確にしています。

 top_buttonsでサブパネルの上側に表示するボタンを定義します。subpaneldefs.phpにも同様の定義ができ、両方に定義がある場合は、subpaneldefs.phpの設定が優先されます。whereには、ここでリストするレコードの条件を指定します。list_fieldsには、リストに表示するフィールドを定義します。

<?php
...
$subpanel_layout = array(
  'top_buttons' => array(
    array('widget_class' => 'SubPanelTopCreateButton'),
    array('widget_class' => 'SubPanelTopSelectButton',
          'popup_module' => 'Accounts'),
  ),
  'where' => '',
  'list_fields' => array(
    'first_name'=>array('usage' => 'query_only',),
    'last_name'=>array('usage' => 'query_only',),
    'name'=>array(
      'vname' => 'LBL_LIST_NAME',
      'widget_class' => 'SubPanelDetailViewLink',
      'sort_order' => 'asc',
      'sort_by' => 'last_name',
      'module' => 'Leads',
      'width' => '20%',
    ),
    'refered_by'=>array(
      'vname' => 'LBL_LIST_REFERED_BY',
      'width' => '13%',
    ),
    ...
  ),
);
?>

 これらの定義によって、参照元のモジュールの詳細ビューに関連するモジュールの情報が一覧形式で表示されます。

今回のまとめ

 2回にわたって、SugarCRMのMVCフレームワークのモデルの部分を説明しました。Beanのフィールドとデータベースフィールドとの関連付けやBean間の関連がどのように定義されているのかが見えてきたのではないでしょうか?

 ベースフレームワークに関する説明は今回までとして、次回からは周辺機能の説明に入っていきます。次回は、例えば「レコードを保存したときに追加の処理を行う」など、既存の処理に加えて、独自のロジックを追加したい場合にどのようにすればよいかを説明します。

3/3

Index
徹底解剖、SugarCRM(6)
 Beanを関連付ける
  Page 1
 関連の定義
 コラム スタジオやモジュールビルダーにおける関連の扱い
  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 記事ランキング

本日 月間