2010-11-18 94 views
5

我试图在现有的网站上工作,但我发现了一个错误,但我不确定它为什么是一个错误或者如何解决它。仅当HTML复选框元素被检查时才提交?

该网站基本上列出了在一个城市出租的一些商业物业。有一个类从数据库中获取列表并从中创建一个对象。在每个对象中都有一个与该属性相关联的图像数组。

当用户编辑列表时,他们会得到一个编辑页面,其中包含图像列表以及旁边的“删除”复选框。复选框都具有相同的名称,以便将它们提交回服务器时,应用程序获取要删除的图像数组。

应该发生什么,是应用程序具有开/关值的数组(其中on = delete),并且数组中每个值的索引都对应于列表对象中图像的索引 - 当其中一个值为“on”时,图像阵列中与该“on”值对应的文件名将从文件系统中删除,并且该图像将从数据库中删除。

但是,当表单被提交时,应用程序只获取一个只有选中复选框的0索引数组。所以,如果我要删除设定了三个任意图像,应用程序会得到

 
Array { 
    [0] => "on", 
    [1] => "on", 
    [2] => "on" 
} 

这显然是行不通的,在上市第3个图像将无论哪个复选框被设置删除。

我该如何解决这个问题?我想避免命名每个复选框(delete_1delete_2delete_3等),因为系统已经构建为与所有具有相同名称的复选框一起工作。有没有办法可以强制所有复选框以“开”或“关”提交?

回答

5

不,你不能强迫选中复选框提交,但你可以给他们唯一的值(而不是“全部”)以确定哪些被检查而不改变名称。

+0

真棒,不知道你能做什么那。非常感谢(在允许的情况下会接受) – 2010-11-18 03:20:08

+0

omg,这是一个可怕的解决方案,绝对不是问题的答案。 – zerkms 2010-11-18 03:22:09

+2

@Steve我想避免以不同的方式命名它们,因为这将不得不改变后端的行为。我没有意识到你可以提交除“开”或“关”以外的值 - 这将需要最小的更改 – 2010-11-18 03:22:29

6

没有办法给力,但你可以只具有相同名称的复选框前面添加一个隐藏的权利和需要的值:

<input type="hidden" name="delete[42]" value="off" /> 
<input type="checkbox" name="delete[42]" value="on" /> 
+2

对不起,我试图避免让不同的na mes每个复选框。目前他们都只是名为'delete',应用程序将它们作为数组接收。我不认为这种技术可以与他们的所有人同名 – 2010-11-18 03:18:44

+0

@Carson Myers:正如我所说的,你可以给**同名**复选框。不清楚你有什么名字''。好点吗? – zerkms 2010-11-18 03:20:12

+0

@Carson Myers:“我不认为这种技术会起作用”---你为什么不试试? ;-) – zerkms 2010-11-18 03:21:16

1

如果你真的想要在on和off上返回一个数组,那么你需要附加一个函数给表单提交,它将扫描所有带有给定名称的复选框,并将它们的值放入数组中。

在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); 
} 

(代码是未经测试,当然)

+2

+1有效的解决方案,但JavaScript似乎矫枉过正这个问题 – 2010-11-18 03:46:26

+0

Javascript,真的吗? – Stephen 2010-11-18 04:36:14

+0

你真的没有什么更好的事情可以抱怨吗? Carson要求解决方案不需要改变现有的“功能”。他的问题不清楚他愿意改变多少,使用JavaScript不需要修改现有的代码。 – Jeremy 2010-11-18 17:28:10

1

你可以通过添加下面的jQuery解决这个问题:

$(function() { 
    $("#myform").submit(function(){ 
    $("input[name='delete']:not(:checked)").attr("checked","checked").val("off"); 
    }); 
}); 

myform是您的表单的ID,delete是复选框的名称。

+1

我简单地考虑过使用javascript,但是在这种情况下它似乎有点矫枉过正。这个问题被接受的答案涉及将foreach($ listing ['delete'] as $ index => $ state)''改为'foreach($ listing ['delete'] as $ index)'',我认为这是理想的我的解决方案。 +1虽然有效的解决方案 – 2010-11-18 03:46:08

+0

格特,就像你比我的好。 +1 – Jeremy 2010-11-18 03:49:29

+1

Javascript是一个黑客解决方案。 – Stephen 2010-11-18 04:36:40

1

弗雷德Nurk的解决方案是好的,我upvoted它。就我个人而言,当我遇到这种情况时,我总是给这些字段命名不同的名字。我使用一个通用的前缀,后跟一个下划线,因此很容易识别,然后使用某种类型的ID。我会经常制作一组具有相同模式的字段,如“name_1”,“amount_1”,“foobar_1”,“name_2”,“amount_2”等。在字段中循环并将这些名称分开很容易。 (在Java中,只是indexOf('_')。)

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对于客户来说,如果仅仅是因为它稍微维持一点点(并且可以更清楚地知道继任者/其他开发者能够理解正在发生的事情)

相关问题