:::
主內容區域
4-1 調整建立投稿主題的表單界面
- 要修改建立投稿主題的表單介面,就是修改
op_submission_index.tpl子樣板檔,先大致了解一下架構<{if $all_submission|default:false}> 若是 $all_submission 有內容,則秀出表格內容 <{else}> 若是 $all_submission 沒有內容 <div class="alert alert-warning text-center"> <{if $smarty.session.submission_adm|default:false}> 若是對模組有管理權,則顯示「新增資料」的按鈕 <a href="<{$xoops_url}>/modules/submission/setup.php?op=submission_create" class="btn btn-info"> <i class="fa fa-plus"></i> <{$smarty.const._TAD_ADD}> </a> <{else}> 否則就顯示無資料 <h3><{$smarty.const._TAD_EMPTY}></h3> <{/if}> </div> <{/if}> - 目前沒有內容,且使管理員,所以會出現「新增資料」按鈕,若是想修改,請建立新的語系常數或者直接改成中文亦可,其中
<{$smarty.const._TAD_ADD}>是樣板常數的寫法:<a href="<{$xoops_url}>/modules/submission/setup.php?op=submission_create" class="btn btn-info"> <i class="fa fa-plus"></i> <{$smarty.const._TAD_ADD}> </a> - 可以修改成這樣:
<a href="<{$xoops_url}>/modules/submission/setup.php?op=submission_create" class="btn btn-info"> <i class="fa fa-plus"></i> 建立投稿主題 </a> - 表單界面的動作是
create,會產生以下規則:- 老師建立投稿主題,存入的資料表是
submission,流程的$op值是submission_create,呼叫的物件方法就是Submission::create(),對應樣板則是op_submission_create.tpl - 學生去投稿,存入的資料表是
submission_data,流程的$op值是submission_data_create,呼叫的物件方法就是Submission_data::create(),對應樣板則是op_submission_data_create.tpl
- 老師建立投稿主題,存入的資料表是
- 因此,要修改建立投稿主題的表單界面,就是去修改
op_submission_create.tpl樣板檔,Submission::create()會負責傳地方相關的變數以及 JS 或 CSS 給該樣板使用。 - VSCode中,Ctrl+P,貼上檔名,可以快速開啟,不用找半天。
- 這是一個表單,表單的基本架構:
<form action="<{$smarty.server.PHP_SELF}>" method="post" id="myForm" enctype="multipart/form-data" class="form-horizontal"> 各種表單元件 <div class="bar text-center"> 其他各種隱藏表單元件 <{$token_form|default:''}> <input type="hidden" name="op" value="<{$next_op|default:''}>"> <button type="submit" class="btn btn-primary">送出按鈕</button> </div> </form>- 表單要有
id,才能搭配class="validate[required]"來檢查必填欄位 - 若有使用上傳功能,表單必須有
enctype="multipart/form-data" <{$token_form|default:''}>用來防止偽造表單用
- 表單要有
- 每一組表單元件的基本架構
<!--表單元件註解--> <div class="form-group row mb-3"> <label class="col-md-2 control-label col-form-label text-md-right text-md-end"> 表單元件標題 </label> <div class="col-md-10"> 表單元件 </div> </div>form-group是BootStrap的用法,用來設定一組有標籤,有元件的表單- 目前這種寫法是相容BootStrap3~BootStrap5的寫法
class="col-md-x"用來決定顯示寬度,左右合計必須為12
- 先改掉「詳細資訊」,用之複製為「投稿密碼
info[pass_code]」、「允許投稿的年級info[grade][]」、「獎項設定info[award]」等延伸的表單元件<div class="form-group row mb-3"> <label class="col-md-2 control-label col-form-label text-md-right text-md-end"> 投稿密碼(非必須) </label> <div class="col-md-10"> <input type="text" name="info[pass_code]" id="info-pass_code" class="form-control" value="<{$info.pass_code}>" placeholder="投稿密碼"> </div> </div> <div class="form-group row mb-3"> <label class="col-md-2 control-label col-form-label text-md-right text-md-end"> 獎項設定 </label> <div class="col-md-10"> <input type="text" name="info[award]" id="info-award" class="form-control validate[required]" value="<{$info.award}>" placeholder="獎項設定"> </div> </div> - 有時候,懶的自己做表單元件,也可以叫AI來做,例如:
請製作XOOPS的樣板片段(Smarty標籤格式為<{}>),搭配BootStrap5來建立一到九年級的行內複選框,name為info[grade] - 然後我們就得到了類似這樣的回答:

- 整合自己的樣板檔中,並稍做調整:
<div class="form-group row mb-3"> <label class="col-md-2 control-label col-form-label text-md-right text-md-end"> 允許投稿的年級 </label> <div class="col-md-6"> <{foreach from=[1,2,3,4,5,6] item=grade}> <div class="form-check form-check-inline"> <input class="form-check-input" type="checkbox" id="grade_<{$grade}>" name="info[grade][]" value="<{$grade}>" <{if $info.grade|is_array && $grade|in_array:$info.grade}>checked<{/if}>> <label class="form-check-label" for="grade_<{$grade}>"><{$grade}> 年級</label> </div> <{/foreach}> </div> </div>- AI提供的語法並沒有考慮到修改的部份,也就是修改時如何呈現使用者之前勾選的項目
- 每個 checkbox 若要勾選,可以加入
checked參數 - 所以我們加入
<{if $grade|in_array:$info.grade}>checked<{/if}>用來判斷,目前迴圈跑到的值,是否有在存在資料庫的陣列中,若有那麼就顯示checked $grade|in_array:$info.grade的用法是在Smarty中使用PHP函數的用法,in_array()是判斷指定值是否有在陣列中,原本在PHP應該是這樣:
到了Smarty,需要將第一個參數,放到最左邊,接著用in_array($grade, $info['grade'])|來接著函數名稱,若還有第二個、第三個參數,依序用:隔開即可<{$grade|in_array:$info.grade}>
- 隱藏欄位部份:務必加上 create_time 的隱藏欄位,更新時,才能保留建立時間
<div class="bar text-center"> <!--建立時間--> <input type='hidden' name="create_time" value="<{$create_time}>"> <{$token_form|default:''}> <input type="hidden" name="op" value="<{$next_op|default:''}>"> <input type="hidden" name="id" value="<{$id}>"> <button type="submit" class="btn btn-primary"><i class="fa fa-floppy-disk" aria-hidden="true"></i> <{$smarty.const._TAD_SAVE}></button> </div>
4. create 表單界面 