vtigercrm や f-revocrm で、モジュール間で関連するエントリの表示について

モジュール間の関連は uitype = 10 のフィールドを作り、setRelatedModules() でモジュール間の関連を付ければよい。

vtigercrm から fork してる? coreBOS のドキュメントがとても参考になる。

How to add related lists to a module [coreBOS]

 

フィールドを通じたモジュール間の関連付け

 

例えば新規作成モジュールと顧客担当者モジュールのデータを関連付けたければ、setRelatedModules('Contacts') を実行すればよい。

以下リンク先の Set Related Module の項がそれにあたる。

Module Field — Vtiger

これで関連付けが定義され、新規作成モジュールの画面内に顧客担当者を選択するフィールドが生成される。

実際にどのデータとどのデータが紐づけられているか…という情報はテーブル vtiger_crmentityrel に格納されている。

vtiger_crmentity に格納される際に付与される crmid を使用し、新規作成モジュールの crmid = xxxxx と 顧客担当者モジュールの crmid = yyyyy が関連しますよ、といったデータが格納される。

表示時には vtiger_crmentityrel に格納されている関連付け情報を使い、関連モジュールタブの一覧画面で表示される。

ここまでが一般的な流れ。

 

一括インポートしたデータでのモジュール間の関連付け

 

ところが困ったことに、インポート機能でデータを一括インポートした際は vtiger_crmentityrel に関連付けの情報が格納されない。データ移行などの時に大変困る。

関連付けテーブル vtiger_crmentityrel の中を見ていると、顧客担当者と顧客や顧客と案件の関連付け情報が入っていない。vtiger_crmentityrel に入っていないのに関連付け表示ができている。

これは各モジュール内で、関連付け表示用の関数が別途用意されているからである。

各モジュールは CRMEntity というクラスを持つ。

CRMEntity クラスは共通の modules/Vtiger/CRMEntity.php で実装されていて、モジュールを新規作成した場合すべて modules/Vtiger/CRMEntity.php が使われる。

ただし初期から本体に付属して用意されているモジュール類は、モジュール本体の PHP 内で個別に実装されているものがある。共通部品として用意されている関数群は本体付属モジュール内では使われず各モジュール個別実装されているものがある。

新規作成モジュールは初期値では共通部品を使うため、関連データを表示する関数として標準で準備されている get_related_list() を使う。get_related_list() 関数は vtiger_crmentityrel テーブルに情報がある前提で動作するので今回の場合(インポートをした場合)困る。

よって vtiger_crmentityrel に依存しない get_related_list() のようなふるまいをする関数を作ればよい。

たとえば modules/Contscts/Contacts.php の中を見れば get_opportunities() など関連させたいモジュールの数だけ関数が用意してある。これをコピペしてそれらしい関数名に変更し、SQLをちょチョイと書き換えてやればOKである。

作成した関数を呼び出すには、setRelatedList するときの最後の引数に関数名をセットすればよい。関連付けの処理を書くのがめんどくさい!というばあいは DB の中身を直接操作すればよい。vtiger_relatedlists テーブル内のカラム name に、関連モジュールを呼び出すときに使われる関数名があるので、そこを書き換えればよい。