選択肢一覧(取得・カンマのエスケープ・ラジオボタン読取専用)
分類項目の「選択肢一覧」に関する仕様と使いこなしをまとめます。
- 選択肢一覧を取得するには、Wiki をリンク項目にする方法(推奨)と、
SiteSettingsから取り出す方法がある - Ver.1.4.12.0 以降、値にカンマを含めたいときは
\,でエスケープできる。分割に使う正規表現はパラメータで変更できる - ラジオボタンを読取専用にするとラジオボタン表示でなくなるが、サーバースクリプトとコントロール CSS でラジオボタンのまま読取専用にできる
選択肢一覧を取得する
リンク項目を使わずに選択肢一覧をベタ打ちしている場合、選択肢そのものをすぐに取得する手段がありません。次の 2 つの方法があります。
Wiki をリンク項目にする(推奨)
プリザンターのリンク項目は Wiki にも使えます。
- 新しく Wiki を作り、内容に選択肢一覧をコピーする
- その Wiki を項目のリンク先にする
Wiki のサイト ID の取得方法に癖があるため、詳しくは公式マニュアルの「Wiki機能:選択肢一覧のマスタデータとして使用する」を参照してください。
選択肢一覧を他のサイトと共通化して使い回せるのが最大のメリットです。外部システムから取得する場合も API の get や items/get、更新には items/update が使えます。
SiteSettings から取得する
サイトの設定は Sites テーブルの SiteSettings 列に JSON で格納されています。分類A に選択肢を設定したサイトでは、Columns の中に次のような要素があります。
{
"Columns": [
{
"ColumnName": "NumA",
"Format": "#,##.0;\"\";\"▲\"#,##.0"
},
{
"ColumnName": "ClassA",
"LabelText": "選択肢項目",
"ChoicesText": "a\nb\nc\nd\ne",
"SearchType": "PartialMatch"
}
]
}ColumnName が ClassA の要素の ChoicesText に選択肢一覧が入っています。各 DBMS では次のように取り出せます。
SELECT
JSON_VALUE([SiteSettings], '$.Columns[1].ChoicesText')
FROM
[Sites]
WHERE
[SiteId] = 3482327SELECT "SiteSettings"::jsonb #>> '{Columns,1,ChoicesText}' AS "ChoicesText"
FROM "Sites"
WHERE "SiteId" = 3482327;SELECT JSON_UNQUOTE(JSON_EXTRACT(`SiteSettings`, '$.Columns[1].ChoicesText')) AS `ChoicesText`
FROM `Sites`
WHERE `SiteId` = 3482327;WARNING
配列のインデックス(上の例の [1])は、サイトの項目変更で変わる可能性があります。随時追従させるか、Columns を展開して対象の要素を探す方法を使ってください。
C# などのプログラムでクラスにバインドして扱うこともできます。その場合は SiteSettings.cs を参考にクラスを作成してください。
カンマを含む値のエスケープ
選択肢一覧 では、保存値・表示名・短縮表示名・スタイル用のクラス名をカンマ区切りで書けます。
[保存値],[表示名],[短縮表示名],[スタイル用のクラス名]100,未着手,未,status-new
150,準備,準,status-preparation
200,実施中,実,status-inprogress内部ではカンマで文字列を分割するため、値にカンマを含めると意図どおりに分割されません。
100,Example Co., Ltd.,Example,status-xxxx
→ [100],[Example Co.],[ Ltd.],[Example],[status-xxxx]\, でエスケープする 1.4.12.0 以降
Ver.1.4.12.0 以降では、分割したくないカンマを \, と書けば正しく扱われます。
100,Example Co.\, Ltd.,Example,status-xxxx
→ [100],[Example Co., Ltd.],[Example],[status-xxxx]実装
該当の変更 で、従来の Split(',') による分割が正規表現による分割に置き換わりました。
- 否定後読みの正規表現
(?<!\\),で、\,になっていない,だけで分割する - 分割後の文字列に含まれる
\,を,に置換する
分割ルールをパラメータで変更する
分割に使う正規表現は Parameters\General.json で変更できます。1.5.8.1 の既定値は ChoiceSplitRegexPattern が (?<!\\),、ChoiceReplaceRegexPattern が \\(,)、ChoiceReplaceRegexReplacement が $1 です(正規表現としての値。JSON ファイルでは \ がさらにエスケープされています。General.json)。
| パラメータ | 内容 |
|---|---|
ChoiceSplitRegexPattern | 分割に使用する正規表現 |
ChoiceReplaceRegexPattern | 分割後のエスケープ検出に使用する正規表現 |
ChoiceReplaceRegexReplacement | エスケープの置換後の文字列 |
既定のエスケープ方式は後方互換性のためのものです。互換性を気にしなくてよい環境では、タブ区切りにする、CSV のような書き方にするといった変更もできます。
たとえばタブ区切りにする場合は、ChoiceSplitRegexPattern に \t を指定し、ChoiceReplaceRegexPattern と ChoiceReplaceRegexReplacement には空文字を指定します。JSON では \ をエスケープする必要があるため、ファイルには \\t と書きます。
ラジオボタンのまま読取専用にする
選択肢一覧はドロップダウンリスト、ラジオボタン、モーダル(検索画面)の 3 パターンで使えます。以前の版では、ラジオボタンの項目を読取専用にするとラジオボタン表示ではなくなっていました(1.5.8.1 の挙動は次の info のとおりです)。
1.5.8.1 の挙動
確認したソースでは、読取専用の項目は読取用の分岐で出力され、ラジオボタンの項目も disabled: true のラジオボタンとして出力されます(HtmlFields.cs、HtmlFields.cs)。そのため 1.5.8.1 では、読取専用チェックボックスを ON にするだけでラジオボタンのまま読取専用になります。どの版からこの出力になったかは確認できていません。以下の手順は、読取専用にするとラジオボタン表示でなくなる版向けです。

1.5.8.1 ではサーバースクリプトなしでもラジオボタンのまま読取専用になる
HTML はサーバー側で組み立てられるため、読取専用設定のままクライアント側だけで直すことはできません。そこで、画面ごとに出力される HTML を制御しつつ属性を書き換えます。
設定手順
- 読取専用にしたい項目のコントロール CSS に
readonlyを設定し、読取専用チェックボックスを ON にします。 - 次の 2 つのサーバースクリプトを作成します。
if(context.Action === 'edit'){
columns.Class009.ReadOnly = false;//項目名は環境に応じて書き換えてください
}if(context.Action === 'edit') {
context.AddResponse(
'Attr',
'input.readonly[type="radio"]',
$ps.JSON.stringify({ Name: 'disabled', Value: '' })
);
}INFO
例の Class009(分類009)は Enterprise Edition の項目拡張で追加した項目です。Community Edition では ClassA〜ClassZ が対象になるので、項目名を読み替えてください。仕組みはどちらでも同じです。
1 つ目のスクリプトは、編集画面の表示(context.Action が edit)のときだけ読取専用を解除してラジオボタンとして描画させ、2 つ目のスクリプトでそのラジオボタンに disabled を付けます。更新(update)など編集画面の表示以外の処理では、エディタの設定どおり読取専用のままなので、サーバー側でも値は変更されません。条件を !== にすると、編集画面では読取専用が解除されず、逆に更新時に読取専用が外れてしまいます。context.Action はルートのアクション名を小文字にした値で(Context.cs)、/items/{id} の既定のアクションは Edit です(Startup.cs)。
これで編集画面では、ラジオボタンの表示のまま読取専用になります。項目ごとにサーバースクリプトとコントロール CSS の設定が必要です。