我在使用复选框时注意到了一个问题。
我用这样的默认值加载我的表单:
//Defaults for this template
$default['video'] = '';
$default['height'] = '';
$default['width'] = '';
$default['codec'] = '';
$default['time'] = '0';
$default['audio'] = '';
$default['video_id'] = '';
$default['filename_machine'] = '';
//in this template we also use x pos and y pos, but these depend on screen layout ie. not stored on entity.
$data = (array)$data + (array)$default;
if ($data['audio']=='on') {
$audio = 'checked';
}
else {
$audio = '';
}
<td>
Spela upp ljud? <input type='checkbox' name='data_audio' $audio />
</td>
现在,如果默认情况下没有选中一个框,这很好用,但是如果默认值是选中一个框,那么即使用户取消选中该框,保存表单然后消失,该框也会显示为选中状态返回编辑实体。
我认为一种方法是不使用复选框作为实际保存的表单字段,而是在后面使用隐藏字段,并且仅使用复选框在该字段中设置值“on”或“off”,或类似的东西. 但是很多额外的工作。
我以这种方式默认设置的这些特定表单字段由 jQuery 序列化保存,因此我没有一个很好的方法来单步执行和基于类型等操作字段(例如“如果复选框并且未选中,则将值设置为 '取消选中'”或类似的东西..),否则我想这将是一种方法。
有没有我没想到的更聪明的把戏?
更新
这就是我保存所有以 data_ 开头的表单字段的方式
在视图中,我首先在提交之前执行此操作:
var myChunk = $( '#contentForm' ).serialize();
$( "#serialized" ).val( myChunk );
然后,在接收表单的 php 中:
//Get the custom data fields
$serialized = $this->unserializeForm( $request->request->get('serialized') );
$jsonArray = $this->getDataFields($serialized,true); //init the array that will become the json
$dataArray = $this->getDataFields($serialized); //init the array that will becom the one-dimensional array (currently in use)
这是getDataFields的样子,也许我可以在这里为复选框字段添加一些额外的过滤......
private function getDataFields($serialized,$toJson=false) {
$myArray = array();
foreach($serialized as $i) {
$label = $i[0];
$value = $i[1];
//find only the data fields (prepended with "data_", skip rest of form)
if(substr($label,0,5) == 'data_') {
//discard the "data_" part of the label
$label = substr($label,5);
if($toJson == true) {
//we're preparing data to be stored as json so we use a multidimensional for better overview.
//see if there is a subgroup to the label (ie. data_BACKGROUND_color or such)
if (strpos($label,'_') !== false) {
//echo 'har undergrupp <br />';
$parts = explode("_", $label); //split label
$group = $parts[0];
$label = $parts[1];
$myArray[$group][$label] = $value; //organize into group and label
}
else {
//echo 'har inte undergrupp <br />';
$myArray[$label] = $value;
}
}
else {
//we're storing data in a plain array
$myArray[$label] = $value;
}
}
}
return $myArray;
}