SugarCRMネタ。
SugarCRMのサブパネルには親にひもづく子供のデータが表示される。あくまで関連しているデータのみであって、関連しててかつある条件のデータのみを表示するということができない。
なので、今回はサブパネルの表示条件を変更するやり方をメモ。
SugarのリレーションシップはモデルとなるSugarBeanからLink2クラスのインスタンスを介して実装されている。このLink2クラスが重要で、Link2にはリレーションシップに関する機能が全て実装されている。
なのでLink2クラスを継承したリレーションシップクラスを作り、以下のようにフィルタリングの機能を実装する。クラス名は任意でいいが、個人的に親モジュール名Link
と命名している。
|
getSubPanelQuery()
がサブパネルに表示するデータを取得するSQLを生成するメソッドなので、ここでwhereにフィルタリングしたい条件を追加する。
SQLベタ書きがカッコ悪いがSugarは大体こうなっているので仕方ない。(7.0からはSugarQueryクラスが用意されてるんだけど。。)
作成したParentModulesLinkクラスは基本的にどこのパスに置いてもいいが、分かりやすいようにフィルタリングをかけるモジュールのディレクトリのどこかに配置するとよい。
modules/MyModules/Relationship/ParentModulesLink.php |
最後に、作成したParentModulesLinkクラスをSugarが読み込んでくれるようにリレーションシップの定義に追加する。追加したらリペアでOK。
$dictionary['MyModule']['fields']['parentmodule'] = array( |
link_file
とlink_class
に作成したカスタムクラスを指定するだけでよい。あとはSugarが良きに計らってくれる。
使いどころ
サブパネルは親に紐づくデータしか表示されないので、親の親のデータ -> 親のデータ -> 子のデータという風に、先祖のデータからサブパネルをたどってドリルダウンするときなどに使える。