プリザンターのスクリプトで使えるシステム変数をみてみよう

## はじめに
プリザンターのスクリプトで固有値を取得出来る関数として用意されている`$p.userId`や`$p.deptId`などの関数。この関数の値はどこから取得されているのか、また関数として用意はされていないけど取得出来る項目があるのでそれを紹介します。

## 源泉はどこから？
`body`要素に`type="hidden"`となっている`input`が複数あります。ここに格納されている値が源泉となっています。実際に中身を見てみます。

```html
<input id="ApplicationPath" name="ApplicationPath" type="hidden" value="/">
<input id="Language" name="Language" type="hidden" value="ja">
<input id="TimeZoneOffset" name="TimeZoneOffset" type="hidden" value="+09:00">
<input id="YmdFormat" name="YmdFormat" type="hidden" value="yyyy/MM/dd">
<input id="YmdDatePickerFormat" name="YmdDatePickerFormat" type="hidden" value="Y/m/d">
<input id="DeptId" name="DeptId" type="hidden" value="1">
<input id="UserId" name="UserId" type="hidden" value="3">
<input id="LoginId" name="LoginId" type="hidden" value="Pleasanter@example.com">
<input id="Theme" name="Theme" type="hidden" value="cerulean">
<input id="TableName" name="TableName" type="hidden" value="Results">
<input id="Controller" name="Controller" type="hidden" value="items">
<input id="Action" name="Action" type="hidden" value="index">
<input id="Id" name="Id" type="hidden" value="3526345">
<input id="TenantId" name="TenantId" type="hidden" value="1">
<input id="SiteId" name="SiteId" type="hidden" value="3526345">
<input id="JoinedSites" name="JoinedSites" type="hidden" value="[{&quot;SiteId&quot;:3526345,&quot;ReferenceType&quot;:&quot;Results&quot;,&quot;Title&quot;:&quot;記録テーブル(子テーブル)&quot;},{&quot;SiteId&quot;:3526346,&quot;ReferenceType&quot;:&quot;Issues&quot;,&quot;Title&quot;:&quot;期限付きテーブル(親テーブル)&quot;}]">
<input id="ReferenceType" name="ReferenceType" type="hidden" value="Results">
<input id="Columns" name="Columns" type="hidden" value="[{&quot;ColumnName&quot;:&quot;ClassA&quot;,&quot;LabelText&quot;:&quot;親テーブル&quot;},{&quot;ColumnName&quot;:&quot;Title&quot;,&quot;LabelText&quot;:&quot;子タイトル&quot;},{&quot;ColumnName&quot;:&quot;ClassB&quot;,&quot;LabelText&quot;:&quot;分類B&quot;},{&quot;ColumnName&quot;:&quot;DateB&quot;,&quot;LabelText&quot;:&quot;日付B&quot;},{&quot;ColumnName&quot;:&quot;NumB&quot;,&quot;LabelText&quot;:&quot;数値B&quot;},{&quot;ColumnName&quot;:&quot;Manager&quot;,&quot;LabelText&quot;:&quot;管理者&quot;},{&quot;ColumnName&quot;:&quot;Owner&quot;,&quot;LabelText&quot;:&quot;担当者&quot;},{&quot;ColumnName&quot;:&quot;ResultId&quot;,&quot;LabelText&quot;:&quot;ID&quot;},{&quot;ColumnName&quot;:&quot;Status&quot;,&quot;LabelText&quot;:&quot;状況&quot;},{&quot;ColumnName&quot;:&quot;Body&quot;,&quot;LabelText&quot;:&quot;内容&quot;},{&quot;ColumnName&quot;:&quot;TitleBody&quot;,&quot;LabelText&quot;:&quot;タイトル/内容&quot;},{&quot;ColumnName&quot;:&quot;UpdatedTime&quot;,&quot;LabelText&quot;:&quot;更新日時&quot;},{&quot;ColumnName&quot;:&quot;Comments&quot;,&quot;LabelText&quot;:&quot;コメント&quot;},{&quot;ColumnName&quot;:&quot;Updator&quot;,&quot;LabelText&quot;:&quot;更新者&quot;},{&quot;ColumnName&quot;:&quot;Ver&quot;,&quot;LabelText&quot;:&quot;バージョン&quot;},{&quot;ColumnName&quot;:&quot;ClassC&quot;,&quot;LabelText&quot;:&quot;分類C&quot;},{&quot;ColumnName&quot;:&quot;NumA&quot;,&quot;LabelText&quot;:&quot;数値A&quot;},{&quot;ColumnName&quot;:&quot;DateA&quot;,&quot;LabelText&quot;:&quot;日付A&quot;},{&quot;ColumnName&quot;:&quot;DescriptionA&quot;,&quot;LabelText&quot;:&quot;説明A&quot;},{&quot;ColumnName&quot;:&quot;AttachmentsA&quot;,&quot;LabelText&quot;:&quot;添付ファイルA&quot;},{&quot;ColumnName&quot;:&quot;AttachmentsB&quot;,&quot;LabelText&quot;:&quot;添付ファイルB&quot;},{&quot;ColumnName&quot;:&quot;ClassA~3526346,Title&quot;,&quot;LabelText&quot;:&quot;親タイトル&quot;}]">
<input id="ReplaceFieldColumns" name="ReplaceFieldColumns" type="hidden" value="[]">
<input id="Log" name="Log" type="hidden" value="{&quot;Log&quot;:&quot;&quot;}">
<input id="AnchorTargetBlank" name="AnchorTargetBlank" type="hidden" value="1">
<input id="data-validation-maxlength-type" name="data-validation-maxlength-type" type="hidden" value="Character">
<input id="data-validation-maxlength-regex" name="data-validation-maxlength-regex" type="hidden" value="x01-x7EuFF65-uFF9F">
<input id="BackUrl" name="BackUrl" type="hidden" value="/items/3457307/index">
```

