這篇和「流程規劃師」那篇一樣,不談表單該怎麼設計,只講「手要怎麼動」:表單範本清單頁有什麼、設計器的畫面分幾塊、元件怎麼拖進去、編輯對話框七個分頁各管什麼、中文欄位名稱為什麼會存不進去、風格與底圖怎麼設、儲存和版本怎麼算。最後補一張常見狀況速查表。
操作環境是 BeakPlatform 的表單流程模組。設計器的進入路徑是左側選單的「表單範本」,網址是 /forms/templates。畫布本身是 form.io 的 builder(5.3.1 版),拖欄位、改屬性那套是它的;本篇把篇幅放在 BeakPlatform 自己加上去的部分,form.io 原生的操作只給速查。表單做好之後怎麼和流程接起來、填單的人看到什麼,是下一篇「配對與表單中心」的事。
進到 /forms/templates,右上角三顆按鈕:[重新載入]、[匯入]、[+ 新增表單模板],按鈕左邊是搜尋框與「清單/縮圖」兩種檢視的切換。預設是縮圖模式,每張卡片是表單的縮圖,點卡片直接進設計器;縮圖是每次儲存後在背景產生的,剛存完回到清單會空個幾秒再出現。
搜尋框下方一排分類晶片,父分類底下有子分類的會顯示成「父 / 子」,晶片上的數字是該分類的表單數。清單只顯示選中那一個分類的表單,切換後會記住,下次進來還是同一個分類。

(圖01:表單範本清單頁,縮圖模式,標出 [+ 新增表單模板]、檢視切換、分類晶片)
切到清單模式,表格欄位是:名稱、代碼、描述、版本、配對、狀態、更新時間、操作。幾個欄位的意思:
| 欄位 | 內容 |
|---|---|
| 代碼 | 建立時留空會自動產生,像 FORM_WFCD7678D8_11BB;自己填會轉成大寫。匯入時代碼重複的會跳過 |
| 版本 | 兩個英文字母加一個數字,例如 AA3。字母是版本(AA、AB⋯一路到 ZZ),數字是修訂號,每儲存一次加 1 |
| 配對 | 這張表單有沒有被「配對管理」接上流程。有的顯示「已配對」 |
| 狀態 | 啟用/停用。停用的表單不會出現在填單的清單裡 |
| 操作 | [編輯] 進設計器、[結構] 彈出唯讀的 JSON、[規格] 開欄位規格編輯器 |
清單模式才有勾選框。勾了任何一筆,表格上方會出現批次工具列:[反選]、[匯出]、[另存新版]、[刪除]。刪除只在這裡,每一列的操作欄沒有刪除鍵。刪除前系統會先查這張表單有沒有被配對使用,有的話對話框裡會列出流程名稱與是否已發行,並提醒「刪除後配對將無法重新發行,但不影響已執行的流程」。
[+ 新增表單模板] 開一個對話框:名稱(必填)、代碼(留空自動產生)、分類、描述、啟用。按 [建立表單模板] 之後直接進設計器,畫布上已經有一個置中的表單名稱標題。

(圖02:新增表單模板對話框)
[匯入] 吃的是 [匯出] 產生的 JSON 檔(一個 items 陣列),可以一次帶多張;設計器裡的「上傳範本」則是吃單張表單的 schema,兩者不通用,第十節再講。
進入設計器後,畫面分成三塊:上方兩列工具列、左欄元件清單、右邊的畫布。沒有右欄,元件的屬性是用對話框改的。

