我要显示的内容可能是现有的最恐怖的代码,因此请做好准备。我是PHP新手,并且收到了CodeIgniter项目。我们开始:
在我的edit_article
视图中,我动态生成<input>
字段,并通过将它们发布为数组使它们可被控制器访问,请注意name="pricelevel_checked_array[]"
:
<form id="form-work" class="form-horizontal" role="form" autocomplete="off" method="post">
<!-- excluded code to display form content -->
<?php
$pricelevel_array = array();
$count = 0; ?>
<?php foreach($array_used_for_loop as $item_used_for_loop): ?>
<?php $article_group_price = ""; ?>
<!-- excluded code to fill $article_group_price -->
<div class="col-sm-2">
<div class="checkbox">
<span class="bg-transparent left">
<input type="checkbox" data-init-plugin="switchery" data-size="small" data-color="primary" id="<?=$count?>"
<?php if($article_group_price !== ""): ?>
<?php array_push($pricelevel_array, 1); ?>
checked="checked"
<?php else: array_push($pricelevel_array, 0); ?>
<?php endif; ?>
onchange="groupprice_active_changed(this)"/>
</span>
</div>
</div>
<input hidden type="number" id="pricelevel_checked_array" name="pricelevel_checked_array[]" value="<?=$pricelevel_array[$count];?>">
<?php $count++; ?>
<?php endforeach; ?>
</form>
如您所见,我根据1
的值用0
或$article_group_price
填充该数组(我从控制器和数据库中获取这些值)。
在第一次加载视图时一切正常,并且数组已正确填充,但是当我选中或取消选中复选框时,似乎无法更新数组。
我尝试使用javascript onchange="groupprice_active_changed(this)"
快速而肮脏地执行此操作,在此我将使用$count
变量来更改数组的索引,但是不幸的是,由于我只有得到一个值而不是整个数组:
<script>
function groupprice_active_changed(obj) {
if($(obj).is(":checked")){
alert("Yes checked");
var input_value_array = document.getElementById('pricelevel_checked_array').value;
console.log(input_value_array);
for (index = 0; index < input_value_array.length; index++) {
console.log(input_value_array[index]);
}
}else{
alert("not checked")
}
}
</script>
如何最好地更新此数组或更改代码,以便将动态生成的复选框发布到控制器? 另一个问题是,即使它为false,我也需要控制器中的checkbox-id。而且浏览器不会发布未选中的复选框值。因此,仅传递复选框是不可行的。
我当然准备发布更多代码。
谢谢
免责声明:请勿窃用
查看:Complete code
控制器:Complete code
编辑1 :在上一节中将“ php”更改为“浏览器”
编辑2 :添加的效果与整个代码一样好,因为过滤只会增加难度。
答案 0 :(得分:1)
我已经看到用来使复选框表现更好的一种技术是使用 与复选框同名的隐藏输入。将隐藏的输入放在 复选框。如果未选中该复选框,则隐藏输入的值 被发送。如果选中复选框,则复选框值将覆盖隐藏的输入。 这是有效的,因为仅发送了一个值。浏览器发送后一个。
看看下面的例子。
<html>
<head>
</head>
<body>
<div>
<form method="post">
<input type="hidden" name="foo" value="off">
<input type="checkbox" name="foo" /> Foo
<input type="submit" />
</form>
</div>
</body>
</html>
<?php if ( ! empty($_POST) ) : ?>
<div> Hello </div>
<div>
Checkbox is <?= $_POST['foo']?>
</div>
<?php endif ?>
答案 1 :(得分:0)
我最终决定放弃整个数组方法,并通过将索引传递给控制器来遵循KISS原则。我使用这些索引仅保存已检查的行。感谢@ryantxr向我展示我对所有这些事情都想得太多。
<?php $index = 0; ?>
<?php foreach($array_used_for_loop as $item_used_for_loop): ?>
<?php $article_group_price = ""; ?>
<!-- excluded code to fill $article_group_price -->
<div class="col-sm-2">
<div class="checkbox">
<span class="bg-transparent left">
<input type="checkbox" name="group_active[]" data-init-plugin="switchery" data-size="small" data-color="primary" value="<?=$index;?>"
<?php if($article_group_price !== ""): ?>
checked="checked"
<?php endif; ?>/>
</span>
</div>
</div>
</div>
<?php $index++; ?>
<?php endforeach; ?>
public function edit_article($id) {
// Excluded code
$group_prices_active = array();
if(isset($data['group_active'])):
echo "<script>console.log('GROUP_ACTIVE ".print_r($data['pricelevel_checked'])."');</script>";
foreach($data['group_active'] as $value):
array_push($group_prices_active, $group_prices[$value]);
endforeach;
echo "<script>console.log('GROUP_PRICES_ACTIVE ".print_r($group_price_active)."');</script>";
unset($data['group_active']);
endif;
// Excluded code
$this->m_articles->edit_article($data, $id, $article_types, $group_prices_active);
$this->session->set_flashdata('succes', $this->lang->line('edit_success'));
redirect('/administrator/articles', 'refresh');
}