何か見たことがある項目もいくつか並んでいますね。それぞれを細かく見てみましょう。

### ApplicationPath
プリザンターのサイトルートのパスが格納されます。Pleasanter.netのようにサブディレクトリ環境で運用されている時にはサブディレクトリの情報が格納されます。Pleasanter.netの場合は`/fs/`が格納されています。
パスを指定する必要がある場合にこの値を使用すると、サイトパッケージの出し入れを行う時に書換をおこなう場所を少なくすることが出来ます。

```js:取得コード例
$('#ApplicationPath').val();
```

### Language
ログインユーザの言語設定情報が出力されます。取り得る値は`ja/en/zh/de/ko/es/vn`になります。スクリプトで固定文言を埋め込む時などに多言語対応をする時などに使用します。

```js:取得コード例
$('#Language').val();
```

### TimeZoneOffset
ログインユーザーのUTCからのタイムゾーンオフセットが格納されています。

```js:取得コード例
$('#TimeZoneOffset').val();
```

### YmdFormat
Languageから逆引きされるフォーマット情報が設定されています。データの源泉は下記のJSONです。

https://github.com/Implem/Implem.Pleasanter/blob/fa01115f6c2e526f8e6660963c35b57f58dc3dfc/Implem.Pleasanter/App_Data/Displays/YmdFormat.json

主にカレンダーなどで表示されている日付文字列のフォーマットに使用されます。これも多言語対応をするときにロケールによって表示を切り替える時に使用します。

```js:取得コード例
$('#YmdFormat').val();
```

### YmdDatePickerFormat
DateTimePickerで使用するフォーマットが格納されています。

### DeptId
`$p.deptId`のデータ源泉です。ユーザの組織IDが格納されています。

### UserId
`$p.userId`のデータ源泉です。ユーザのユーザIDが格納されています。

### LoginId
`$p.loginId`のデータ源泉です。ユーザのログインIDが格納されています。

### Theme
ログインユーザのテーマ名が格納されています。第1世代・第2世代テーマ間でスタイルなどを切り替える必要がある場合に使用します。
取り得る値は下記のコードを参考にしてください。

https://github.com/Implem/Implem.Pleasanter/blob/fa01115f6c2e526f8e6660963c35b57f58dc3dfc/Implem.Pleasanter/App_Data/Definitions/Definition_Column/Tenants_Theme.json

`ChoicesText`に格納されています。

```js:取得コード例
$('#Theme').val();
```

### TableName
`$p.tableName`のデータ源泉です。サイトの種類が格納されています。

### Controller
`$p.controller`のデータ源泉です。コントローラ[^path]の種類が格納されています。

### Action
`$p.action`のデータ源泉です。アクション[^path]の種類が格納されています。

### Id
`$p.id`のデータ源泉です。ID[^path]が格納されています。

### TenantId
マルチテナントモードで運用している場合にテナントIDが格納されています。Pleasater.net以外のセルフホスティングの場合は、通常はシングルテナントで運用するため値は`0`に固定されます。

```js:取得コード例
$('#TenantId').val();
```

