Skip to content

選択肢一覧(取得・カンマのエスケープ・ラジオボタン読取専用) ​

第8版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

分類項目の「選択肢一覧」に関する仕様と使いこなしをまとめます。

  • 選択肢一覧を取得するには、Wiki をリンク項目にする方法(推奨)と、SiteSettings から取り出す方法がある
  • Ver.1.4.12.0 以降、値にカンマを含めたいときは \, でエスケープできる。分割に使う正規表現はパラメータで変更できる
  • ラジオボタンを読取専用にするとラジオボタン表示でなくなるが、サーバースクリプトとコントロール CSS でラジオボタンのまま読取専用にできる

選択肢一覧を取得する ​

リンク項目を使わずに選択肢一覧をベタ打ちしている場合、選択肢そのものをすぐに取得する手段がありません。次の 2 つの方法があります。

Wiki をリンク項目にする(推奨) ​

プリザンターのリンク項目は Wiki にも使えます。

  1. 新しく Wiki を作り、内容に選択肢一覧をコピーする
  2. その Wiki を項目のリンク先にする

Wiki のサイト ID の取得方法に癖があるため、詳しくは公式マニュアルの「Wiki機能:選択肢一覧のマスタデータとして使用する」を参照してください。

選択肢一覧を他のサイトと共通化して使い回せるのが最大のメリットです。外部システムから取得する場合も API の get や items/get、更新には items/update が使えます。

SiteSettings から取得する ​

サイトの設定は Sites テーブルの SiteSettings 列に JSON で格納されています。分類A に選択肢を設定したサイトでは、Columns の中に次のような要素があります。

json
{
 "Columns": [
  {
   "ColumnName": "NumA",
   "Format": "#,##.0;\"\";\"▲\"#,##.0"
  },
  {
   "ColumnName": "ClassA",
   "LabelText": "選択肢項目",
   "ChoicesText": "a\nb\nc\nd\ne",
   "SearchType": "PartialMatch"
  }
 ]
}

ColumnName が ClassA の要素の ChoicesText に選択肢一覧が入っています。各 DBMS では次のように取り出せます。

sql
SELECT
    JSON_VALUE([SiteSettings], '$.Columns[1].ChoicesText')
FROM
    [Sites]
WHERE
    [SiteId] = 3482327
sql
SELECT "SiteSettings"::jsonb #>> '{Columns,1,ChoicesText}' AS "ChoicesText"
FROM "Sites"
WHERE "SiteId" = 3482327;
sql
SELECT JSON_UNQUOTE(JSON_EXTRACT(`SiteSettings`, '$.Columns[1].ChoicesText')) AS `ChoicesText`
FROM `Sites`
WHERE `SiteId` = 3482327;

WARNING

配列のインデックス(上の例の [1])は、サイトの項目変更で変わる可能性があります。随時追従させるか、Columns を展開して対象の要素を探す方法を使ってください。

C# などのプログラムでクラスにバインドして扱うこともできます。その場合は SiteSettings.cs を参考にクラスを作成してください。

カンマを含む値のエスケープ ​

選択肢一覧 では、保存値・表示名・短縮表示名・スタイル用のクラス名をカンマ区切りで書けます。

text
[保存値],[表示名],[短縮表示名],[スタイル用のクラス名]
text
100,未着手,未,status-new
150,準備,準,status-preparation
200,実施中,実,status-inprogress

内部ではカンマで文字列を分割するため、値にカンマを含めると意図どおりに分割されません。

text
100,Example Co., Ltd.,Example,status-xxxx
→ [100],[Example Co.],[ Ltd.],[Example],[status-xxxx]

\, でエスケープする 1.4.12.0 以降 ​

Ver.1.4.12.0 以降では、分割したくないカンマを \, と書けば正しく扱われます。

text
100,Example Co.\, Ltd.,Example,status-xxxx
→ [100],[Example Co., Ltd.],[Example],[status-xxxx]

実装 ​

該当の変更 で、従来の Split(',') による分割が正規表現による分割に置き換わりました。

  1. 否定後読みの正規表現 (?<!\\), で、\, になっていない , だけで分割する
  2. 分割後の文字列に含まれる \, を , に置換する

分割ルールをパラメータで変更する ​

分割に使う正規表現は 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 にするだけでラジオボタンのまま読取専用になります。どの版からこの出力になったかは確認できていません。以下の手順は、読取専用にするとラジオボタン表示でなくなる版向けです。

読取専用チェックだけを ON にしたラジオボタンの項目(1.5.8.1)

1.5.8.1 ではサーバースクリプトなしでもラジオボタンのまま読取専用になる

HTML はサーバー側で組み立てられるため、読取専用設定のままクライアント側だけで直すことはできません。そこで、画面ごとに出力される HTML を制御しつつ属性を書き換えます。

設定手順 ​

  1. 読取専用にしたい項目のコントロール CSS に readonly を設定し、読取専用チェックボックスを ON にします。
  2. 次の 2 つのサーバースクリプトを作成します。
js
if(context.Action === 'edit'){
    columns.Class009.ReadOnly = false;//項目名は環境に応じて書き換えてください
}
js
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 の設定が必要です。

関連ページ ​

変更履歴

第8版記事の確認版を繰り返す表現を整理する
第7版選択肢一覧の取得に PostgreSQL と MySQL の SQL 例を追加
第6版「選択肢一覧」の画像をこの記事のフォルダに置く
第5版ラジオボタンを読取専用で使うスクリプトの条件を修正し、1.5.8.1 の標準の挙動とスクリーンショットを追加
第4版「機能の仕様と使いこなし」「スクリプト」「サーバースクリプト」に対応バージョンを表示
第3版「機能の仕様と使いこなし」を 1.5.8.1 のソースで検証して修正
第2版記事のファイル名に並び順の番号を付け、元記事リンクを frontmatter の sources に移行
第1版「機能の仕様と使いこなし」セクションの記事を追加