Tech Sketch Bucket of Technical Chips by TIS Inc.

SugarCRMをお気軽にカスタマイズしてみた その1

Pocket

OSS製品というと、PostgreSQL、Apacheなどのミドルウェアが有名ですが、業務アプリケーションにも沢山のOSSが存在します。その中でも代表的な製品の一つ、オープンソースのCRMソフトウェア「 SugarCRM 」は、基本機能部分がコミュニティ版としてソースが公開されています。
顧客管理(CRM)の基本機能として、営業/サポート/マーケティング/グループウェア/管理などの機能は揃っていますが、管理画面の機能を利用して、ユーザ側でもちょっとしたカスタマイズを行える仕組みが提供されているのが大きな特徴といえます。

ソースコードの改変による深いカスタマイズももちろん可能ですが、コミュニティ版で提供されている開発者向けツールを使用すると、画面に表示するラベルの変更・データ項目の追加や既存機能をテンプレートにした新規機能追加程度の軽いカスタマイズであれば、ソースコードを意識することなく、画面上の操作のみで実現可能です。
しかし、SugarCRMのカスタマイズの仕組みを理解するためには、ツールが裏側で何をしているか知る必要があります。また、ツールを使わずに自分で細かいカスタマイズをしたいという場合でもサンプルとして使えるでしょう。

と、いうわけで今回は、ツールが裏で作成するソースコードやデータベースのスキーマ変更がどんなものであるか調べてみました。


とりあえずインストール

Windowsマシン上で動かすなら、zipファイルを解凍するだけでインストールは完了です。Apache、PHP、MySQLも一緒にインストールされます。
今回の調査はWindowsPC上のSugarCRM CE 日本語版 on WARP 6.4.3に6.4.3 ⇒ 6.4.4パッチを適用した環境で調査を実施しています。
(ダウンロードは コチラ
SugarCRM本体は、W:\home\warp\html以下に配置されています(SugarCRM起動時に仮想的にWドライブが起動)。以下、ファイルの場所を書く場合、ここを基準にします。

詳しいインストール手順や基本的な使い方の説明は、 配布サイトのドキュメント などに譲るとして・・・。

開発者向けツールを使ってみる

adminユーザでログインして、画面右上「管理」機能へのリンクから管理メニューに入ると、メニュー下部に管理者向けツール群がいくつか並んでいます。(下図参照)

2012080605263300.JPG

本記事ではその中の1つ、既存モジュールのカスタマイズ用ツール「スタジオ」機能を使ってみます。

スタジオの最初の画面では、SugarCRMの各機能アイコンがずらりと並んでいます。
2012080605311300.JPG

SugarCRMの取引先管理、商談管理などの各機能単位を「モジュール」と呼び、スタジオ機能によるカスタマイズは、このモジュール単位で行っていきます。
なお、スタジオ機能ではモジュールごとに以下の項目をカスタマイズが可能です。

ラベル 画面項目名等の文言の変更
フィールド 編集・詳細ビューで画面項目の追加・削除
関連 詳細ビューでレコード詳細の下にぶら下がる関連データの関係性を定義
レイアウト 各ビューでの表示項目や位置の設定

まずは一つずつさわってみながら、カスタマイズ後のデータベースとソースコードの変更点をみていきます。(以下、カスタマイズしたモジュール名→ <MODULE_NAME> 表記)

ラベルのカスタマイズ

使用する言語ごとに、詳細画面などの項目名の文言を変更可能。

テキストボックスの文言を書き換え
2012080605382100.JPG

「保存して配置」すると変更が画面表示に反映され、言語ごとに各ラベルの設定値が保持されたPHPファイルが生成されます。

データベースに対する変更

特になし

ソースコードに対する変更
  • custom/modules/ <MODULE_NAME> /language/ <各種言語> .lang.php

フィールドの追加

対象モジュールのテーブルに新たなカラムを追加できます。一部実際にはテーブルに保存されずに他テーブルを参照したり、他カラムのデータから計算されるフィールド(HTML,フレーム等)も存在します。
ただし、フィールドを追加しただけでは画面に配置されないので、後述するレイアウト設定で画面に追加する必要があります。

2012080605401000.JPG

データベースに対する変更
  • <MODULE_NAME> _cstm ...CREATE TABLE or カラム1つ追加
  • fields_meta_data ...1件INSERT
例)モジュール「contacts」に文字列型のtwitterIDフィールドを追加
  • contacts:最初からあるcontactsのデータ格納用テーブル。変化なし。
id name ・・・
1 山田太郎
2 鈴木次郎
  • contacts_cstm:フィールド追加時に作成され、追加フィールドに対応する情報を保持。既にあれば列が1つ追加。contacts.id=contacts_cstm.id 1対1の対応関係がある。
id twitterid_c
1  
2  
  • fields_meta_data:フィールド設定画面上で入力した設定値を保持するレコードが1件INSERT
id name vname comments help custom_module type len required ・・・
Contactstwitterid_c twitterid_c LBL_TWITTERID TwitterID TwitterID Contacts varchar 255 N
ソースコードに対する変更
  • custom/
    • Extension/modules/ <MODULE_NAME> /Ext/Vardefs/sugarfield_ fieldName_c .php ...スキーマ定義
    • modules/ <MODULE_NAME> /
      • Ext/Vardefs/vardefs.ext.php ...スキーマ定義
      • language/ <各種言語> lang.php ...追加フィールドのラベルを定義

