我在表单中有一些共享相同名称的字段,它们是从数据库表中自动生成的,我不知道会有多少字段。
<div class="row w40 fl">
<label for="code" class="label">codice <span class="form-notice">*</span></label>
<input type="text" class="input" name="code" id="code" placeholder="Codice" value="<?= Input::post('code') ?>">
</div>
<div class="row w40 fr">
<label for="name" class="label">nome <span class="form-notice">*</span></label>
<input type="text" class="input" name="name" id="name" placeholder="Nome" value="<?= Input::post('name') ?>">
</div>
<?php foreach($categories as $cat): ?>
<div class="w20 fl">
<label for=""><?= ucwords($cat->name) ?></label>
<input type="checkbox" name="cat[]" value="<?= $cat->id ?>" <?= ($cat->id == Input::post('cat')) ? 'checked' : '' ?>>
</div>
<?php endforeach; ?>
问题是如果在提交后发生错误,则所有已检查的输入都将丢失。如果他们有不同的名字就没有任何问题,但他们总是不同。
所以在提交之后,我怎么能记住检查过的并检查它们?假设用户检查其中5个,填写所有表单输入但留下一个空白。显然会弹出一个错误,但是当所有其他输入都有用户输入的数据时,复选框不会,至少我不知道怎么做。
请注意,Input::post('code')
表示(isset($_POST['code'])) ? $_POST['code'] : ''
谢谢,希望你能建议我一个解决方案。
好的,所以经过更多的研究后,这是解决方案。
if ( isset($_POST['cat']) ) {
foreach ($_POST['cat'] as $cbCat) {
$selectedCat[$cbCat] = 'checked';
}
}
<?php foreach($categories as $cat): ?>
<div class="w20 fl">
<label for="cat-<?= $cat->id ?>"><?= ucwords($cat->name) ?></label>
<input type="checkbox" id="cat-<?= $cat->id ?>" name="cat[]" value="<?= $cat->id ?>" <?= (isset($selectedCat[$cat->id])) ? $selectedCat[$cat->id] : '' ?> >
</div>
<?php endforeach; ?>
答案 0 :(得分:1)
可能的解决方案:
cat[]
是一个数组,因此您可以给它数字索引来识别哪个复选框是哪个:
<?php $i=1;
foreach($categories as $cat): ?>
<div class="w20 fl">
<label for=""><?= ucwords($cat->name) ?></label>
<input type="checkbox" name="cat[<?php echo $i ?>]" value="<?= $cat->id ?>" <?= ($cat->id == Input::post('cat[$i]')) ? 'checked' : '' ?>>
</div>
<?php i++ ;?>
<?php endforeach; ?>
我只是不确定你是否可以将这个Input::post('cat[$i]'))
变量传递给你的moethod
答案 1 :(得分:1)
以下是一些代码,显示复选框会发生什么。
关于他们的重要一点是,未经检查的人不会在$ _POST中发送价值!只有CHECKED的人才这样做。我提供了一些证明这一点的代码。
$ _POST的'var_dump'允许您查看“复选框”表单中真正返回的内容。
它是经过测试的代码。
它适用于windowx XP上的PHP 5.3.18。
<?php
// we will have five checkboxes and each will have a separate value as follows...
$checkboxValues = array('cbx01', 'cbx02', 'cbx03', 'cbx04', 'cbx05');
// This array keyed on the checkbox VALUE will be checked or not...
// This is ALL the checkboxes!
$checkboxIsChecked = array('cbx01' => false,
'cbx02' => false,
'cbx03' => false,
'cbx04' => false,
'cbx05' => false);
/*
* Determine the 'cat' checkboxes that are actually currently checked!
*
* We can know this because the $_POST['cat'] array
* will contain VALUES for the Checkboxes that the user ACTUALLY checked!
*
* The UNCHECKED Checkboxes do NOT send any VALUE so they are MISSING from the array!
*
* i.e. if checkbox value: 'cbx02' and 'cbx04' are checked by the user then
* the 'cat' array will be :
* 0 => 'cbx02'
* 1 => 'cbx04'
*
* All the other checkboxes will be 'unchecked'.
*
*
*/
var_dump($_POST); // you can see what comes in!
if (isset($_POST['cat'])) { // may have some checked 'cat' checkboxes...
foreach ($_POST['cat'] as $checkboxValue) {
// mark the appropriate checkbox as 'CHECKED' i.e cbx03
$checkboxIsChecked[$checkboxValue] = true;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Show Checkboxes and the input from them.</title>
</head>
<body>
<div class="main" id="main">
<!-- heading -->
<strong><?php echo 'Test checkbox setting...'?></strong><br/>
<form method="POST" action="">
<?php foreach($checkboxValues as $cbxValue): ?>
<div>
<?php $labelId = $cbxValue . '_id'; // generate a label ?>
<label for="<?php echo $labelId?>"><?= ucwords('A '. $cbxValue . ' thingy!') ?></label>
<input type="checkbox"
name="cat[]"
id="<?php echo $labelId?>"
value="<?php echo $cbxValue?>"
<?php echo $checkboxIsChecked[$cbxValue] ? 'checked' : '' ?>>
</div>
<?php endforeach; ?>
<input type="submit" value="GO"/>
</form>
</div>
</body>
</html>