uitypeを追加する方法

エンジニアリングチームの網野です。
長く続いた梅雨も明け、すっかり夏の湿度がまとわりつく気候が厳しいですね。
サムネイルはそんな暑い日に東京オフィスで振る舞われたハーゲンダッツの画像です。美味しいですね。

少し前の記事(社内LTの記事を更新していきます!)で「LTでやったuitypeの追加方法を記事にするよ!」と川合が書いていますが、遅くなってしまいすみません。
今回は簡単なuitype追加方法をある程度網羅的に説明して、もしカスタマイズする際の手助けになればと思います。

また、vTigerCRMを利用している方の場合も参考になると思いますのでぜひ一読いただければと思います。

uitypeとは

F-RevoCRMのuitypeについて簡単に説明すると、CRMという性質上、テーブルに色々な形式のデータを保存することになります。
そこには、単なるテキスト・日付・整数など様々な入力項目がありますが、これによってDBのバリデーションやフロントエンドでのバリデーションをどの様にかけるか、さらに言えば入力の補助(Datepicker等)を制御する必要があります

この項目の種類のことを、F-RevoCRMではuitypeという単位で管理しており、あるレコードの詳細画面での表示時や、編集画面での表示、さらにはレポートのときはどの様に出力するかそれぞれ定義されています。

カンマ有りの数値項目を作る

大きく分けて

  • 定義段階
  • 出力制御

上記2点がありますので、順番に説明します。

定義段階

今回はサンプルとして、「カンマ有り数値項目」を作成します。
例えば1234567という数値を登録した際、画面上からは「1,234,567」と表示されるような項目ですね。

追加するuitype:カンマ有り数値
uitypeの英語名:Integerc
uitypeの番号:300(空き番号を使ってください)

まず以下のメソッドに新しいuitype(ここではIntegerc)を定義します。

Settings_LayoutEditor_Module_Model->getAddSupportedFieldTypes
Settings_LayoutEditor_Module_Model->getAddFieldTypeInfo
Settings_LayoutEditor_Module_Model->getTypeDetailsForAddField

更にmodules/Vtiger/models/Field.phpgetFieldDataTypeに今回のuitype=300のケースを追加します。

DB側にも定義を追加しなくてはいけません。
以下のようなSQLでuitypeを定義してください。

insert into vtiger_ws_fieldtype values (40, 300, 'integerc');

次はクラスの定義です。
今回は近しいInteger.phpをコピーし、modules/Vtiger/uitypes/Integerc.phpを作成します。
内部のクラス名等は変更してください。

これで事前準備は完成です。

出力制御

まずは上で作成したクラスの基本出力について定義します。
今回はカンマ区切りの数値を表示する必要があるため、以下の関数を追加します。

public function getDisplayValue($value) {
     return number_format($value);
}

これで、出力時にカンマ区切りになるようになりました。

それではここから、以下の項目についての出力を制御するためのコードを紹介します。

  • 詳細
  • 編集画面
  • リスト
  • レポート
  • ワークフロー
  • CSVエクスポート
  • フィルター

具体的には上記対応を済ます必要があります。
順番に簡単に説明します。

詳細・編集

上記getDisplayValueにて対応できます。

リスト

対象となるファイル
layouts/vlayout/modules/Vtiger/ListViewContents.tpl

{else if $LISTVIEW_HEADER->get('uitype') eq '300'}
{number_format($LISTVIEW_ENTRY->get($LISTVIEW_HEADERNAME))}

レポート

対象となるファイル
modules/Reports/ReportUtils.php

# getReportFieldValueに以下の処理を追加
} elseif ($fieldType == 'integerc') {
  $fieldvalue = number_format($fieldvalue);

ワークフロー

対象となるファイル
modules/Settings/Workflows/models/Field.php
※getAdvancedFilterOpsByFieldTypeにintegerと同様の値を追加

メール本文等での対応のため、以下のコードも追加します。

対象となるファイル
modules/com_vtiger_workflow/VTSimpleTemplate.inc

# transformToUserFormatに追加
case 'integerc':
    $fieldValue = number_format($fieldValue);
    break;

CSVエクスポート

対象となるファイル
modules/Vtiger/actions/ExportData.php

# sanitizeValuesにuitype = 300のケースを追加
# 今回は、CSV出力時数値が出てほしいため、実施しない

フィルター

対象となるファイル
modules/Vtiger/models/Field.php

# getAdvancedFilterOpsByFieldTypeを検索タイプを追加する
# 今回のtypeofdataはIをそのまま使うため、追加は行わない

uitypeの登録完了

ここまでで利用可能なところまでは実装できました。

上にも記載しましたが、まだバリデーションについては書いていません。
こちらはフロント側の処理になるので主にJavaScriptのコードと、SmartyTemplateを変更することになります。

また次回の記事等で説明できればと思いますので少々お待ちいただければ。

なお、弊社では「添付ファイル項目」の追加実績などがあります。
多くのお客様では関連のドキュメントから添付ファイルを入れていますが、やはりフィールドから追加したいというご要望もありますので、そういった際もご相談いただければ対応致します。

それでは次回もまたThinkingreedエンジニアリングBlogをよろしくおねがいします!!

ご質問・お問い合わせはこちら

メールフォームへ