関連

編集中のモジュールを主レコードとした、モジュール間レコードの1対1、1対多、多対多の関連を定義できます。

2012080605413500.JPG

関連を設定されたモジュールでは、詳細ビューで関連モジュールの情報も一緒に表示することが可能になります。
また、1対多、多対多のサブパネルを伴う場合は、表示するサブパネルのレイアウト定義を選択可能です。

内部では主モジュール_従モジュール_n(数値)というリレーション名が自動設定され、データベース上のrelationshipsテーブルで関連の定義内容を管理します。それをもとに関連レコードを探す仕組みになっているようです。(以下 <RELATION_NAME> と表記)

データベースに対する変更
  • <RELATION_NAME> _c ...CREATE TABLE
  • relationships ...1件INSERT
  • <MODULE_NAME> _cstm ...CREATE TABLE or ALTER TABLE
  • fields_meta_data ...1件INSERT ※

※1対1リレーションを設定した場合のみ、リレーション先のIDを保持する新規カラムが追加されます。

例)モジュール「project_tasks」に成果物のドキュメントをぶら下げられるように関連を追加

→project_tasks:documents = 1対多の関係

  • project_tasks:project_tasksモジュールのデータ格納用テーブル。変更無し
id ・・・ name ・・・
task1 タスク1
  • documents:documentsモジュールのデータ格納用テーブル。変更無し
id ・・・ document_name ・・・
doc1 documentA.xls
doc2 imageB.jpg
  • projecttask_documents_1_c:レコード間の関連情報を保持する中間テーブル
id ・・・ projecttask_documents_1projecttask_ida projecttask_documents_1documents_idb ・・・
1 task1 doc1
2 task1 doc2
  • relationships:関連の設定データ格納テーブル。SELECT文を組み立てるために使用される
id relationship_name lhs_table lhs_key rhs_table rhs_key join_table join_key_lhs join_key_rhs relationship_type ・・・
1 projecttask_documents_1 project_task id documents id projecttask_documents_1_c projecttask_documents_1projecttask_ida projecttask_documents_1documents_idb many-to-many
ソースコードに対する変更
  • custom/Extension/
    • application/Ext/TableDictionary/ <RELATION_NAME> .php ...関連メタデータファイルをインクルードする定義ファイル
    • modules/
      • relationships/ <RELATION_NAME> MetaData.php ...関連メタデータ
      • <MODULE_NAME> /Ext/ ※主/従両方のモジュールに作成される
        • Vardefs/vardefs.ext.php
        • Layoutdefs/layoutdefs.ext.php
        • Language/ <各種言語>.lang.ext.php

レイアウト

編集ビュー、詳細ビュー、一覧ビュー、クイック作成、ダッシュレット、ポップアップ、検索の各画面の表示項目と標準テンプレート上の配置をドラッグアンドドロップで編集できますが、一覧画面以外は各パネル2列配置までで、表示幅の指定はできないようです。タブ切り替え表示にすることは可能。
なお、ダッシュレットは「私の○○」ダッシュレットのみ編集可能で、チャート類は不可のようです。
項目の内容自体はフィールドの編集で行います。
2012080605430900.JPG

ソースコードに対する変更
  • custom/modules/ <MODULE_NAME> /metadata
    • editviewdefs.php ...編集ビュー
    • detailviewdefs.php ...詳細ビュー
    • listviewdefs.php ...一覧ビュー
    • quickcreatedefs.php ...クイック作成

編集した画面のレイアウト定義のみ作成されます。

SugarCRMのアップグレードセーフの仕組み

スタジオ機能で作られるファイルは、custom/ディレクトリ内に配置されます。
標準モジュールのソースコードは、modules/ <MODULE_NAME> /以下に配置されていますが、そちらに変更はかかりません。
また、各モジュール名に対応するディレクトリが合計3つ存在していますが、これらは大まかに下記のような使い分けがされているようです。

  • A) modules/ <MODULE_NAME> / ...カスタマイズ前の標準モジュール
  • B) custom/Extension/modules/ <MODULE_NAME> / ...フィールド、リレーション追加などの機能拡張カスタマイズ
  • C) custom/modules/ <MODULE_NAME> / ...ラベル、レイアウト定義の変更などの機能拡張を伴わない部分のカスタマイズ

スタジオ機能で追加されたフィールドに関わる設定ファイルがC)以下に出来る場合、Ext/以下に配置されることで、モジュールが元々もっていたフィールドと、スタジオで追加したフィールドが識別できるようになっています。
また、C > B > A の順で設定が優先されます。

既存機能のカスタマイズをスタジオ機能を使わず、テキストエディタでの編集でカスタマイズしようとする場合でも、上記と同じように定義ファイルを配置することで、ツールと同様の変更が反映されます。
スタジオ機能で作成されたファイルを雛形として、スタジオ機能で対応できない(ex. 特殊な計算の結果を画面に表示させる)部分のみ追加コーディングで補うといった活用も可能でしょう。

次回は新規モジュールを作成するツール、「モジュールビルダー」を使ってみます!

エンジニア採用中!私たちと一緒に働いてみませんか?