Vtiger CRM(オープンソース版)において、日本国内での利用時に最もネックとなるのが「姓名の順序(名→姓)」の問題です。

これはVtigerが欧米の仕様(First Name + Last Name)をベースに作られているためです。主に「関連リストや検索結果での表示(Entity Label)」「詳細画面のヘッダー表示」の2箇所で修正が必要です。

以下に、バージョン7.xおよび8.x系を想定した改修方法を解説します。

※作業前には必ずデータベースとファイルのバックアップを取ってください。

方法1:データベース設定の変更(最も重要)

関連リスト(他モジュールから参照した際の名前)やグローバル検索の結果において、「名 姓」となっているものを「姓 名」に変更するには、データベースの定義を変更するのが最も確実です。

対象テーブル: vtiger_entityname

このテーブルは、各モジュールの「レコードのタイトル(ラベル)」としてどのカラムを使うかを定義しています。

手順 (SQL実行)

phpMyAdminなどのツール、またはMySQLコマンドラインから以下のSQLを実行します。

SQL

-- Contacts(顧客担当者)の順序を入れ替え
UPDATE vtiger_entityname 
SET fieldname = 'lastname,firstname' 
WHERE modulename = 'Contacts';

-- Leads(見込み客)の順序を入れ替え
UPDATE vtiger_entityname 
SET fieldname = 'lastname,firstname' 
WHERE modulename = 'Leads';

-- Users(システムユーザー)の順序を入れ替え
UPDATE vtiger_entityname 
SET fieldname = 'last_name,first_name' 
WHERE modulename = 'Users';

解説: デフォルトでは firstname,lastname となっていますが、これを lastname,firstname に変更することで、システムがレコード名を生成する際に姓を先に取得するようになります。

方法2:既存データのラベル更新

上記(方法1)の設定変更は、「今後保存されるレコード」または「更新されたレコード」にのみ適用されます。すでに登録済みのデータは vtiger_crmentity テーブルの label カラムに「名 姓」のままテキストとして保存されているため、これを更新する必要があります。

手順

数が少なければ、各レコードを一度「編集」→「保存」するだけで直ります。

データが多い場合は、以下のロジックを持つ簡単なPHPスクリプトを作成してルートディレクトリで実行するのが早道です。

更新用スクリプトの例(概念コード):

PHP

<?php
include_once('vtlib/Vtiger/Module.php');
require_once('includes/main/WebUI.php');

// 顧客担当者の全レコードを取得して保存し直す(これでラベルが再生成される)
$moduleName = 'Contacts';
$queryGenerator = new QueryGenerator($moduleName, $current_user);
$queryGenerator->setFields(array('id'));
$query = $queryGenerator->getQuery();
$result = $adb->pquery($query, array());

while($row = $adb->fetch_array($result)) {
    $recordId = $row['id'];
    $recordModel = Vtiger_Record_Model::getInstanceById($recordId, $moduleName);
    $recordModel->set('mode', 'edit');
    $recordModel->save(); // 保存時にvtiger_entitynameの設定に従ってラベルが書き換わる
    echo "Updated: " . $recordId . "<br>";
}
?>

※注意: 大量データの場合、タイムアウトしないようにご注意ください。

まとめ

  1. DB修正 (vtiger_entityname): これが根本対策です。関連リストや検索での表示順を制御します。
  2. データ更新: 過去データのラベルを書き換えます。

多くの場合は、方法1を実施し、その後レコードを再保存するだけで解決します。