我正在尝试在现有网站上工作,但我发现了一个错误,但我不确定为什么这是一个错误或如何解决它。
该网站基本上列出了一些城市租赁的商业物业。有一个类从数据库中抓取列表并从每个列表中创建一个对象。在每个对象中都有一个与该属性相关联的图像数组。
当用户编辑商家信息时,他们会获得一个包含图片列表的编辑页面,以及旁边的“删除”复选框。复选框都具有相同的名称,因此当它们被提交回服务器时,应用程序将获取要删除的图像数组。
应该发生的是,应用程序具有此开/关值数组(其中on = delete),并且数组中每个值的索引对应于列表对象中图像的索引 - 当其中一个值为“on”,图像数组中与该“on”值对应的文件名将从文件系统中删除,该图像将从数据库中删除。
但是,当提交表单时,应用程序将获得仅包含已选中复选框的0索引数组。因此,如果我设置三个任意图像进行删除,应用程序将获得
Array { [0] => "on", [1] => "on", [2] => "on" }
这显然不起作用,无论设置了哪个复选框,列表中的前3个图像都将被删除。
我该如何解决这个问题?我希望避免命名每个复选框(delete_1
,delete_2
,delete_3
等),因为系统已经构建为可以使用所有具有相同名称的复选框。有没有办法可以强制所有的复选框提交“开”或“关?”
答案 0 :(得分:6)
没有办法强迫,但你可以在复选框之前添加一个隐藏的右边同名和所需的值:
<input type="hidden" name="delete[42]" value="off" />
<input type="checkbox" name="delete[42]" value="on" />
答案 1 :(得分:5)
不,您不能强制提交未选中的复选框,但您可以为它们提供唯一值(而不是所有的“on”),以确定在不更改名称的情况下检查哪些复选框。
答案 2 :(得分:1)
如果你真的想要在ons和offs上返回一个数组,那么你需要将一个函数附加到表单submit,它将扫描具有给定名称的所有复选框,并将它们的值放在数组中。
在jQuery中,这看起来像......
$('#yourForm').submit(function(){
var array = new Array();
$('input[name="nameOfCheckboxes"]').each(function(index){
array[index] = $(this).value();
}
var r = $.param(array);
$('#someHiddenFieldInForm').value(r);
}
(代码未经测试,当然)
答案 3 :(得分:1)
您可以通过添加以下jQuery来解决此问题:
$(function () {
$("#myform").submit(function(){
$("input[name='delete']:not(:checked)").attr("checked","checked").val("off");
});
});
myform
是您表单的ID,delete
是复选框的名称。
答案 4 :(得分:1)
答案 5 :(得分:0)
解决这个问题的另一种方法是接受一个奇怪的HTML表单并使用在声明期间使用ternary operators的局部变量捕获它。
例如,给出一个复选框
<input type="checkbox" name="notify_users" id="notify_cb">
无论是否包含复选框值,您都可以像这样处理帖子:
// normal boolean value
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' );
// explicitly set a 1 or 0
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' )? 1 : 0);
// explicitly set 'yes' or 'no'
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' )? 'yes' : 'no');
在我看来,这比向客户端添加额外的Javascript更好,只是因为它维护的次数要少一些(并且对于继任者/其他开发人员来说,可以说更清楚地了解正在发生的事情)