(圖03:設計器全貌,標出工具列第一列、第二列、左欄、畫布)
第一列是「這張表單是誰」與儲存類按鈕:
| 項目 | 說明 |
|---|---|
| 表單檔名 | 清單頁看到的名稱。留空按儲存會被擋 |
| 版本標記 | 灰色小徽章,例如 AA1。按 [儲存] 後數字會跟著跳 |
| 分類下拉 | 和清單頁的分類相同 |
| 描述 | 選填 |
| [儲存] | 存檔不離開,右上角跳「儲存成功」 |
| [儲存並離開] | 存檔後回清單頁 |
| [另存新版] | 複製成新版本,字母進一位。細節在第十一節 |
| [放棄] | 不存檔離開。有未儲存變更會先問一次 |
第二列是工具與樣式:
| 項目 | 說明 |
|---|---|
| [載入範本] | 從四個內建範本挑一個,會整個覆蓋目前的畫布 |
| [上傳範本] | 選一個 .json 檔套進畫布,同樣整個覆蓋 |
| [底圖] | 設定表單背景圖,第九節 |
| [表單預覽] | 以填單者看到的樣子開一個可以輸入的預覽 |
| [列印預覽] | 唯讀版預覽,右上角有 [列印] |
| [Schema] | 彈出目前的 JSON,可以直接改再套用 |
| [規格] | 跳到「規格制定」模組,替這張表單建立或開啟欄位規格 |
| 附件上傳 | 勾著的話,填單頁在表單下方多一塊附件區。這和表單裡的「檔案」元件是兩回事 |
| 提示→標籤 | 中文欄位名稱的處理開關,第六節 |
| 風格 | formio預設/建議平行/正式扁平,第九節 |
| 寬度 | 窄 900、寬 1200、不限、自訂(最小 300),第九節 |
左欄最上面是搜尋框,打字會過濾下面所有群組的元件。群組是手風琴式,點標題展開、再點收起,一次只開一個。實際看到的群組與元件如下(括號裡是 form.io 的原名):
| 群組 | 元件 | 備註 |
|---|---|---|
| 基本元件 | 文字欄位、電子郵件、文字區域、數字、電話號碼、密碼、核取方塊、多選方塊、下拉選單、單選按鈕、按鈕 | 預設展開 |
| 平台元件 | 人員選擇、表單名稱 | BeakPlatform 自己寫的,第八節 |
| 系統申請單專用 | API表單選擇、代理限定表單選擇、可委任角色選擇 | 只搭配特定流程節點才有作用,第八節 |
| 進階元件 | 網址、標籤、地址、日期時間、日、時間、貨幣、檔案、問卷調查、簽名 | 「檔案」已接到平台的加密檔案服務 |
| 版面配置 | HTML元素、內容、欄、欄位集、面板、表格、分頁籤、區塊框 | 排版用,不產生資料 |
| 資料 | 隱藏、容器、資料對應、資料表格、編輯表格 | form.io 的巢狀資料結構 |
| 進階功能 | 檔案、巢狀表單、自訂 | form.io 原生的群組,本平台沒有特別處理 |
「平台元件」與「系統申請單專用」兩個群組只有企業管理員以上看得到,一般持有表單設計師角色的員工不會有這兩組。
這一點和流程設計器不同:左欄的元件點一下沒有反應,一定要按住拖到畫布上放開。放開的位置就是它在表單裡的順序,可以放在既有元件之間,也可以放在最上面那個標題的上方。畫布本身沒有右鍵選單、沒有框選,也沒有復原。
放開的那一刻,該元件的編輯對話框會立刻打開(第五節)。按 [取消] 元件還是會留在畫布上,只是用預設屬性。
滑鼠移到畫布上任何一個元件,它的右上角會出現一排六顆小按鈕,由右到左:
| 按鈕 | 動作 |
|---|---|
| 齒輪 | 編輯,開對話框 |
| 十字箭頭 | 按住拖動,換位置 |
| 複製 | 複製這個元件 |
| 貼上 | 把剛複製的貼在這個元件後面 |
| 編輯 JSON | 直接改這一個元件的 JSON |
| 紅色 X | 移除,不會再問 |

(圖04:滑鼠移到元件上出現的六顆小按鈕)
要調整版面(兩欄並排、分頁籤),先拖「版面配置」群組的容器進畫布,再把欄位拖進容器的格子裡。容器的格子在畫布上是虛線框,拖進去放開就算。
每個輸入型元件的對話框都長一樣:左邊七個分頁,右邊是即時預覽,下面 [儲存]、[取消]、[移除]。分頁內容是 form.io 的,這裡只列會用到的:
| 分頁 | 常用項目 |
|---|---|
| 顯示 | 標籤(必填)、標籤位置、標籤寬度、提示文字、描述、前綴後綴、輸入遮罩、隱藏、停用 |
| 資料 | 預設值、多個值、文字大小寫、截斷多餘空格、計算值 |
| 驗證 | 必填、最小/最大長度、正規表示式、自訂錯誤訊息 |
| API | 屬性名稱(就是欄位的 key)、欄位標籤、自訂屬性 |
| 條件 | 當某個欄位等於某值時才顯示 |
| 邏輯 | 進階邏輯,一般用不到 |
| 版面配置 | HTML 屬性 |

