Etable/form:修訂版本之間的差異

出自六年制學程
跳轉到: 導覽搜尋
(二)addElements($i,$value)
 
(未顯示同用戶所作出之44次版本)
第 1 行: 第 1 行:
[[分類:Etable]]
+
[[分類:Etable]][[分類:Etable/form]]
===插入層次===
+
===六階段流程說明===
 +
====(一)form_edit與form_ins====
 +
<table class=nicetable>
 +
<tr><th>form_edit($row=array())</th><th>form_ins()</th></tr>
 +
<tr><td colspan=2>new XoopsThemeForm 得到 form 物件</td></tr>
 +
<tr><td colspan=2>每欄處理一輪:</td></tr>
 +
<tr><td colspan=2>剔除演算式且沒有表代名之欄</td></tr>
 +
<tr><td colspan=2>留下允許編或允計插之欄</td></tr>
 +
<tr><td>
 +
hidden/both或hidden/edit<br/>用隱藏欄送出('f[表名][欄名]',$h($i,$row[$i]))
 +
</td><td>
 +
hidden/both或hidden/ins或hidden/ins_only<br/>用隱藏欄送出<br/>
 +
1)('f[表名][欄名]',$h($i,欄位預設值))<br/>
 +
2)('f[表名][欄名]',$h($i,null))
 +
</td></tr>
 +
<tr><td>
 +
unix_time/both或unix_time/edit<br/>用隱藏欄送出('f[表名][欄名]',mktime())
 +
</td><td>
 +
unix_time/both或unix_time/ins或unix_time/ins_only<br/>用隱藏欄送出('f[表名][欄名]',mktime())
 +
</td></tr>
 +
<tr><td>
 +
其他可編之欄,以addElements($i,$row[$i])處理
 +
</td><td>
 +
其他可插之欄,以:<br/>
 +
1)addElements($i,欄位預設值)處理<br/>
 +
2)addElements($i,null)處理
 +
</td></tr>
 +
<tr><td>
 +
不可編之欄送出addElement(new XoopsFormLabel(欄代名,$row[$i]),0)
 +
</td><td>
 +
不可插之欄送出addElement(new XoopsFormLabel(欄代名,DONTINSERT),0)
 +
</td></tr>
 +
</table>
 +
====(二)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 中的表達====
 +
<table class=nicetable>
 +
<tr><th>formType</th><th>HTML</th><th colspan=2>javascript</th><th>PHP</th></tr>
 +
<tr><th>select</th><td>name='f[表名][欄名]'<br/>id='f[表名][欄名]'</td><td>document.getElementsByName('f[表名][欄名]')[0].value<br/>document.getElementById('表單名').elements[第幾].value</td><th>select-one</th><td>$_POST['f']['表名']['欄名']</td></tr>
 +
<tr><th>radio</th><td>name='f[表名][欄名]'多個相同<br/>id='f[表名][欄名]0'<br/>id='f[表名][欄名]1'<br/>…</td><td>document.getElementsByName('f[表名][欄名]')[0].value<br/>document.getElementsByName('f[表名][欄名]')[1].value<br/>…<br/>document.getElementById('表單名').elements[第幾].value<br/>「第幾」跳號選項次<br/>核選的 checked 為 true<br/>未核選的 checked 為 false</td><th>radio</th><td>全未選不後送<br/>核選則$_POST['f']['表名']['欄名']</td></tr>
 +
<tr><th>checkbox<br/>(單選)</th><td>name='f[表名][欄名]'<br/>id='f[表名][欄名]0'</td><td>document.getElementsByName('f[表名][欄名]')[0].value<br/>document.getElementById('表單名').elements[第幾].value<br/>核選的 checked 為 true<br/>未核選的 checked 為 false</td><th>checkbox</th><td>未選不後送<br/>核選則$_POST['f']['表名']['欄名']</td></tr>
 +
