リンク項目の [[]] 形式と JSON 形式
分類項目の「選択肢一覧」(ChoicesText)では、特定サイトのレコードや、ユーザー・グループ・組織(部署)を選択肢にリンクできます。書き方には [[]] 形式と JSON 形式の 2 種類があり、使える機能の範囲が違います。このページでは両者の対応と実装上の違いをまとめます。
[[]]形式は手軽だがオプションが限られる。JSON 形式はView・SearchFormat・MembersOnlyなどで細かく制御できる[[Users]]/[[Groups]]はサイトのメンバーだけ、[[Users*]]/[[Groups*]]はテナント全体が対象[[Depts]]だけは例外で、アスタリスクなしでテナント全体の組織が対象。サイトに関連する組織だけに絞るには JSON 形式の"MembersOnly": trueが必要
対象バージョン
Pleasanter 1.5.x(コミット e58aa58)のソースコードを基にしています。
2 つの記法
[[]] 形式は、選択肢一覧に 1 行ずつ [[...]] を書きます。
[[123456789]]JSON 形式は、選択肢一覧に Link オブジェクトの JSON 配列を書きます。
[
{
"SiteId": 123456789
}
]JSON として正しく解析できた場合、各 Link オブジェクトには自動で JsonFormat = true がセットされます。
var links = column.ChoicesText.Deserialize<List<Link>>();
if (links != null)
{
links.ForEach(link =>
{
link.ColumnName = column.ColumnName;
link.JsonFormat = true; // JSON形式フラグをセット
});
Links.AddRange(links);
}サイトリンク(他テーブルのレコード)
[[]] 形式 | JSON 形式 | 説明 |
|---|---|---|
[[SiteId]] | {"SiteId": SiteId} | リンク先サイトのレコードを選択肢にする |
[[SiteId,NoAddButton]] | {"SiteId": SiteId, "NoAddButton": true} | 作成ボタンを非表示にする |
[[SiteId,AddSource]] | {"SiteId": SiteId, "AddSource": true} | リンク元レコードも選択肢に追加する |
[[SiteId,NotReturnParentRecord]] | {"SiteId": SiteId, "NotReturnParentRecord": true} | 保存後に親レコードへ戻らない |
| (指定不可) | {"SiteId": SiteId, "Priority": 100} | 表示の優先順位を設定する |
| (指定不可) | {"SiteId": SiteId, "ExcludeMe": true} | ログインユーザー自身を選択肢から除外する |
| (指定不可) | {"SiteId": SiteId, "SelectNewLink": true} | 新規レコード作成後にそのレコードを自動選択する |
| (指定不可) | {"SiteId": SiteId, "SearchFormat": "[Title]"} | 検索時の表示フォーマットを設定する |
[[]] 形式の SiteId は数値のみ
[[]] 形式でサイトリンクとして解釈されるのは数値だけです。Depts・Groups・Users のような文字列は ToLong() で 0 になるため Links に追加されず、Column.cs の SetChoiceHash が直接処理します。
ユーザー(Users)
[[]] 形式 | JSON 形式 | データソース | 対象範囲 |
|---|---|---|---|
[[Users]] | {"SiteId": 0, "TableName": "Users", "MembersOnly": true} | SiteInfo.SiteUsers() / SQL | サイトのメンバーのみ |
[[Users*]] | {"SiteId": 0, "TableName": "Users"} | TenantCaches.UserHash / SQL | テナント内の全ユーザー |
[[Users,ShowDeptName]] | (指定不可) | SiteInfo.SiteUsers() | サイトのメンバー(部署名付き) |
[[Users*,ShowDeptName]] | (指定不可) | TenantCaches.UserHash | テナント内の全ユーザー(部署名付き) |
アスタリスクの有無は次の分岐で決まります。
users = data.Setting == "Users*"
? SiteInfo.TenantCaches.Get(context.TenantId)
?.UserHash
.Where(o => o.Value.TenantId == context.TenantId)
.Select(o => o.Value.Id) // テナントキャッシュ(全ユーザー)
: SiteInfo.SiteUsers(context: context, siteId: siteId); // サイトのメンバーのみ[[Users]](アスタリスクなし):SiteInfo.SiteUsers()で、サイトのアクセス権限に含まれるユーザーのみ[[Users*]](アスタリスクあり):TenantCaches.UserHashで、テナント内の全ユーザー
JSON 形式では "MembersOnly": true を付けるとサイトのメンバーに限定され、省略すると全ユーザーになります。
グループ(Groups)
[[]] 形式 | JSON 形式 | データソース | 対象範囲 |
|---|---|---|---|
[[Groups]] | {"SiteId": 0, "TableName": "Groups", "MembersOnly": true} | SiteInfo.SiteGroups() / SQL | サイトに関連するグループのみ |
[[Groups*]] | {"SiteId": 0, "TableName": "Groups"} | TenantCaches.GroupHash / SQL | テナント内の全グループ |
case "[[Groups]]":
// SiteInfo.SiteGroups() — サイトに紐付くグループのみ
SiteInfo.SiteGroups(context: context, siteId: siteId)
.ToDictionary(o => o, o => SiteInfo.Group(context.TenantId, o))
...
case "[[Groups*]]":
// TenantCaches.GroupHash — テナント全グループ
SiteInfo.TenantCaches.Get(context.TenantId)?
.GroupHash
...Users と同じく、[[Groups]] はサイトのアクセス権限に基づくグループのみ、[[Groups*]] はテナント内の全グループです。JSON 形式では "MembersOnly": true でサイト限定、省略で全グループになります。
組織(Depts)
[[]] 形式 | JSON 形式 | データソース | 対象範囲 |
|---|---|---|---|
[[Depts]] | {"SiteId": 0, "TableName": "Depts"} | TenantCaches.DeptHash / SQL | テナント内の全組織 |
([[Depts*]] は存在しない) | {"SiteId": 0, "TableName": "Depts", "MembersOnly": true} | SQL | サイトに関連する組織のみ |
[[Depts]] はアスタリスクなしで全件
Users・Groups と異なり、[[Depts]] はアスタリスクなしでテナント内の全組織を返します。[[Depts*]] という記法は switch-case に実装されておらず、サイトに関連する組織だけの選択肢は [[]] 形式では指定できません。
case "[[Depts]]":
Type = Types.Dept;
if (setChoices)
{
SiteInfo.TenantCaches.Get(context.TenantId)?
.DeptHash // テナントキャッシュから全部署
.Where(o => o.Value.TenantId == context.TenantId)
.Where(o => !o.Value.Disabled)
...サイトに関連する組織だけに絞るには、JSON 形式で次のように書きます。
[
{
"SiteId": 0,
"TableName": "Depts",
"MembersOnly": true
}
]アスタリスクの有無のまとめ
| 種別 | [[]] 形式(* なし) | [[]] 形式(* あり) | JSON(MembersOnly なし) | JSON("MembersOnly": true) |
|---|---|---|---|---|
| Users | サイトメンバーのみ | 全ユーザー | 全ユーザー | サイトメンバーのみ |
| Groups | サイト関連グループのみ | 全グループ | 全グループ | サイト関連グループのみ |
| Depts | 全組織 | 存在しない | 全組織 | サイト関連組織のみ |
[[]] 記法から JSON 形式への書き換えは次のとおりです。
[[]] 記法 | 対象範囲 | JSON 形式での相当 |
|---|---|---|
[[Users]] | サイトのメンバーのみ | "TableName": "Users", "MembersOnly": true |
[[Users*]] | テナント全ユーザー | "TableName": "Users" |
[[Groups]] | サイト関連グループのみ | "TableName": "Groups", "MembersOnly": true |
[[Groups*]] | テナント全グループ | "TableName": "Groups" |
[[Depts]] | テナント全組織 | "TableName": "Depts" |
| (存在しない) | サイト関連組織のみ | "TableName": "Depts", "MembersOnly": true |
データの取得方法の違い
| 形式 | データ取得方法 | 特徴 |
|---|---|---|
[[]] 形式(Depts / Groups* / Users*) | テナントキャッシュ(TenantCaches) | 高速。View や SearchFormat による絞り込み・カスタム表示は不可 |
[[]] 形式(Groups / Users) | SiteInfo.SiteGroups() / SiteInfo.SiteUsers() | 中速(インメモリ)。同上 |
| JSON 形式(全種別) | SQL クエリで直接 DB から取得 | 柔軟。View・SearchFormat・Lookups・LinkActions が使える |
JSON 形式では、View で絞り込み条件やソート順を指定したり、SearchFormat でドロップダウンの表示文字列を変えたりできます。
[
{
"SiteId": 0,
"TableName": "Users",
"SearchFormat": "[Name]([Dept])",
"MembersOnly": true,
"ExcludeMe": true
}
]JSON 形式でのみ使えるオプション
| プロパティ | 型 | 説明 |
|---|---|---|
Priority | integer | 選択肢の表示優先度(数値が小さいほど上位) |
ExcludeMe | boolean | ログインユーザー自身を選択肢から除外する |
MembersOnly | boolean | サイトのメンバー(ユーザー / グループ / 組織)のみに絞る |
SelectNewLink | boolean | 新規レコード作成後にそのレコードを自動選択する |
SearchFormat | string | 検索時・表示時のフォーマット文字列(例: [Title]) |
View | object | 絞り込み条件・ソート設定(View オブジェクト) |
Lookups | object | ルックアップ設定 |
LinkActions | object | リンクアクション設定 |