(圖05:文字欄位的編輯對話框,顯示分頁,右側有即時預覽)
七個分頁裡最要緊的是 API 分頁的「屬性名稱」。它是這個欄位在資料裡的名字,流程節點讀欄位、寫欄位、分支條件、外部系統用 API 建單,認的都是它,不是畫面上的標籤。第七節再說它的用途,第六節先講它在中文環境會踩到的坑。
把一個文字欄位拖進畫布,在「顯示」分頁把標籤改成「申請人姓名」,再按 [儲存]。結果是儲存被擋下來,對話框上方出現一段英文:
The property name must only contain alphanumeric characters, underscores,
dots and dashes and should not be ended by dash or dot.
原因在 API 分頁:form.io 會依標籤自動產生屬性名稱,標籤是中文,它就產生「申請人姓名」當屬性名稱,然後又用「只准英數、底線、點、連字號」的規則驗證它,自己把自己擋住了。標籤是英文時沒事,Applicant Name 會自動變成 applicantName。

(圖06:標籤填中文後按儲存,被屬性名稱的驗證擋下的畫面)
兩種做法:
做法一:到 API 分頁自己填屬性名稱。 標籤照填中文,切到 API 分頁把「屬性名稱」改成英文,例如 applicant_name,再儲存就過了。欄位不多的時候這樣最直接。
做法二:用「提示→標籤」。 這是平台替中文環境加的機制,工具列第二列那個勾選框預設是開的。做法是標籤不動(留著 form.io 給的 Text Field),把中文填在「顯示」分頁的「提示文字」裡,按 [儲存]:
| 提示文字填什麼 | 儲存後的標籤 | 儲存後的提示文字 | 屬性名稱 |
|---|---|---|---|
申請人姓名 |
申請人姓名 | (空) | textField |
申請人姓名||請輸入全名 |
申請人姓名 | 請輸入全名 | textField |
兩個直線 || 是分隔符,前段變標籤、後段留在提示文字。屬性名稱維持 form.io 從英文標籤產生的那個,所以若同一張表單拖了第二個文字欄位,會自動變成 textField1。想要有意義的名稱,拖進來時先把英文標籤改成想要的(例如 Applicant,屬性名稱會跟著變成 applicant),再填中文提示文字。

(圖07:提示文字填「申請人姓名||請輸入全名」儲存後,畫布上的欄位標籤與提示文字)
一件要知道的事:這個交換在伺服器端也會做一次。按工具列的 [儲存] 送出去時,後端會再掃一遍整張表單,提示文字含中文的元件一律交換成標籤。所以就算把「提示→標籤」的勾拿掉,提示文字裡的中文在存檔後還是會跑到標籤去;想讓填單者看到中文的提示文字,一定要用 || 把它放在後段。
表單存的資料是一個 JSON,每個欄位用屬性名稱當鍵。認這個鍵的有四個地方:
f.applicant_name,f. 後面接的是屬性名稱。POST /api/trigger/form 的 form_data 用屬性名稱當鍵,給了不存在的鍵會回 400 並列出合法的鍵。所以屬性名稱一旦被流程或外部系統用上,改了就要連著改。改標籤沒關係,改屬性名稱等於換了一個欄位。
另一個會靜默出錯的是「日期時間」元件:預設送出的是含時間與時區的 ISO 字串,流程節點如果只想要 2026-10-10 這種純日期,要在元件的設定裡把儲存格式改成純文字、關掉時間、格式填 yyyy-MM-dd。送出一張後到資料裡看一次值長什麼樣,比事後找為什麼比對失敗快。
「平台元件」兩個:
| 元件 | 用途 |
|---|---|
| 表單名稱 | 置中的 h3 標題,新表單一建立就有一個,內容是表單名稱。設定面板沿用 HTML 元素的 |
| 人員選擇 | 開表單時自動帶入登入者(顯示姓名與部門),按 [選擇] 開部門人員樹改選別人。存進資料的是人員的 secure_code 不是名字。設定面板可以關掉「預設帶入登入者」、設必填 |

(圖08:人員選擇元件按 [選擇] 後彈出的部門人員樹)
「系統申請單專用」三個:API表單選擇、代理限定表單選擇、可委任角色選擇。它們是「API Key 申請單」與「代理指定申請單」的零件,只有搭配 ApiKeyIssue、OpProxyGrant 這兩個流程節點才有作用,放進一般業務表單不會發生任何事。出廠的兩張申請單已經接好,正常情況不需要自己拖。
風格下拉有三個:formio預設、建議平行、正式扁平。新表單預設是「建議平行」,效果是標籤放在欄位左邊、佔 15% 寬。切換風格會立刻改寫畫布上每一個欄位的標籤位置與寬度,之後新拖進來的也照新的;切回 formio預設則把這些屬性全部拿掉,回到標籤在上方的原生樣子。單一欄位想不一樣,在它的「顯示」分頁改標籤位置就好,但再切一次風格會被蓋回去。
寬度三顆按鈕加一個輸入框。新表單預設「寬」1200px,畫布會變成一張置中的白紙,超出的部分看得出來。「不限」等於目前瀏覽器的寬度。輸入框最小 300,點進去沒值時會先帶 1400。這個寬度會一起存起來,填單頁與預覽都照它。
底圖開一個對話框:左邊是目前底圖的預覽,右邊是透明度(預設 30%)、顯示方式(符合、填滿、拉伸、原始大小、拼圖平鋪、拼圖位移交錯)、位置(置中、靠上、靠下、靠左、靠右),下面可以上傳新圖(PNG、JPG、GIF、WebP,最大 5MB)或從圖庫挑。圖庫和流程設計器的「底圖管理」是同一個,那邊傳的圖這邊也看得到。改完按 [套用] 才會生效,[取消] 不留。