<tr><th>checkbox<br/>(複選)</th><td>name='f[表名][欄名][]'<br/>id='f[表名][欄名]0'<br/>id='f[表名][欄名]1'<br/>…</td><td>document.getElementsByName('f[表名][欄名][]')[0].value<br/>document.getElementsByName('f[表名][欄名][]')[1].value<br/>…<br/>document.getElementById('表單名').elements[第幾].value<br/>「第幾」跳號選項次<br/>核選的 checked 為 true<br/>未核選的 checked 為 false</td><th>checkbox</th><td>全未選不後送<br/>核選則$_POST['f']['表名']['欄名']陣列</td></tr>
 +
</table>
 +
#getElementsByName 的 Elements 是複數加's',可以有很多同 name 的元素,即使只有一個,也要加 [0] 表示第一個<br/>而 getElementById 的 Element 是單數,只應傳回一個,不用加 [0]
 +
#.value 可以換成 .name 或 .type 或 .checked 或 .length
 +
 
 +
====(四)colValue($j,$value,$row)====
 +
formType中只有特定表現沒有專用表單元素:
 +
#'長欄名'=>array('function',函式名),請參考[[Etable/開發#以函式決定欄值的表現|範例]]
 +
#'長欄名'=>array('wrap'),$value中的半形分號「;」代換為換行&lt;br/&gt;
 +
 
 +
====(五)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 XoopsThemeForm(抬頭,表單名,$_SERVER['PHP_SELF']);
*$選單元素=new XoopsFormSelect(抬頭,元素名,後送預設值,選項數,是否複選,id,是否span); // 前二引數必填
+
:$選單元素=new XoopsFormSelect(抬頭,元素名,後送預設值,選項數,是否複選,id,是否span); // 前二引數必填
*#$選單元素->addOptionArray($選項陣列); // 將選項放上選單元素
+
:#$選單元素->addOptionArray($選項陣列); // 將選項放上選單元素
*#$選項陣列中的諸陣列元素的索引為後送值,諸陣列元素的值為提示。
+
:#$選項陣列中的諸陣列元素的索引為後送值,諸陣列元素的值為提示。
*$表單->addElement($選單元素,是否必填); // 之後才將$選單元素放入表單
+
:$表單->addElement($選單元素,是否必填); // 之後才將$選單元素放入表單
*$表單->display(); // 印出表單
+
:$表單->display(); // 印出表單,此方法在 form.php 中定義
  
 
===前後呼應===
 
===前後呼應===

2022年7月24日 (日) 16:11的最新修訂版本

六階段流程說明

(一)form_edit與form_ins

form_edit($row=array())form_ins()
new XoopsThemeForm 得到 form 物件
每欄處理一輪:
剔除演算式且沒有表代名之欄
留下允許編或允計插之欄

hidden/both或hidden/edit
用隱藏欄送出('f[表名][欄名]',$h($i,$row[$i]))

hidden/both或hidden/ins或hidden/ins_only
用隱藏欄送出
1)('f[表名][欄名]',$h($i,欄位預設值))
2)('f[表名][欄名]',$h($i,null))

unix_time/both或unix_time/edit
用隱藏欄送出('f[表名][欄名]',mktime())

unix_time/both或unix_time/ins或unix_time/ins_only
用隱藏欄送出('f[表名][欄名]',mktime())

其他可編之欄,以addElements($i,$row[$i])處理

其他可插之欄,以:
1)addElements($i,欄位預設值)處理
2)addElements($i,null)處理

不可編之欄送出addElement(new XoopsFormLabel(欄代名,$row[$i]),0)

不可插之欄送出addElement(new XoopsFormLabel(欄代名,DONTINSERT),0)

