【问题标题】:PHP CodeIgniter: Updating a dynamic array bound to an input fieldPHP CodeIgniter:更新绑定到输入字段的动态数组
【发布时间】:2018-09-14 14:19:13
【问题描述】:

我将要展示的可能是现存最可怕的代码,所以请做好准备。我是 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>

如您所见,我用10 填充该数组,具体取决于$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>

我怎样才能最好地更新这个数组或更改我的代码,以便我可以将动态生成的复选框发布到控制器? 另一个问题是我需要控制器中的复选框 ID,即使它是错误的。并且浏览器不会发布未选中的复选框值。因此,仅传递复选框不是一种选择。

我当然准备发布更多代码。
谢谢

免责声明:请勿窃取
查看Complete code
控制者Complete code

编辑 1:在上一节中将“php”更改为“浏览器”
编辑 2:添加与整个代码一样好,因为过滤掉会只会让它变得更加困难。

【问题讨论】:

  • 不是 PHP 不发布复选框值。浏览器会(或不会)那样做。
  • 小细节,但已编辑
  • 请尽量增加你的代码来测试指定的问题。请在此处添加一个 jquery 标签。
  • 复选框输入没有name 标签。你想用 JavaScript 还是 PHP 来做这个工作?
  • @Brad 它看起来并不干净,但 &gt; 实际上以 /&gt; 的形式关闭了 6 行。我实际上是根据article_group_price 的状态修改&lt;input&gt; 属性。

标签: php jquery arrays codeigniter


【解决方案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 ?>

【讨论】:

  • 我在另一个问题中看到过类似的东西,但不太明白,现在我明白你和他们的意思了。很快就会试一试!
  • 我目前正在尝试这个,但在我的情况下两个值都被发送,如图所示:Array( [0] =&gt; false, [1] =&gt; on, [2] =&gt; false, [3] =&gt; false, [4] =&gt; on)(未选中 3 个复选框的中间)。但是,如果索引正确,我仍然可以通过两次发送数据并比较结果来使其工作。
【解决方案2】:

我最终决定放弃整个数组方法,并通过将我的索引传递给控制器​​来遵循 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');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2016-09-29
    • 1970-01-01
    • 2015-04-18
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多