エンジニアリングチームの川合(@Ricckn)です。
新年あけましておめでとうございます。
今年も週1回を目指してエンジニアリングBlogを更新していく予定ですので、よろしくおねがいします。
私事ではありますが、2019年末、某IKEAのサメを買いました。
関連を表現する
F-RevoCRMには他のモジュールの項目を、別のモジュールのフィールドとして保存する「関連項目」というものがあります。
例えば「顧客担当者」モジュールに存在する「顧客企業」フィールドが上記に当たりますね。
顧客企業モジュールには、予め関連メニューに顧客担当者と表示されていますので、詳細画面の右側から、その顧客企業に関係する顧客担当者の一覧を表示することが可能です。
では独自で作成したモジュールの場合はどのように追加すればよいのでしょうか。
関連メニューの実装について
F-RevoCRMの関連メニューの表示は、大きく2通りの実装があります。
- 既存の
get_related_list
関数を呼び、vtiger_crmentityrel
テーブルの情報から一覧を取得する - 独自SQLを記述して、カスタマイズされた一覧を取得する
F-RevoCRMの主要モジュールでは様々な関係性を関連メニューの一覧で表現する為に、かなりの部分が独自のSQLを発行し、生成しています。
この独自SQLの部分をある程度汎用化し、「関連項目」に自身のレコードを選択しているもののリストを出力する関数、get_fieldrelated_list
というものを、F-RevoCRMでは用意していますので、そちらをご紹介します。
関連メニューの追加方法
まずはモジュールに関連メニューを追加する方法についてです。
以下のコードを実行することで、特定のモジュールに対して、関連モジュールを追加することが可能です。
$module = Vtiger_Module::getInstance('Accounts');
$relationModuleLabel = 'Cars';
$relationModule = Vtiger_Module::getInstance($relationModuleLabel);
$module->setRelatedList($relationModule, $relationModuleLabel, array('add', 'select'), 'get_related_list');
こちらは顧客企業の関連メニューに、車モジュールを表示する例です。
重要なのはここで呼び出す「関数名」の部分となります。
この関数名はmodules/{MODULENAME}/{MODULENAME}.php
に記述されている関数、もしくはその継承元にある関数、例えばdata/CRMEntity.php
に記述されている関数を呼び出します。
多くの独自関数は前者のファイルに書かれているので、挙動の詳細を知りたい場合はこちらを参照してください。
get_fieldrelated_listの追加方法
すでにF-RevoCRMに埋め込まれていますので、先程の登録スクリプトの関数部分だけをget_fieldrelated_list
に差し替えればOKです。
$module = Vtiger_Module::getInstance('Accounts');
$relationModuleLabel = 'Cars';
$relationModule = Vtiger_Module::getInstance($relationModuleLabel);
$module->setRelatedList($relationModule, $relationModuleLabel, array('add', 'select'), 'get_fieldrelated_list');
これで、車モジュールに存在する「顧客企業」項目を設定しておけば、顧客企業の関連メニューからその顧客企業を選択している「車一覧」を見ることができます。
columnnameについて
fieldを作成するとき、関連項目のcolumnnameは、呼び出し元のmainidと同じにする必要があります。
わざわざ別のIDにしてJOINしたい人も少ないとは思いますが、表示できない場合はcolumnが異なっており、JOINできないケースが想定されますので気をつけてください。
これらの問題は、後から追加する際に困ることではありますが、汎用のget_fieldrelated_listを使わず、modules/{MODULENAME}/{MODULENAME}.php
に記述した別の関数を呼び出すことで、SQL自体を修正してしまえば特に問題は有りません。get_fieldrelated_list
関数自体は、data/CRMEntity.php
に記述されているので、それをmodules/{MODULENAME}/{MODULENAME}.php
にコピーして関数名やSQLを書き換えれば動いちゃったりします。
終わりに
関連項目はCRMのキモとなる部分です。
独自に作ったモジュールが単なる関連の無い単一のテーブルとして扱われていたら、何のための「Relationship」であるのかわかりません。
これを応用することで、全く別のデータを出すことや、兄弟に当たるモジュール(親を経由してデータを持っているもの)も一覧化できますので、よければSQLをカスタマイズして、必要な関連項目を出してみてください。