フォルダでサーバースクリプトを動かす
1.5.8.1 のプリザンターでは、フォルダ(ReferenceType が Sites のサイト)で動くサーバースクリプトの条件は「サイト設定の読み込み時」(WhenloadingSiteSettings)だけです。このページは、フォルダの作成・更新・削除・画面表示の前でもサーバースクリプトを動かせるようにする本体改修の設計メモで、本体の標準機能ではありません。
前提にした現行実装(なぜ動かないか)は サーバースクリプトの内部構造 の「フォルダ(Sites)で動く条件」にまとめています。要点は次の 3 つです。
- 管理画面のサーバースクリプトのダイアログで、
Sitesのときは実行条件の欄がhiddenになっている(SiteUtilities.cs#L17937-L17947) - API でサーバースクリプトを登録できる
ServerScriptRefTypesがResults・Issuesだけ(ApiSiteSetting.cs#L13-L17) SiteModelのCreate・Update・DeleteがSetBy〜ServerScriptを呼ばない
SiteModel は BaseItemModel を継承しているので、SetByBeforeCreateServerScript などのメソッド自体は既に使えます。新しい仕組みを作る必要はなく、呼び出しを足すのが中心になります。
対象にする条件
| 条件 | フォルダでの用途 | 対象 |
|---|---|---|
WhenloadingSiteSettings | 現行どおり | 対応済み |
BeforeCreate・AfterCreate | 作成前の入力チェック・初期値、作成後の通知・連携 | 対象 |
BeforeUpdate・AfterUpdate | 変更前のチェック、変更後の通知・連携 | 対象 |
BeforeDelete・AfterDelete | 削除前の依存チェック、削除後の後始末 | 対象 |
BeforeOpeningPage | フォルダの画面を開く前の制御 | 対象 |
WhenViewProcessing・WhenloadingRecord・BeforeOpeningRow | フォルダにはビュー処理・レコード・行表示がない | 対象外 |
BeforeFormula・AfterFormula | フォルダに計算式がない | 対象外 |
BeforeBulkDelete・AfterBulkDelete | フォルダに一括削除がない | 対象外 |
改修箇所
| # | ファイル | 内容 |
|---|---|---|
| 1 | Models/Sites/SiteUtilities.cs | ServerScriptDialog の enclosedCss を、Sites のときも実行条件を表示するように変える。対象外の条件は個別に隠す |
| 2 | Libraries/Settings/ApiSiteSetting.cs | ServerScriptRefTypes に "Sites" を足す |
| 3 | Models/Sites/SiteModel.cs | Create・Update・Delete の前後に SetByBefore〜ServerScript・SetByAfter〜ServerScript の呼び出しを足す |
| 4 | Libraries/ServerScripts/ServerScriptUtilities.cs | Values()・SavedValues() に SiteModel の分岐を足し、SiteName・SiteGroupName・ReferenceType・ParentId・InheritPermission・Publish・DisableCrossSearch などを model・saved に入れる |
期限付きテーブル・記録テーブルの呼び出しは CodeDefiner のテンプレートから生成されていますが、SiteModel.cs は手で保守されている部分が多いので、テンプレートではなく SiteModel.cs を直接変えます。
図を読み込み中…
SiteModel への呼び出しの追加(イメージ)
public ErrorData Update(Context context, SiteSettings ss, /* ... */)
{
SetByBeforeUpdateServerScript(context: context, ss: ss); // 追加
if (context.ErrorData.Type != Error.Types.None)
{
return context.ErrorData; // context.Error で中止できるように
}
// ... 既存の更新処理 ...
SetByAfterUpdateServerScript(context: context, ss: ss); // 追加
return new ErrorData(type: Error.Types.None);
}Delete も同じ形で前後に足します。
注意点
作成前にはサーバースクリプトの定義がない
1.5.8.1 の SiteModel.Create は、最初に SiteSettings = new SiteSettings(context, referenceType) で空のサイト設定を作ります(SiteModel.cs#L2345-L2350)。作ろうとしているフォルダのサイト設定にはまだサーバースクリプトが無いので、そのままでは BeforeCreate で動かすスクリプトがありません。親フォルダのサイト設定からスクリプトを取って実行する、といった別の設計が必要です。
削除は子サイトごと消える
SiteModel.Delete は、配下のサイトとそのレコードをまとめて削除します(SiteModel.cs#L1512-L1530)。BeforeDelete で削除対象の子サイトをスクリプトに見せるかどうかを決める必要があります。
入れ子の実行
スクリプトから items.Update などでサイトを操作すると、そのサイトのサーバースクリプトがさらに動く可能性があります。サーバースクリプトの入れ子は深さ 10 未満で止まる仕組み(ServerScriptUtilities.cs#L1189-L1192)がサイト操作でも効くことを確かめてください。
WhenloadingSiteSettings の除外条件はそのままでよい
サイト自身の編集・更新・削除などのアクションでは WhenloadingSiteSettings が動かないようになっています(_BaseModel.cs#L758-L787)。作成・更新・削除は新しく足す BeforeCreate などで扱うので、この除外条件は変えなくて構いません。