0

我在使用复选框时注意到了一个问题。

我用这样的默认值加载我的表单:

//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;
}
4

1 回答 1

0

这就是我在我的情况下解决它的方法。

我无法对这个线程使用漂亮的解决方案如何覆盖 jquery 的 .serialize 以包含Robin Naben 建议的未选中复选框,因为我有一些由框架表单处理器处理的表单字段,以及我想要序列化的其他表单字段.

所以我改用了一个自定义循环,为通过框架处理和验证的那个字段设置了一个例外。

$("input[type=checkbox]").each(function () {
    if ( ($(this).attr("id") != 'biztv_contentmanagementbundle_contenttype_draft') && (this.checked == 0) ) { //loop through all unchecked checkboxes except the draft one ("UTKAST").
        $(this).attr('value', 'false'); //explicitly set false as the value for all unchecked checkboxes
        $(this).prop('checked', true); //This is necessary since otherwise it won't be included in the submission at all
    }
});
于 2014-07-22T12:29:02.780 回答