arrays - 检查是否在数组的一部分时设置了复选框值 - 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"> </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"> </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"> </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"> </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 可以很好地遍历循环,当它到达复选框数据时就好像有什么东西中断了。
解决方案
您可以使用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',
推荐阅读
- java - Java 无法编译具有泛型参数和默认方法实现的功能接口
- python - Codecademy print_board() 函数如何创建一行?它不应该逐项(,)吗?
- email - 尝试使用 smtp-relay.gmail.com 和 Nodemailer 发送电子邮件。错误 ssl3_get_record: 错误的版本号
- firebase - 如何在颤振聊天屏幕中根据时间戳打印从firestore获得的数据
- xml - Wpallimport 按标题检查重复
- c# - .NET Core 3.1 中的区域、页面和布局
- parameters - 如何获取 DREIDING 力场的参数
- google-cloud-platform - 我们在 gcp 中需要 ufw 吗?还是gcp的防火墙足够好?
- python - 在 Yolov3 Tensorflow 中没有检测到任何东西
- python - XGBoost 和 Numpy 问题