首页 > 解决方案 > 检查是否在数组的一部分时设置了复选框值 - Codeigniter

问题描述

我有一个填充有复选框的动态表单。我正在尝试为我的仪表板实现权限/角色系统。

表单的填充取决于数据库中存储的权限。对于这个例子,我只有 2 个。这是表单的代码:

                                  if (!empty($permissions)) {
                                    foreach ($permissions as $perm) {
                                ?>
                                        <tr>
                                            <td><?php echo $perm->display_name; ?></td>
                                            <td class="text-center"><div class="checkbox checkbox-success checkbox-circle mb-2 ml-2">
                                               
                                            <input name="view[]" id="<?php echo $perm->id ?>-view" type="checkbox" value="1">
                                            <label for="<?php echo $perm->id ?>-view">&nbsp;</label>
                                        </div></td>
                                            <td class="text-center"><div class="checkbox checkbox-success checkbox-circle mb-2 ml-2">
                                           
                                            <input name="edit[]" id="<?php echo $perm->id ?>-edit" type="checkbox" value="1">
                                            <label for="<?php echo $perm->id ?>-edit">&nbsp;</label>
                                        </div></td>
                                            <td class="text-center"><div class="checkbox checkbox-success checkbox-circle mb-2 ml-2">
                                            
                                            <input name="create[]" id="<?php echo $perm->id ?>-create" type="checkbox" value="1">
                                            <label for="<?php echo $perm->id ?>-create">&nbsp;</label>
                                        </div></td>
                                            <td class="text-center"><div class="checkbox checkbox-success checkbox-circle mb-2 ml-2">
                                            
                                            <input name="delete[]" id="<?php echo $perm->id ?>-delete" type="checkbox" value="1">
                                            <label for="<?php echo $perm->id ?>-delete">&nbsp;</label>
                                        </div></td>
                                        </tr>
                                       
                                    <input type="hidden" name="permission_id[]" value="<?php echo $perm->id ?>">
                                    <input type="hidden" name="permission_name[]" value="<?php echo $perm->permission_name ?>">
                                        <?php
                                    }
                                }
                                ?>

表单效果很好,显示如下:

在此处输入图像描述

这是我的控制器代码:

 public function setPermissions()
 {
    if ($this->isAdmin() == true) {
        $this->loadThis();
    } else {
        // GET FORM FIELD INPUTS
        
        extract($_POST);

            foreach ($permission_id as $key => $permission_id) {
                $data = array(
                    'permission_id'=> $permission_id,
                    'permission_name' => $permission_name[$key],
                    'can_view' => $view[$key],
                    'can_edit' => $edit[$key],
                    'can_create' => $create[$key],
                    'can_delete' => $delete[$key],
                    'role_id' => $roleId,
                     );
                                 

                $result = $this->settings_model->setPermissions($data);
            }
        }

        if ($result > 0) {
            $this->session->set_flashdata('success', 'Permissions set successfully');
        } else {
            $this->session->set_flashdata('error', 'Setting permissions failed');
        }

        // LOAD VIEW

        redirect('staffPermissions');
    }

和我的模型:

public function setPermissions($data)
 {
    $this->db->trans_start();
    $this->db->insert('app_staff_permissions', $data);       
    $this->db->trans_complete();
    
    return true;
}

我已经尝试在复选框上方放置一个隐藏输入字段的技巧,但这只会返回添加到数据库的最后一行的结果。

我遇到的问题是,当未选中复选框时,我收到未声明变量的错误。大概这是因为它返回一个空值。

我试图检查这样的值:

                    'can_view' => ($view[$key]) == '1' ? '1' : '0',
                    'can_edit' => ($edit[$key]) == '1' ? '1' : '0',
                    'can_create' => ($create[$key]) == '1' ? '1' : '0',
                    'can_delete' => ($delete[$key]) == '1' ? '1' : '0',

但这也不起作用并引发相同的错误。我在数组中尝试了 if else 语句,但这显然不起作用。我现在真的坚持这一点,并愿意尝试任何建议。有什么方法可以检查该值是否为空,如果是,则为其分配“0”?

编辑 :

我已经尝试了数百种不同的方法来解决这个问题,我认为通过使用

 'can_view' => isset($view[$i]) ? 'on' : 'off',
 'can_edit' => isset($edit[$i]) ? 'on' : 'off',
 'can_create' => isset($create[$i]) ? 'on' : 'off',
 'can_delete' => isset($delete[$i]) ? 'on' : 'off',

我过来了变量没有被设计,它确实在数据库中写了“关闭”或“打开”。

但是我得到一个奇怪的行为,只有第一行被插入。例如,如果我像这样设置我的复选框(现在更改为拨动开关):

在此处输入图像描述

我希望我的数据库看起来像这样

上 | 关闭 | 上 | 关 ---- 关 | 上 | 关闭 | 上

但这就是我得到的:

在此处输入图像描述

我注意到的另一件奇怪的事情是它们是从底部插入的,第一列“id”是一个 AI 列,但 id 在表格中向后递增。

底行是插入的第一行。现在您可以看到只有第一行包含任何复选框的“on”字段,第二行是 off 或 null。什么时候我们应该看到开、关、开、关等。

我尝试在控制器的 foreach 循环中包含 db 调用并执行常规 $this->db->insert 并且还尝试将其从 for each 中删除并使用 $this->db->insert_batch

其他参数permission_id 和permission_name 可以很好地遍历循环,当它到达复选框数据时就好像有什么东西中断了。

标签: arrayscodeignitercheckboxisset

解决方案


您可以使用isset来检查变量是否已声明并且与 NULL 不同。

'can_view' => isset(view[$key])? '1' : '0',
'can_edit' => isset($edit[$key])? '1' : '0',
'can_create' => isset($create[$key])? '1' : '0',
'can_delete' => isset($delete[$key])? '1' : '0',

推荐阅读