PHP CodeIgniter:更新绑定到输入字段的动态数组

时间:2018-09-14 14:19:14

标签: php jquery arrays codeigniter

我要显示的内容可能是现有的最恐怖的代码,因此请做好准备。我是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 :添加的效果与整个代码一样好,因为过滤只会增加难度。

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向我展示我对所有这些事情都想得太多。

v_edit_article

<?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');
}