(圖09:底圖設定對話框)
[載入範本] 列出四個內建範本:基本表單、請假單、費用報銷單、採購申請單,都是 form.io 的 schema。選一個按 [載入範本],整個畫布被換掉,有未儲存變更會先問一次。表單名稱是空的才會被範本的名稱填上,已經有名稱不會動。
[上傳範本] 選一個 .json,格式是單張表單的 schema(最外層要有 components),一樣整個覆蓋。要留意它和清單頁的 [匯入] 不同:那邊吃的是 [匯出] 產生、帶 items 陣列的檔,這邊吃的是單張 schema,拿錯檔會被擋下來。
[Schema] 彈出目前整張表單的 JSON,可以直接改,按 [套用變更] 立刻反映到畫布,格式錯會在下方顯示錯在哪。要批次改很多欄位的屬性,在這裡改比一個一個開對話框快。套用之後記得按 [儲存],Schema 視窗本身不存檔。
[表單預覽] 開的是可以輸入的預覽,必填、格式驗證都會動,右上角可以切「正常」「全覽」,全覽會把整張表單縮到一個畫面內並顯示縮放比例。[列印預覽] 是唯讀的,右上角 [列印] 直接叫出瀏覽器的列印。兩種預覽都會套上目前的風格、寬度與底圖。

(圖10:表單預覽,切到全覽模式)
| 動作 | 發生的事 |
|---|---|
| [儲存] | 右上角「儲存成功」,版本標記的數字加 1(AA1 變 AA2),縮圖在背景重做。請求 15 秒沒回來會報逾時 |
| [儲存並離開] | 同上,然後回清單頁 |
| [另存新版] | 先問「確定要另存為新版本?」。確定後先把目前的內容存一次,再複製成一筆新記錄,字母進一位(AA 變 AB、AZ 變 BA),修訂號從 1 開始,狀態啟用、未發行。你仍留在目前版本,新版本要回清單頁開。目前版本的修訂號也因為那次儲存加了 1,但畫面上的標記要重新進入才會更新 |
| [放棄] | 有未儲存變更會先問一次。確認後直接回清單頁 |
兩件容易誤判的事:
沒有編輯權限的人開設計器,工具列上方會出現「唯讀模式」的黃色提示,[儲存]、[儲存並離開]、[另存新版] 三顆都是灰的,其他按鈕照常可以看。
| 狀況 | 原因與做法 |
|---|---|
| 元件點了沒反應 | 要拖,不能點。第四節 |
| 標籤填中文按儲存被擋,一段英文錯誤 | 屬性名稱跟著變成中文。到 API 分頁改成英文,或改用提示文字加 ||。第六節 |
| 提示文字填的中文存完跑到標籤去 | 伺服器會強制交換,用 || 把提示放在後段。第六節 |
| 想刪表單找不到按鈕 | 清單頁切到清單模式,勾選後用批次工具列的 [刪除]。第一節 |
| 載入範本後原本的欄位不見了 | 載入是整個覆蓋。沒存檔前按 [放棄] 可以回到上一次儲存的狀態 |
| 上傳範本被擋「缺少 components」 | 拿到的是清單頁匯出的檔。那種要用清單頁的 [匯入] |
| 改了風格,某個欄位特別調過的標籤位置不見了 | 切換風格會改寫所有欄位。先切風格再個別調 |
| 另存新版後畫面還是舊版本 | 設計上就是留在目前版本,新版本回清單開 |
| 剛存完清單上的縮圖是空的 | 背景產生中,幾秒後重新載入 |
| 流程的分支條件一直不成立 | 條件裡用的是標籤不是屬性名稱,或屬性名稱後來被改過。第七節 |
| 日期欄位送出的值不是純日期 | 日期時間元件要改儲存格式。第七節 |
下一篇講「配對與表單中心」:表單做好之後怎麼和流程接起來發行,以及填單的人在表單中心看到什麼。