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

出自六年制學程
跳轉到: 導覽搜尋
諸方法
將 searchSelect 托盤化
 
(未顯示同用戶所作出之21次版本)
第 38 行: 第 38 行:
 
#getMethod():送物件通道
 
#getMethod():送物件通道
 
#addElement(&$formElement, $required=false):$_elements 與 $_required 要不要加一元素
 
#addElement(&$formElement, $required=false):$_elements 與 $_required 要不要加一元素
#&getElements($recurse = false):處理遞歸的表單元素
+
#&getElements(遞迴 預設不遞迴):由於表單中的諸子元素中可能某一子元素本身是托盤,所以可對本表單物件的 $_elements 施以遞迴處理,直到萃取出所有非托盤的子元素再傳回。
 
#getElementNames():取所有表單元素名構成陣列
 
#getElementNames():取所有表單元素名構成陣列
 
#&getElementByName($name):依表單元素名送回表單元素物件
 
#&getElementByName($name):依表單元素名送回表單元素物件
第 76 行: 第 76 行:
 
#*出 renderValidationJS( true )
 
#*出 renderValidationJS( true )
  
===XoopsFormElement===
+
===XoopsFormElement (在 formelement.php 中定義)===
 
====諸屬性====
 
====諸屬性====
 
#$_name:表單元素名稱
 
#$_name:表單元素名稱
第 116 行: 第 116 行:
  
 
===表單元素實體化===
 
===表單元素實體化===
#
+
====XoopsFormText====
#
+
'''屬性'''
#
+
#$_size:
 +
#$_maxlength
 +
#$_value
 +
'''方法'''
 +
#XoopsFormText($caption, $name, $size, $maxlength, $value="", $id = "")
 +
#*setCaption($caption)
 +
#*setName($name)
 +
#*$_size = intval($size)
 +
#*$_maxlength = intval($maxlength)
 +
#*setValue($value)
 +
#*setId($id)
 +
#getSize():取物件的 $_size
 +
#getMaxlength():取物件的 $_maxlength
 +
#getValue():取物件的 $_value
 +
#setValue($value):將 $value 設為物件的 $_value
 +
#render():造 <input type='text' … />
 +
#*getName()
 +
#*getId()
 +
#*getSize()
 +
#*getMaxlength()
 +
#*getValue()
 +
#*getExtra():在標籤內
 +
#*getExtra('2'):在標籤後
 +
 
 +
===XoopsFormElementTray (在 formelementtray.php 中定義)===
 +
承載多個 FormElement 的托盤
 +
====屬性====
 +
#$_elements:放多個 element 的陣列
 +
#$_required:必填欄位陣列
 +
#$_delimeter:元素間隔,預設為  
 +
 
 +
====方法====
 +
#XoopsFormElementTray( $caption, $delimeter = " ", $name = "" )
 +
#*setName($name)
 +
#*setCaption($caption)
 +
#*將 $delimeter 設為物件的 $_delimeter
 +
#isContainer():傳回真
 +
#isRequired():物件的 $_required 陣列非空就傳回真,否則傳回假
 +
#addElement( &$formElement, $required = false ):物件的 $_elements 先加一元素,再看物件的 $_required 是不是也要加一元素
 +
#&getRequired():取物件的 $_required
 +
#&getElements(遞迴 預設不遞迴):由於本托盤的諸子元素中可能某一子元素本身也是托盤,所以可對本托盤物件的 $_elements 施以遞迴處理,直到萃取出所有非托盤的子元素再傳回。
 +
#getDelimeter(編碼 預設不編碼):換掉 $_delimeter 中的 < > " 空白,將 HTML 符號變成不可執行的符號
 +
#render():所有的托盤都使用相同的實體化方法:對 $_elements 中的每個元素 $ele
 +
#*若 $ele->isHidden() 單純 $ele->render()
 +
#*非 $ele->isHidden():回傳 $ele->getCaption()." ".$ele->render().getDelimeter()…
 +
 
 +
===托盤實體化===
 +
#宣告 class XoopsForm某某 extends XoopsFormElementTray
 +
#免設新屬性,也只有一個方法 XoopsForm某某(抬頭,後傳變數名,值,…)
 +
