Etable/form
出自六年制學程
目錄
六階段流程說明
(一)form_edit與form_ins
form_edit($row=array()) | form_ins() |
---|---|
new XoopsThemeForm 得到 form 物件 | |
每欄處理一輪: | |
剔除演算式且沒有表代名之欄 | |
留下允許編或允計插之欄 | |
hidden/both或hidden/edit |
hidden/both或hidden/ins或hidden/ins_only |
unix_time/both或unix_time/edit |
unix_time/both或unix_time/ins或unix_time/ins_only |
其他可編之欄,以addElements($i,$row[$i])處理 |
其他可插之欄,以: |
不可編之欄送出addElement(new XoopsFormLabel(欄代名,$row[$i]),0) |
不可插之欄送出addElement(new XoopsFormLabel(欄代名,DONTINSERT),0) |
(二)addElements($i,$value)
- 處理會員欄,「$value=$xoopsUser->getVar('uname');」是以 xoops 為外套時期使用,應移除
- 處理formType中各欄,除hidden、wrap以外諸欄
- unix_time:出時分秒小日曆
- date:出日期小日曆
- time:用 XoopsFormTime
- datetime:用 XoopsFormDateTime
- select:用 XoopsFormSelect 及其中的 addOptionArray(選項陣列)
- searchSelect:用 XoopsFormSelect 及其中的 addOptionArray(選項陣列)
- select2:用 XoopsFormSelect 及其中的 setExtra(" onChange='createOpt…'",false)、addOptionArray(選項陣列)
- radio:用 XoopsFormRadio 及其中的 addOptionArray(選項陣列)
- checkbox或bitCheckbox:用 XoopsFormCheckBox(欄代名,'f[表代名][欄名]',核取陣列或null) 及其中的 addOptionArray(選項陣列)。bitCheckbox 由 $value 拆解出各bit組合,成為預選值。
- radioyn:用 XoopsFormRadioYN
- auto:用 XoopsFormTextArea
- rangeNumber:用 XoopsFormRangeNumber ,限制輸入範圍的數值,如「成績分數」
- file:用 XoopsFormFile 盤,前為路徑選單,後為上傳按鈕
- text:用 XoopsFormText ,可加 showColExplain
- 其他(如 function):用 XoopsFormText
- 處理不在formType中的各欄,依coltype產生表單元素
- blob/binary:XoopsFormLabel(表代名,BIDNT)
- blob/非binary:XoopsFormTextArea
- 其他:XoopsFormText
(三) javascript 中的表達
formType | HTML | javascript | PHP | |
---|---|---|---|---|
select | name='f[表名][欄名]' id='f[表名][欄名]' | document.getElementsByName('f[表名][欄名]')[0].value document.getElementById('表單名').elements[第幾].value | select-one | $_POST['f']['表名']['欄名'] |
radio | name='f[表名][欄名]'多個相同 id='f[表名][欄名]0' id='f[表名][欄名]1' … | document.getElementsByName('f[表名][欄名]')[0].value document.getElementsByName('f[表名][欄名]')[1].value … document.getElementById('表單名').elements[第幾].value 「第幾」跳號選項次 核選的 checked 為 true 未核選的 checked 為 false | radio | 全未選不後送 核選則$_POST['f']['表名']['欄名'] |
checkbox (單選) | name='f[表名][欄名]' id='f[表名][欄名]0' | document.getElementsByName('f[表名][欄名]')[0].value document.getElementById('表單名').elements[第幾].value 核選的 checked 為 true 未核選的 checked 為 false | checkbox | 未選不後送 核選則$_POST['f']['表名']['欄名'] |
checkbox (複選) | name='f[表名][欄名][]' id='f[表名][欄名]0' id='f[表名][欄名]1' … | document.getElementsByName('f[表名][欄名][]')[0].value document.getElementsByName('f[表名][欄名][]')[1].value … document.getElementById('表單名').elements[第幾].value 「第幾」跳號選項次 核選的 checked 為 true 未核選的 checked 為 false | checkbox | 全未選不後送 核選則$_POST['f']['表名']['欄名']陣列 |
- getElementsByName 的 Elements 是複數加's',可以有很多同 name 的元素,即使只有一個,也要加 [0] 表示第一個
而 getElementById 的 Element 是單數,只應傳回一個,不用加 [0] - .value 可以換成 .name 或 .type 或 .checked 或 .length
(四)colValue($j,$value,$row)
formType中只有特定表現沒有專用表單元素:
- '長欄名'=>array('function',函式名),請參考範例
- '長欄名'=>array('wrap'),$value中的半形分號「;」代換為換行<br/>
(五)main()中單筆資料前置處理,含插畢、刪一筆、編一筆
在編畢與插畢中,if(is_array($value)){…}裡面
- 是 datetime :綜合 $value['date'],$value['pm'],$value['hour'],$value['min'] 得出年月日時分秒字串
- 是 time :綜合 $value['hour'],$value['min'] 得出時分秒字串
- 是 bitCheckbox :將各元素值加總
(六)main()中蒐尋表單傳入值前置處理
欄名必須在 search 陣列中
- 欄名在 searchId 陣列中,條件用「該欄欄名='蒐尋表單傳回值'」
- formType[欄名][0]=='bitCheckbox',條件用「該欄欄名&蒐尋表單傳回值=蒐尋表單傳回值」
- 其他情形,條件用「該欄欄名 like '%蒐尋表單傳回值%'」
(七)main()輸出蒐尋排序表單
- 日期欄用 text 型 input 輸入年月
- select欄、radio欄、bitCheckbox欄:出 select 選單
- checkbox欄:出核取方塊,選取有選的。其實 checkbox 應有三種蒐尋樣態,有選的、沒選的、全部。本段應改成選單。
表單物件應用
$表單=new XoopsThemeForm(抬頭,表單名,$_SERVER['PHP_SELF']);
- $選單元素=new XoopsFormSelect(抬頭,元素名,後送預設值,選項數,是否複選,id,是否span); // 前二引數必填
- $選單元素->addOptionArray($選項陣列); // 將選項放上選單元素
- $選項陣列中的諸陣列元素的索引為後送值,諸陣列元素的值為提示。
- $表單->addElement($選單元素,是否必填); // 之後才將$選單元素放入表單
- $表單->display(); // 印出表單,此方法在 form.php 中定義
前後呼應
etable.php 中
/// 表單區 function addElements …new XoopsFormTime(欄代名,'f[欄名]',15,欄值); …form->addElement(上面生成的物件);
前面
// 主函式 function main // 單筆資料前置處理,含插畢、刪一筆、編一筆 if(is_array($value)){ if(isset($value['hour']) && isset($value['min'])){$value=$value['hour'].':'.$value['min'].':00';} } 以上段落出現兩次