SugarCRM - サブパネルの一覧を特定の条件でフィルタリングする

#php, #subpanel, #sugarcrm

SugarCRMネタ。

SugarCRMのサブパネルには親にひもづく子供のデータが表示される。あくまで関連しているデータのみであって、関連しててかつある条件のデータのみを表示するということができない。

なので、今回はサブパネルの表示条件を変更するやり方をメモ。


SugarのリレーションシップはモデルとなるSugarBeanからLink2クラスのインスタンスを介して実装されている。このLink2クラスが重要で、Link2にはリレーションシップに関する機能が全て実装されている。

なのでLink2クラスを継承したリレーションシップクラスを作り、以下のようにフィルタリングの機能を実装する。クラス名は任意でいいが、個人的に親モジュール名Linkと命名している。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
require_once 'data/Link2.php';
class ParentModulesLink extends Link2
{
public function getSubpanelQuery($params = array(), $return_array = false)
{
$result = parent::getSubpanelQuery($params, $return_array);
// $result['where'] にフィルター条件を追加する
$result['where'] .= " AND (mymodules.status = 'hogehoge') ";
return $result;
}
}

getSubPanelQuery()がサブパネルに表示するデータを取得するSQLを生成するメソッドなので、ここでwhereにフィルタリングしたい条件を追加する。
SQLベタ書きがカッコ悪いがSugarは大体こうなっているので仕方ない。(7.0からはSugarQueryクラスが用意されてるんだけど。。)

作成したParentModulesLinkクラスは基本的にどこのパスに置いてもいいが、分かりやすいようにフィルタリングをかけるモジュールのディレクトリのどこかに配置するとよい。

1
modules/MyModules/Relationship/ParentModulesLink.php

最後に、作成したParentModulesLinkクラスをSugarが読み込んでくれるようにリレーションシップの定義に追加する。追加したらリペアでOK。

1
2
3
4
5
6
7
8
9
10
11
12
$dictionary['MyModule']['fields']['parentmodule'] = array(
'name' => 'parentmodule',
'vname' => 'LBL_PARENTMODULE',
'type' => 'link',
'relationship' => 'parentmodule_mymodules',
'module' => 'ParentModules',
'bean_name' => 'ParentModule',
'source' => 'non-db',
// custom link class
'link_file' => 'modules/MyModules/Relationship/ParentModulesLink.php',
'link_class' => 'ParentModulesLink',
);

link_filelink_classに作成したカスタムクラスを指定するだけでよい。あとはSugarが良きに計らってくれる。

使いどころ

サブパネルは親に紐づくデータしか表示されないので、親の親のデータ -> 親のデータ -> 子のデータという風に、先祖のデータからサブパネルをたどってドリルダウンするときなどに使える。