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

出自六年制學程
跳轉到: 導覽搜尋
第 5 行: 第 5 行:
 
::// 如果選項超過一個,而且表單元素名末尾不是[ ]
 
::// 如果選項超過一個,而且表單元素名末尾不是[ ]
 
::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){
::&#9;$ret.="<input type='checkbox' id='".$id.'''$i'''."' name='".$this->getName()."' value='".$value."'";
+
::&emsp;&emsp;$ret.="<input type='checkbox' id='".$id.'''$i'''."' name='".$this->getName()."' value='".$value."'";
::&#9;if(count($this->getValue())>0 && in_array($value,$this->getValue())){
+
::&emsp;&emsp;if(count($this->getValue())>0 && in_array($value,$this->getValue())){
::&#9;&#9;$ret.="checked='checked'";
+
::&emsp;&emsp;&emsp;&emsp;$ret.="checked='checked'";
::&#9;}
+
::&emsp;&emsp;}
::&#9;$ret.=$this->getExtra()."/>".$name."\n";
+
::&emsp;&emsp;$ret.=$this->getExtra()."/>".$name."\n";
::&#9;'''$i++''';
+
::&emsp;&emsp;'''$i++''';
 
::}
 
::}
 
::……
 
::……

2024年5月6日 (一) 08:18的修訂版本

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 XoopsFormBitCheckBox(…,$value=null,…) 之 $value:
    1. 若未送值則 $value 值維持為 null
    2. 若有送值則 $value 值一律轉為陣列,即使原來的 $value 值是純量,或其值為 null,false,0,空字串都一樣轉成元素值,型別不變。

單選:

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

複選:

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