(二)addElements($i,$value)

  • 處理會員欄,「$value=$xoopsUser->getVar('uname');」是以 xoops 為外套時期使用,應移除
  • 處理formType中各欄,除hidden、wrap以外諸欄
    1. unix_time:出時分秒小日曆
    2. date:出日期小日曆
    3. time:用 XoopsFormTime
    4. datetime:用 XoopsFormDateTime
    5. select:用 XoopsFormSelect 及其中的 addOptionArray(選項陣列)
    6. searchSelect:用 XoopsFormSelect 及其中的 addOptionArray(選項陣列)
    7. select2:用 XoopsFormSelect 及其中的 setExtra(" onChange='createOpt…'",false)、addOptionArray(選項陣列)
    8. radio:用 XoopsFormRadio 及其中的 addOptionArray(選項陣列)
    9. checkbox或bitCheckbox:用 XoopsFormCheckBox(欄代名,'f[表代名][欄名]',核取陣列或null) 及其中的 addOptionArray(選項陣列)。bitCheckbox 由 $value 拆解出各bit組合,成為預選值。
    10. radioyn:用 XoopsFormRadioYN
    11. auto:用 XoopsFormTextArea
    12. rangeNumber:用 XoopsFormRangeNumber ,限制輸入範圍的數值,如「成績分數」
    13. file:用 XoopsFormFile 盤,前為路徑選單,後為上傳按鈕
    14. text:用 XoopsFormText ,可加 showColExplain
    15. 其他(如 function):用 XoopsFormText
  • 處理不在formType中的各欄,依coltype產生表單元素
    1. blob/binary:XoopsFormLabel(表代名,BIDNT)
    2. blob/非binary:XoopsFormTextArea
    3. 其他:XoopsFormText

(三) javascript 中的表達

formTypeHTMLjavascriptPHP
selectname='f[表名][欄名]'
id='f[表名][欄名]'
document.getElementsByName('f[表名][欄名]')[0].value
document.getElementById('表單名').elements[第幾].value
select-one$_POST['f']['表名']['欄名']
radioname='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']['表名']['欄名']陣列
  1. getElementsByName 的 Elements 是複數加's',可以有很多同 name 的元素,即使只有一個,也要加 [0] 表示第一個
    而 getElementById 的 Element 是單數,只應傳回一個,不用加 [0]
  2. .value 可以換成 .name 或 .type 或 .checked 或 .length

(四)colValue($j,$value,$row)

formType中只有特定表現沒有專用表單元素:

  1. '長欄名'=>array('function',函式名),請參考範例
  2. '長欄名'=>array('wrap'),$value中的半形分號「;」代換為換行<br/>

(五)main()中單筆資料前置處理,含插畢、刪一筆、編一筆

在編畢與插畢中,if(is_array($value)){…}裡面

  1. 是 datetime :綜合 $value['date'],$value['pm'],$value['hour'],$value['min'] 得出年月日時分秒字串
  2. 是 time :綜合 $value['hour'],$value['min'] 得出時分秒字串
  3. 是 bitCheckbox :將各元素值加總

(六)main()中蒐尋表單傳入值前置處理

欄名必須在 search 陣列中

  1. 欄名在 searchId 陣列中,條件用「該欄欄名='蒐尋表單傳回值'」
  2. formType[欄名][0]=='bitCheckbox',條件用「該欄欄名&蒐尋表單傳回值=蒐尋表單傳回值」
  3. 其他情形,條件用「該欄欄名 like '%蒐尋表單傳回值%'」

(七)main()輸出蒐尋排序表單

  1. 日期欄用 text 型 input 輸入年月
  2. select欄、radio欄、bitCheckbox欄:出 select 選單
  3. checkbox欄:出核取方塊,選取有選的。其實 checkbox 應有三種蒐尋樣態,有選的、沒選的、全部。本段應改成選單。

表單物件應用

$表單=new XoopsThemeForm(抬頭,表單名,$_SERVER['PHP_SELF']);

$選單元素=new XoopsFormSelect(抬頭,元素名,後送預設值,選項數,是否複選,id,是否span); // 前二引數必填
  1. $選單元素->addOptionArray($選項陣列); // 將選項放上選單元素
  2. $選項陣列中的諸陣列元素的索引為後送值,諸陣列元素的值為提示。
$表單->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';}
}
以上段落出現兩次