我的HTML中有一个复选框,如下所示:
<input type="hidden" name="<TMPL_VAR NAME=SHORT>" value="<TMPL_VAR NAME=ELSE>">
<input type="checkbox" name="<TMPL_VAR NAME=SHORT>" id="checkbox-2" value="<TMPL_VAR NAME=FLAG>" class="checkbox mid-margin-left">
<label for="checkbox-2" class="label"><TMPL_VAR NAME="NAME"></label>
基本上,我在这里要完成的是,如果选中复选框,则发送一个值,如果未选中复选框则发送另一个值(基本上是默认值)。现在,这是动态的,所以我真的无法在CGI中做一些事情来说,“如果定义了那么它意味着这个,如果不是那么它意味着别的东西。”
无论如何,当我不选中此框时,我会从隐藏的输入中获取值。但是,当我检查它时,我得到两个值。现在,我可以说,“如果这个值不止一个,那么使用的值就是第二个值。”但是,如果我获得接受多个值的选择列表的值,该怎么办?在那种情况下,我不想说取第二个值,因为发送的所有值都是有效的。
所以,我想说的是:“如果它是一个复选框,并且有多个值,则取第二个值;否则,取第一个值。”
关于如何做到这一点的任何想法?也许我这样做不对?有关更好的方法来实现这一点的任何建议吗?我不想使用单选按钮作为布尔值(是/否),但如果这是唯一的方法,那就这样吧。
答案 0 :(得分:2)
为方便起见,我会用JavaScript和jQuery来做。唯一的缺点是,如果您的客户已禁用JS,它将无效。
你的表格可能保持不变。我做了一个简单的例子。确保所有内容都有ID。
<form id="myform" method='post' action="/echo/json/">
<input type="hidden" id="hidden-foo" value="foo not selected" />
<p>Foo <input type='checkbox' name='foo' id='foo' value='foo selected' /></p>
<p>
<select name='bar' id='bar' multiple>
<option value='first bar'>bar 1</option>
<option value='second bar'>bar 2</option>
<option value='third bar'>bar 3</option>
</select>
</p>
<p><input type='submit' name='submit' value='submit' /></p>
</form>
现在这里是JS代码,它应放在表单下面或load
事件的事件处理程序中:
$(document).ready(function() {
$("#myform").submit(function(){
// if checkbox is not checked, change value and check so it's transmitted
if (! $("#foo").is(":checked")) {
$("#foo").val($("#hidden-foo").val()).prop('checked', true);
}
// take first option if no option is selected
if( $("#bar option:selected").length == 0 ) {
$("#bar option:first").attr('selected','selected');
}
})
});
这很简单:
这是一个jsFiddle来演示。您应该打开Firebug控制台以查看输出。
现在应该可以很容易地将其变成动态的,可以处理所有表单字段,而模板引擎不必干涉JS代码。
答案 1 :(得分:2)
如果您不想要JS,我建议您更改表单,以便每个字段都有一个备用值,并在名称上加上前缀:
<form id="myform" method='post' action="/echo/json/">
<input type="hidden" name= "alternate-foo" value="foo not selected" />
<input type="hidden" name="alternate-bar" value="first bar" />
<p>Foo <input type='checkbox' name='foo' id='foo' value='foo selected' /></p>
<p>
<select name='bar' id='bar' multiple>
<option value='first bar'>bar 1</option>
<option value='second bar'>bar 2</option>
<option value='third bar'>bar 3</option>
</select>
</p>
<p><input type='submit' name='submit' value='submit' /></p>
</form>
在您的Perl代码中,您可以执行以下操作:
use strict;
use warnings;
use CGI;
my $q = CGI->new;
$q->param( 'foo', $q->param('alternate-foo') ) unless $q->param('foo');
$q->param( 'bar', $q->param('alternate-bar') ) unless $q->param('bar');
或者,更具活力:
use 5.014;
foreach my $alt ( grep { /^alternate-/ } $q->param ) {
my $name = $alt =~ s/^alternate-//r;
$q->param( $name, $q->param( $alt )) unless $q->param($name);
}