この記事で分かること
WEB フォームで、ログインしているユーザーの氏名や所属を入力欄の初期値に入れたい、ロール(権限)によって項目の表示・非表示を切り替えたい、という場面は多くあります。consentFlow の WEB フォームでは、これらを cfGlobal(フォームから読める共通情報)、フォームスクリプト(cfAPI.form.onNew など)、条件表示(customConditional) で行います。この記事では、読める情報の一覧と、新規作成時の初期値への設定、ロールや編集モードによる表示の切替の書き方を説明します。
対象: フォームビルダーでフォームを作る方。consentFlow 4.4.0 以降(手順 1 の onNew は 4.4.0 から)。
Notes/Domino から移行する方へ: Notes のフォームでは
@UserNameやnames.nsfの参照、ロールによる表示の切替で同じことをしていました。@UserNameは「いまログインしている人の名前を返す式」、names.nsfは Domino のディレクトリ(ユーザーや所属の名簿)、ロールは Domino のアクセス制御リスト(ACL)でユーザーに付ける権限の名前です。この記事では、これらに当たる consentFlow の書き方を説明します。Notes/Domino を使ったことがない方は、この注釈は読み飛ばして構いません。
前提: フォームから読める共通情報
WEB フォームのスクリプト(計算値、条件表示、検証など)からは、cfGlobal という名前で、開いている文書とログインユーザーの情報を読めます。サーバーへの問い合わせは発生しません。
| 読み方 | 内容 | 例 |
|---|---|---|
cfGlobal.currentUserName |
ログインユーザーの正式な名前(階層名) | CN=cFlow Admin/O=consentFlow |
cfGlobal.currentUserKanjiName |
ログインユーザーの表示名(漢字名。従業員情報に登録がある場合) | 山田 太郎 |
cfGlobal.sectionCode / cfGlobal.sectionName |
ログインユーザーの所属コード/所属名 | 1010 / 総務部 |
cfGlobal.postName |
役職名 | 課長 |
cfGlobal.isNewNote |
新規作成中の文書か | true / false |
cfGlobal.editable |
編集モードか(参照モードなら false) |
true / false |
cfGlobal.statusNo |
ワークフローの現在のステータス番号(未申請は空) | ''、10 |
cfGlobal.applicationNo |
申請番号(未採番は空) | 7-00003 |
cfGlobal.docid |
文書の ID(新規作成中は仮の ID) | — |
cfGlobal.lang / cfGlobal.webFormRevisionNo |
表示言語/フォームのリビジョン | ja / kitchensink |
サーバー側の値を読む方法は3つあり、使い分けの目安は次のとおりです。
cfGlobal— 上の表の情報。問い合わせなしで最速。まずこれで足りるかを見るcfAPI— 現在の文書や他の DB の文書の項目を読む(cfAPI.getDb().getDocByUnid(...)など)。新規作成中は文書がまだ無いのでcfGlobal.isNewNoteで飛ばす- ビュー・文書の参照(REST) — マスタのビューから複数件を取るとき(別記事「選択肢を他の DB・ビューから取り込む」)
手順 1: 氏名・所属を初期値に入れる
申請者の氏名と所属を、文書を新規作成したときに1回だけ自動で入れる例です。consentFlow 4.4.0 からは、フォームスクリプトの cfAPI.form.onNew に処理を書きます。
- 氏名と所属を入れるテキストフィールド(例:
applicantName、applicantSection)を置きます。保存する項目にしておきます - HTML 要素(htmlelement)のコンポーネントを 1 つ置き、キーを
scriptBlock、表示の設定を非表示(hidden)にします。その本文に、次の JavaScript を書きます(フォームスクリプトの置き方の詳細は「WEB フォームを開いたときに「1回だけ」処理を実行する」を参照)
cfAPI.form.onNew(function (ctx) {
ctx.set('applicantName', cfGlobal.currentUserKanjiName || cfGlobal.currentUserName || '');
ctx.set('applicantSection', cfGlobal.sectionName || '');
});
ポイント:
onNewは新規作成したときだけ呼ばれます。承認者が開いたときに承認者の名前で上書きされることはなく、「申請時点の所属」が保存されます。異動後に文書を開いても、保存された値がそのまま残ります- 文書を開くたびに実行したい処理は
cfAPI.form.onOpen(参照モードでも実行。部分更新で再実行しない)、フォームが描き直されるたびに実行したい処理はcfAPI.form.onReadyに書きます。呼ばれる順番は onNew → onOpen → onReady です - 「初期値(defaultValue)」の設定に動的な式を書かないでください。公開時に評価した値が固定されます
- 4.4.0 より前の環境では、計算値(Calculated Value)に
cfGlobal.isNewNote && !valueのガードを付けて書く方法があります(「WEB フォームを開いたときに「1回だけ」処理を実行する」の末尾を参照)
手順 2: ロールで項目の表示・非表示を切り替える
「管理者ロールを持つ人にだけ、備考欄を見せる」のような切り替えです。
- 対象のコンポーネント(またはパネル)の「条件」の設定で 高度な条件(customConditional) を開きます
- 次のように書きます(ロール名は Domino の ACL に登録した名前)
show = (typeof cfAPI !== 'undefined') && cfAPI.getDb().hasRole('[Manager]');
cfAPI.getDb().hasRole('[ロール名]')は、ログインユーザーが現在のアプリの DB でそのロールを持っていればtrueを返しますcfAPI.getDb().getAccessLevel()でアクセスレベル(読者・作成者・編集者 など)を、hasAccessPrivilege(...)で個別の権限を確認することもできます- 条件表示は画面上の表示を切り替えるものです。項目の値そのものを守る必要がある場合は、参照制限(アプリケーション設定)や ACL で制御してください
手順 3: 編集モードと参照モードで出し分ける
入力中だけ表示したい注意書きや、参照時だけ表示したいバッジは、cfGlobal.editable で切り替えます。
// 編集モードのときだけ表示
show = (typeof cfGlobal === 'undefined') || cfGlobal.editable === true;
// 参照モードのときだけ表示
show = (typeof cfGlobal !== 'undefined') && cfGlobal.editable === false;
typeof cfGlobal === 'undefined' を入れているのは、フォームビルダーのプレビューでは cfGlobal が無いためです。プレビューでも見えるように、未定義のときは表示する側に倒しています。
結果の確認
- 手順 1: 新規作成すると氏名・所属が入り、保存して別のユーザー(承認者)が開いても申請者の名前のまま
- 手順 2: ロールを持つユーザーと持たないユーザーで、項目の表示が変わる
- 手順 3: 編集ボタンを押す前後で、注意書きの表示が切り替わる
デモ環境の「キッチンシンク」フォームの上部パネル(cfGlobal ライブ表示)と「ロジック・UI」タブに、動く例があります。
注意
cfGlobalの所属・役職は、従業員情報(外部の従業員 DB や部門マスタ)から来ます。空になる場合は、ログインユーザーが従業員情報に登録されているかを確認してください- フォームビルダーのプレビューでは
cfGlobalもcfAPIも未定義です。必ずtypeofで確認してから使ってください - 条件表示で隠した項目の値は、設定によっては送信時にクリアされます(clearOnHide)。値を保持したまま隠したい場合は、その設定を確認してください
関連記事
- WEB フォームを開いたときに「1回だけ」処理を実行する
- 選択肢を他の DB・ビューから取り込む(準備中)
- consentFlow API の利用

