Skip to content

フォルダでサーバースクリプトを動かす ​

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

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フォルダに一括削除がない対象外

改修箇所 ​

#ファイル内容
1Models/Sites/SiteUtilities.csServerScriptDialog の enclosedCss を、Sites のときも実行条件を表示するように変える。対象外の条件は個別に隠す
2Libraries/Settings/ApiSiteSetting.csServerScriptRefTypes に "Sites" を足す
3Models/Sites/SiteModel.csCreate・Update・Delete の前後に SetByBefore〜ServerScript・SetByAfter〜ServerScript の呼び出しを足す
4Libraries/ServerScripts/ServerScriptUtilities.csValues()・SavedValues() に SiteModel の分岐を足し、SiteName・SiteGroupName・ReferenceType・ParentId・InheritPermission・Publish・DisableCrossSearch などを model・saved に入れる

期限付きテーブル・記録テーブルの呼び出しは CodeDefiner のテンプレートから生成されていますが、SiteModel.cs は手で保守されている部分が多いので、テンプレートではなく SiteModel.cs を直接変えます。

図を読み込み中…

SiteModel への呼び出しの追加(イメージ) ​

csharp
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 などで扱うので、この除外条件は変えなくて構いません。

関連ページ ​

変更履歴

第1版サーバースクリプトの仕組み・項目の変更可否・拡張サーバースクリプトの解説と、関連する改修・設計メモを追加