#*$this->XoopsFormElementTray(托盤抬頭,分隔字串);:設定托盤的抬頭、元素間的分隔字串,可以不用設托盤的名稱,因為托盤並不是真正的表單元素,只是數個表單元素的容器
 +
#*造一個表單元素,其後傳變數名往往是 後傳變數名[索引],然後 $this->addElement(這個表單元素);
 +
#*連續裝數個表單元素,就完成了
 +
#伺服器端收到的後傳變數是一個陣列,托盤中的每個表單元素傳回這個陣列的一個元素,如:
 +
#*XoopsFormTime 為 $name[hour],$name[min]
 +
#*XoopsFormFile 為 $name[path],$name[fileName]
 +
#*XoopsFormDateTime 為 $name[date],$name[pm],$name[hour],$name[min]
 +
 
 +
===將 searchSelect 托盤化===
 +
[http://jendo.org/jendo/6year/sharingBooksToBorrow.php 借共享圖書]之中
 +
#<pre><tr valign="top" align="left"><td class="head"></td><td class="even"><input type="text" value="" oninput="catchText(event,'/jendo/6year/sharingBooksToBorrow.php','listf[b][bid]')" onpropertychange="catchText(event,'/jendo/6year/sharingBooksToBorrow.php','listf[b][bid]')"></td></tr></pre>
 +
#<pre><tr valign="top" align="left"><td class="head">書</td><td class="even"><span id="listf[b][bid]"><select size="1" name="f[b][bid]"><option value="">===請輸入書名===</option></select></span></td></tr></pre>
 +
#$ET->formType=array('b.bid'=>array('searchSelect', array(''=>'===請輸入書名===')),…);
 +
formcatchtext.php 之中
 +
<pre>class XoopsFormCatchText extends XoopsFormElement {
 +
var $listId;
 +
function XoopsFormCatchText($listId){
 +
$this->listId=$listId;
 +
}
 +
function render(){
 +
return "<input type='text' value='' oninput=catchText(event,'".$_SERVER['PHP_SELF']."','".$this->listId."') onpropertychange=catchText(event,'".$_SERVER['PHP_SELF']."','".$this->listId."') />"; // by jj
 +
}
 +
}</pre>
 +
login.php input 後送變數名固定為 catchText ,應改為可指定後送變數名
 +
<pre>function catchText(keyEvent,dataSource,divID){ // 抓取字從 ajax 通道後送
 +
keyEvent=(keyEvent)?keyEvent:window.event; // FF叫event,IE叫window.event
 +
input=(keyEvent.target)?keyEvent.target:keyEvent.srcElement; // FF叫target,IE叫srcElement
 +
eventType=(navigator.appName=='Microsoft Internet Explorer')?'propertychange':'input';// IE用propertychange,其他用input
 +
if(keyEvent.type==eventType){postData(dataSource,'catchText='+input.value+'&divID='+divID,divID,[],0);}// 不能秀等待圖示
 +
}</pre>
 +
etable.php 中 做了兩次 $this->form->addElement(…)
 +
<pre>elseif($this->formType["$lc_name"][0]=='searchSelect'){
 +
$this->form->addElement(new XoopsFormCatchText($this->listId.'f['.$this->fields[$i]['as_name'].']['.$this->fields[$i]['colname'].']'));
 +
$j=new XoopsFormSelect($this->fields[$i]['colalias'],'f['.$this->fields[$i]['as_name'].']['.$this->fields[$i]['colname'].']',$value,1,false,$this->listId.'f['.$this->fields[$i]['as_name'].']['.$this->fields[$i]['colname'].']',1);
 +
if($value){$j->addOptionArray(array($value=>$value));} // 如果已有值,加該值的選項(編輯表單用)
 +
else{$j->addOptionArray($this->formType["$lc_name"][1]);} // 如果未有值,加提示列(插入表單用)
 +
$this->form->addElement($j,(($this->fields[$i]['formValidate']==0)?'0':'1'));
 +
}</pre>
 +
formselect-et.php 中將選單 span 化
 +
<pre>function render(){
 +
    $ret =$this->asSpan?"<span id='".$this->getId()."'>":"";// 若$asSpan,id 給span
 +
    $ret .= "<select  size='".$this->getSize()."'".$this->getExtra()."";</pre>

2022年7月31日 (日) 22:04的最新修訂版本

addElements($i,$value)
$i 代表 select 的第幾欄
$value 代表傳入欄值

$lc_name=$this->fields[$i]['lc_name'];

會將該欄的長欄名,如「住宿」,放入 $lc_name 。

$xoopsUser

  1. 是一個物件
  2. 專門給欄名為「uname」者使用
  3. 其方法 getVar('uname') 會取回註冊名

XoopsForm (在 form.php 中定義)

表單的抽象結構

諸屬性

  1. $_action:後送目的地
  2. $_method:後送方法
  3. $_name:表單名
  4. $_title:表單的抬頭
  5. $_elements:集合各表單元素構成的陣列
  6. $_extra:form 標籤內的額外訊息
  7. $_extra1:待定義
  8. $_extra2:表單後方的額外訊息
  9. $_required:必填各表單元素構成的陣列

諸方法

  1. 初始方法 XoopsForm($title, $name, $action, $method="post", $addtoken=false)
    • 取傳入的 $title 為物件抬頭
    • 若傳入的 $name 非為空字串即為物件名,不然物件名預設為 "xoops_form"
    • 取傳入的 $action 為物件後送目的地
    • 取傳入的 $method 為物件後送通導;此項未設,預設止 POST 通道
    • 丁丁要忽略 XoopsFormHiddenToken
    • $this->addElement(new XoopsFormHidden('skipValidationJS', 0));
    • $this->setExtra('onsubmit="return xoopsFormValidate_'.$this->getName().'();"');
  2. getTitle():送物件抬頭
  3. getName():送物件名
  4. getAction():送物件目的地
  5. getMethod():送物件通道
  6. addElement(&$formElement, $required=false):$_elements 與 $_required 要不要加一元素
  7. &getElements(遞迴 預設不遞迴):由於表單中的諸子元素中可能某一子元素本身是托盤,所以可對本表單物件的 $_elements 施以遞迴處理,直到萃取出所有非托盤的子元素再傳回。
  8. getElementNames():取所有表單元素名構成陣列
  9. &getElementByName($name):依表單元素名送回表單元素物件
  10. setElementValue($name, $value):對表單元素以該元素的 setValue 方法派入 $value
  11. setElementValues($values):$values 為陣列,對眾表單元素扎批次派值
  12. &getElementValue($name):對表單元素以該元素的 getValue 方法取值
  13. &getElementValues():對表單所有元素以該元素的 getValue 方法取值,並構成值的陣列
  14. setExtra(額外字串,取代=false,$i=''):設定額外資訊,預設為添附;也可以設為取代。
  15. getExtra($i=''):送回額外資訊
  16. setRequired(&$formElement):設定某表單元素為必填欄位
  17. &getRequired():傳回所有表單的必填欄位
  18. insertBreak($extra = null):無內容
  19. render():無內容
  20. display():依 form 物件設定的 render() 表現內容
  21. renderValidationJS($withtags=true):造 javascript 驗證函式
  22. assign(&$tpl):樣版化各表單元素

表單實體化:以下說明 themeform.php,另外還有 SimpleForm 和 TableForm ,都更簡單

諸方法

  1. insertBreak(…):未使用
  2. render():實體化
    • 用 getName() 取表單名與表單 id
    • 用 getAction() 取目的地
    • 用 getMethod() 取後送通道
    • 用 getExtra() 補上 form 標籤內額外字串
    • 將 表單元素->isHidden() 者實體化
    • 出 <table>
    • 第一列跨兩欄,放 getTitle()
    • 其餘各列:
      1. 第一欄出 表單元素->getCaption(),如是是必填欄位再加「*」
      2. 表單元素->getDescription() 非空字串,再加「換行換行加粗『表單元素->getDescription()』」
      3. 第二欄出 表單元素->render()
    • 如果有必填欄位最後一列跨兩欄,放「* = 必填欄位,務請填寫。」
    • 最後一行之後,</table>之前放 $_extra2 ,可以寫成跨兩欄,也可以寫成兩欄;可以寫 th 也可以寫 td
    • 出 </table>
    • 出 </form>
    • 出 renderValidationJS( true )

XoopsFormElement (在 formelement.php 中定義)

諸屬性

  1. $_name:表單元素名稱
  2. $_id:表單元素 id ,預設為空字串
  3. $_caption:表單元素抬頭
  4. $_accesskey 預設為空字串
  5. $_class:表單元素 CSS 類別,預設為空字串
  6. $_hidden:表單元素是否為 hidden ,預設為 false
  7. $_extra
  8. $_extra1
  9. $_extra2
  10. $_required:表單元素是否為必填欄位,預設為 false
  11. $_description

諸方法

  1. XoopsFormElement():跳離
  2. isContainer():傳回假
  3. setName($name):trim 後放入 $_name
  4. getName(true):取表單元素名
    • 預設要轉碼,不轉碼須設 false
    • 用 htmlspecialchars(字串) 將 HTML 符號變成不可執行的符號,預設轉 < > "
      htmlspecialchars(字串,ENT_QUOTES),加轉 '
    • 還要轉 &,至少要轉以上這五個
  5. setAccessKey($key):$key trim 後放入 $_accesskey
  6. getAccessKey():取物件的 $_accesskey
  7. getAccessString($str):如果 $str 含 $_accesskey ,對 $str 中的 $_accesskey 畫底線
  8. setClass($class):將 $class trim 後放入物件的 $_class
  9. getClass():取物件的 $_class
  10. setCaption($caption):將 $caption trim 後放入物件的 $_caption
  11. getCaption():取物件的 $_caption
  12. setId($id):將 $id trim 後放入物件的 $_id
  13. getId():取物件的 $_id ,若為空字串,傳回 getName() 的值
  14. setDescription($description):將 $description trim 後放入物件的 $_description
  15. getDescription():取物件的 $_description
  16. setHidden():將物件的 $_hidden 改設為真
  17. isHidden():取物件的 $_hidden
  18. setExtra(額外字串,取代=false,$i=''):設定額外資訊,預設為添附;也可以設為取代。
  19. getExtra($i=''):送回額外資訊
  20. render():無內容

表單元素實體化

XoopsFormText

屬性

  1. $_size:
  2. $_maxlength
  3. $_value

方法

  1. XoopsFormText($caption, $name, $size, $maxlength, $value="", $id = "")
    • setCaption($caption)
    • setName($name)
    • $_size = intval($size)
    • $_maxlength = intval($maxlength)
    • setValue($value)
    • setId($id)
  2. getSize():取物件的 $_size
  3. getMaxlength():取物件的 $_maxlength
  4. getValue():取物件的 $_value
  5. setValue($value):將 $value 設為物件的 $_value
  6. render():造 <input type='text' … />
    • getName()
    • getId()
    • getSize()
    • getMaxlength()
    • getValue()
    • getExtra():在標籤內
    • getExtra('2'):在標籤後

XoopsFormElementTray (在 formelementtray.php 中定義)

承載多個 FormElement 的托盤

屬性

  1. $_elements:放多個 element 的陣列
  2. $_required:必填欄位陣列
  3. $_delimeter:元素間隔,預設為 &nbsp;

方法

  1. XoopsFormElementTray( $caption, $delimeter = "&nbsp;", $name = "" )
    • setName($name)
    • setCaption($caption)
    • 將 $delimeter 設為物件的 $_delimeter
  2. isContainer():傳回真
  3. isRequired():物件的 $_required 陣列非空就傳回真,否則傳回假
  4. addElement( &$formElement, $required = false ):物件的 $_elements 先加一元素,再看物件的 $_required 是不是也要加一元素
  5. &getRequired():取物件的 $_required
  6. &getElements(遞迴 預設不遞迴):由於本托盤的諸子元素中可能某一子元素本身也是托盤,所以可對本托盤物件的 $_elements 施以遞迴處理,直到萃取出所有非托盤的子元素再傳回。
  7. getDelimeter(編碼 預設不編碼):換掉 $_delimeter 中的 < > " 空白,將 HTML 符號變成不可執行的符號
  8. render():所有的托盤都使用相同的實體化方法:對 $_elements 中的每個元素 $ele
    • 若 $ele->isHidden() 單純 $ele->render()
    • 非 $ele->isHidden():回傳 $ele->getCaption()." ".$ele->render().getDelimeter()…

托盤實體化

  1. 宣告 class XoopsForm某某 extends XoopsFormElementTray
  2. 免設新屬性,也只有一個方法 XoopsForm某某(抬頭,後傳變數名,值,…)
    • $this->XoopsFormElementTray(托盤抬頭,分隔字串);:設定托盤的抬頭、元素間的分隔字串,可以不用設托盤的名稱,因為托盤並不是真正的表單元素,只是數個表單元素的容器
    • 造一個表單元素,其後傳變數名往往是 後傳變數名[索引],然後 $this->addElement(這個表單元素);
    • 連續裝數個表單元素,就完成了
  3. 伺服器端收到的後傳變數是一個陣列,托盤中的每個表單元素傳回這個陣列的一個元素,如:
    • XoopsFormTime 為 $name[hour],$name[min]
    • XoopsFormFile 為 $name[path],$name[fileName]
    • XoopsFormDateTime 為 $name[date],$name[pm],$name[hour],$name[min]

將 searchSelect 托盤化

借共享圖書之中

  1. <tr valign="top" align="left"><td class="head"></td><td class="even"><input type="text" value="" oninput="catchText(event,'/jendo/6year/sharingBooksToBorrow.php','listf[b][bid]')" onpropertychange="catchText(event,'/jendo/6year/sharingBooksToBorrow.php','listf[b][bid]')"></td></tr>
  2. <tr valign="top" align="left"><td class="head">書</td><td class="even"><span id="listf[b][bid]"><select size="1" name="f[b][bid]"><option value="">===請輸入書名===</option></select></span></td></tr>
  3. $ET->formType=array('b.bid'=>array('searchSelect', array(=>'===請輸入書名===')),…);

formcatchtext.php 之中

class XoopsFormCatchText extends XoopsFormElement {
	var $listId;
	function XoopsFormCatchText($listId){
		$this->listId=$listId;
	}
	function render(){
		return "<input type='text' value='' oninput=catchText(event,'".$_SERVER['PHP_SELF']."','".$this->listId."') onpropertychange=catchText(event,'".$_SERVER['PHP_SELF']."','".$this->listId."') />"; // by jj
	}
}

login.php input 後送變數名固定為 catchText ,應改為可指定後送變數名

function catchText(keyEvent,dataSource,divID){				// 抓取字從 ajax 通道後送
	keyEvent=(keyEvent)?keyEvent:window.event;			// FF叫event,IE叫window.event
	input=(keyEvent.target)?keyEvent.target:keyEvent.srcElement;	// FF叫target,IE叫srcElement
	eventType=(navigator.appName=='Microsoft Internet Explorer')?'propertychange':'input';// IE用propertychange,其他用input
	if(keyEvent.type==eventType){postData(dataSource,'catchText='+input.value+'&divID='+divID,divID,[],0);}// 不能秀等待圖示
}

etable.php 中 做了兩次 $this->form->addElement(…)

elseif($this->formType["$lc_name"][0]=='searchSelect'){
	$this->form->addElement(new XoopsFormCatchText($this->listId.'f['.$this->fields[$i]['as_name'].']['.$this->fields[$i]['colname'].']'));
	$j=new XoopsFormSelect($this->fields[$i]['colalias'],'f['.$this->fields[$i]['as_name'].']['.$this->fields[$i]['colname'].']',$value,1,false,$this->listId.'f['.$this->fields[$i]['as_name'].']['.$this->fields[$i]['colname'].']',1);
	if($value){$j->addOptionArray(array($value=>$value));}		// 如果已有值,加該值的選項(編輯表單用)
	else{$j->addOptionArray($this->formType["$lc_name"][1]);}	// 如果未有值,加提示列(插入表單用)
	$this->form->addElement($j,(($this->fields[$i]['formValidate']==0)?'0':'1'));
}

formselect-et.php 中將選單 span 化

function render(){
    $ret =$this->asSpan?"<span id='".$this->getId()."'>":"";// 若$asSpan,id 給span
    $ret .= "<select  size='".$this->getSize()."'".$this->getExtra()."";