### SiteId
`$p.siteId`のデータ源泉です。サイトIDが格納されています。

### JoinedSites
デーブルに対してリンクされているテーブルの情報が格納されています。

```js:取得コード例
JSON.parse($('#JoinedSites').val());
```

```json:取得例
[
	{
		"SiteId": 3526345,
		"ReferenceType": "Results",
		"Title": "記録テーブル(子テーブル)"
	},
	{
		"SiteId": 3526346,
		"ReferenceType": "Issues",
		"Title": "期限付きテーブル(親テーブル)"
	}
]
```

### ReferenceType
`TableName`とほぼ同値になります。

```js:取得コード例
$('#ReferenceType').val();
```

### Columns
記録テーブル・期限付き記録テーブルの一覧表示の場合に、表示されている列の情報が格納されています。

```js:取得コード例
JSON.parse($('#Columns').val());
```

```json:取得例
[
	{
		"ColumnName": "ClassA",
		"LabelText": "親テーブル"
	},
	{
		"ColumnName": "Title",
		"LabelText": "子タイトル"
	},
	{
		"ColumnName": "ClassB",
		"LabelText": "分類B"
	},
	{
		"ColumnName": "DateB",
		"LabelText": "日付B"
	},
	{
		"ColumnName": "NumB",
		"LabelText": "数値B"
	},
	{
		"ColumnName": "Manager",
		"LabelText": "管理者"
	},
	{
		"ColumnName": "Owner",
		"LabelText": "担当者"
	},
	{
		"ColumnName": "ResultId",
		"LabelText": "ID"
	},
	{
		"ColumnName": "Status",
		"LabelText": "状況"
	},
	{
		"ColumnName": "Body",
		"LabelText": "内容"
	},
	{
		"ColumnName": "TitleBody",
		"LabelText": "タイトル/内容"
	},
	{
		"ColumnName": "UpdatedTime",
		"LabelText": "更新日時"
	},
	{
		"ColumnName": "Comments",
		"LabelText": "コメント"
	},
	{
		"ColumnName": "Updator",
		"LabelText": "更新者"
	},
	{
		"ColumnName": "Ver",
		"LabelText": "バージョン"
	},
	{
		"ColumnName": "ClassC",
		"LabelText": "分類C"
	},
	{
		"ColumnName": "NumA",
		"LabelText": "数値A"
	},
	{
		"ColumnName": "DateA",
		"LabelText": "日付A"
	},
	{
		"ColumnName": "DescriptionA",
		"LabelText": "説明A"
	},
	{
		"ColumnName": "AttachmentsA",
		"LabelText": "添付ファイルA"
	},
	{
		"ColumnName": "AttachmentsB",
		"LabelText": "添付ファイルB"
	},
	{
		"ColumnName": "ClassA~3526346,Title",
		"LabelText": "親タイトル"
	}
]
```

### ReplaceFieldColumns
サーバスクリプトの`columns`でフィールドに対して操作をおこなったフィールドの情報が格納されています。

```js:取得コード例
JSON.parse($('#ReplaceFieldColumns').val());
```

```json:取得例
["ClassA", "CheckB"]
```

### Log
サーバスクリプトなどでセットされたログ情報をコンソールに吐き出すときに使用する項目です。

### AnchorTargetBlank
[編集画面を新しいタブで開く](https://pleasanter.org/ja/manual/table-management-open-edit-in-new-tab)が有効になっているときに`1`が格納されます。

### data-validation-maxlength-type
パラメータの`Validation.json`の`MaxLengthCountType`の値が格納されています。通常、ユーザ操作では触らないので説明は省略します。

### data-validation-maxlength-regex
パラメータの`Validation.json`の`SingleByteCharactorRegexClient`の値が格納されています。通常、ユーザ操作では触らないので説明は省略します。

### BackUrl
`window.history.previous`で取得出来るURLと同等のデータが格納されています。違いとしてはプリザンター内部でのURL書換は除外されているデータが格納されているため、Ajax未使用時の編集画面リロードなどの影響を除外したURLを取得することが出来ます。

```js:取得コード例
$('#BackUrl').val();
```

## まとめ
今回はスクリプトで使用可能な変数群を紹介しました。これが使えると多言語対応やマルチロケール「ユーザ毎の差違」を吸収できるスクリプトを吸収できるスクリプトが書きやすくなります。是非使ってみてください。

[^path]: プリザンターのURLは`/{コントローラ}/{ID(Site,Result etc.)}/{アクション}`という構成になっています。