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

出自六年制學程
跳轉到: 導覽搜尋
 
(未顯示同用戶所作出之4次版本)
第 1 行: 第 1 行:
 
[[分類:Etable]][[分類:LiteSite]]
 
[[分類:Etable]][[分類:LiteSite]]
 
checkbox必須區別單選與複選的起因是'''formcheckbox.php'''中:
 
checkbox必須區別單選與複選的起因是'''formcheckbox.php'''中:
:function render(){
+
<pre>function render(){
::……
+
……
::// 如果選項超過一個,而且表單元素名末尾不是[ ]
+
// 如果選項超過一個,而且表單元素名末尾不是[]
::if(count($this->getOptions())>1 && substr($this->getName(),-2,2)!="[]"){
+
if(count($this->getOptions())>1 && substr($this->getName(),-2,2)!="[]"){
:: $newname=$this->getName()."[]"; // 表單元素名末尾加[ ]
+
$newname=$this->getName()."[]"; // 表單元素名末尾加[]
:: $this->setName($newname); // 設為新的表單元素名
+
$this->setName($newname); // 設為新的表單元素名
::}
+
}
::……
+
……
::foreach($this->getOptions() as $value=>$name){
+
foreach($this->getOptions() as $value=>$name){ // 所有選項都做一輪
:: $ret.="<inputtype='checkbox' id='".$id.'''$i'''." 'name='".$this->getName()." 'value='".$value."'";
+
$ret.="<input type='checkbox' id='".$id.'''$i'''."' name='".$this->getName()."' value='".$value."'";
:: if(count($this->getValue())>0 && in_array($value,$this->getValue())){
+
// 只要有值,就檢查選項值有沒有在已核取值陣列中,若有就秀核取
:: $ret.="checked='checked'";
+
if(count($this->getValue())>0 && in_array($value,$this->getValue())){
:: }
+
$ret.="checked='checked'";
:: $ret.=$this->getExtra()."/>".$name."\n";
+
}
:: '''$i++''';
+
$ret.=$this->getExtra()."/>".$name."\n";
::}
+
'''$i++''';
::……
+
}
:}
+
……
 +
}</pre>
 
*所以單選與複選,其表單元素名送回伺服器是不同的變數名:
 
*所以單選與複選,其表單元素名送回伺服器是不同的變數名:
 
*#單選時:$_POST['欄名']得到的是字串
 
*#單選時:$_POST['欄名']得到的是字串
 
*#複選時:$_POST['欄名']得到的是陣列
 
*#複選時:$_POST['欄名']得到的是陣列
 
*:所以對單選與複選「全部選項未核取」須要賦予不同的定義:
 
*:所以對單選與複選「全部選項未核取」須要賦予不同的定義:
 
+
*但送入 function XoopsFormCheckBox(…,$value=null,…) 之 $value:
 +
*#若未送值則 $value 值維持為 null
 +
*#若有送值則 $value 值一律轉為陣列,即使原來的 $value 值是純量,或其值為 null,false,0,空字串都一樣轉成元素值,型別不變。
 
'''單選:'''
 
'''單選:'''
 
#未核取,欄值後送 0
 
#未核取,欄值後送 0

2024年5月7日 (二) 20:33的最新修訂版本

checkbox必須區別單選與複選的起因是formcheckbox.php中:

function render(){
	……
	// 如果選項超過一個,而且表單元素名末尾不是[]
	if(count($this->getOptions())>1 && substr($this->getName(),-2,2)!="[]"){
		$newname=$this->getName()."[]";	// 表單元素名末尾加[]
		$this->setName($newname);	// 設為新的表單元素名
	}
	……
	foreach($this->getOptions() as $value=>$name){	// 所有選項都做一輪
		$ret.="<input type='checkbox' id='".$id.'''$i'''."' name='".$this->getName()."' value='".$value."'";
		// 只要有值,就檢查選項值有沒有在已核取值陣列中,若有就秀核取
		if(count($this->getValue())>0 && in_array($value,$this->getValue())){
			$ret.="checked='checked'";
		}
		$ret.=$this->getExtra()."/>".$name."\n";
		'''$i++''';
	}
	……
}
  • 所以單選與複選,其表單元素名送回伺服器是不同的變數名:
    1. 單選時:$_POST['欄名']得到的是字串
    2. 複選時:$_POST['欄名']得到的是陣列
    所以對單選與複選「全部選項未核取」須要賦予不同的定義:
  • 但送入 function XoopsFormCheckBox(…,$value=null,…) 之 $value:
    1. 若未送值則 $value 值維持為 null
    2. 若有送值則 $value 值一律轉為陣列,即使原來的 $value 值是純量,或其值為 null,false,0,空字串都一樣轉成元素值,型別不變。

單選:

  1. 未核取,欄值後送 0
  2. 欄值 0 ,代表未核取

複選:

  1. 全部選項未核取,欄值後送空字串
  2. 欄值 0 ,代表核取過欄值為 0 的選項