SugarCRM - 既存のドロップダウンの上書きで機能拡張は使えない

#php, #sugarcrm

SugarCRMネタ。

項目やラベル、ドロップダウンなどは機能拡張領域(Extension)で定義すると、エンドユーザーのカスタマイズに影響なく機能を追加できるので、Sugarを使ったシステムを構築するときは、このExtensionに様々な拡張を施すことが多い。

先日、FlexRelateに表示されるモジュールのドロップダウンを上書きしようと、いつものようにExtensionに定義したところどうもうまくいかない事態に陥ったのでメモした次第。


Sugar標準に

1
2
3
$app_list_strings['hoge'] = array(
'abc' => 'ABC',
);

というようなリストが定義されているとして、カスタマイズでこのリストを上書きしたい。

通常、Extensionに以下のように書く。

1
2
3
4
$app_list_strings['hoge'] = array(
'xyz' => 'XYZ',
'kkk' => 'KKK',
);

こうすると、

1
2
3
4
5
$app_list_strings['hoge'] = array(
'abc' => 'ABC',
'xyz' => 'XYZ',
'kkk' => 'KKK',
);

こんなドロップダウンリストが出来上がる。Oh…
どうやら、標準定義とExtension定義がマージされているようだ。

この処理を行っている処理を見てみる。
include/utils.php974行目あたり。(v6.5.18)

1
2
3
4
5
6
7
8
9
10
foreach ( $langs as $lang ) {
if(file_exists("custom/application/Ext/Language/$lang.lang.ext.php")) {
$app_list_strings = _mergeCustomAppListStrings("custom/application/Ext/Language/$lang.lang.ext.php" , $app_list_strings);
$GLOBALS['log']->info("Found extended language file: $lang.lang.ext.php");
}
if(file_exists("custom/include/language/$lang.lang.php")) {
include("custom/include/language/$lang.lang.php");
$GLOBALS['log']->info("Found custom language file: $lang.lang.php");
}
}

確かにExtは_mergeCustomAppListStringsを実行して、配列のマージを行っている!
今までExtは標準ドロップダウン定義を 再定義 できると思っていたので、完全に仕様を誤解していた。実際フィールド定義とかは再定義できるしね。。

機能 拡張 なので、確かに意味合い的にはマージでいいんだけど、これじゃあエンドユーザー領域に定義しないとドロップダウンの再定義はできないことになる。
カスタマイズの際は十分に注意されたし。

まとめ

  • Extensionでのドロップダウン定義は標準定義と マージ される
  • 標準ドロップダウンの再定義はcustom/include/language/ja_JP.lang.phpに記述する