我正在使用复选框,而CakePHP没有生成正确的代码,我无法理解原因:
我在我的控制器中初始化类似的实体:
public $defaultPermissionFields = [
/*
* Module, item, item_visible, item_editable
*/
['item_visible' => 0],
['item_visible' => 1],
];
$permissions = $this->Permissions->newEntities($defaultPermissionFields);
所以我在ctp文件中有以下代码:
<?= $this->Form->create($permissions, ['horizontal' => true])?>
<fieldset>
<div class="table-responsive well">
<table class="table table-bordered table-striped">
<?php foreach ($permissions as $key => $permission):?>
<tr>
<td class="text-center">
<?= $this->Form->checkbox('permissions.' . $key . '.item_visible', ['label' => false, 'value' => $permission->item_visible, 'required' => false]);?>
</td>
</tr>
<?php endforeach;?>
</table>
</div>
</fieldset>
<?= $this->Form->button(__("Save"), ["class" => "btn btn-primary btn-block"]) ?>
<?= $this->Form->end(); ?>
奇怪的是,生成了以下代码:
<table class="table table-bordered table-striped">
<tr>
<td class="text-center">
<input type="hidden" name="permissions[0][item_visible]" value="0"/> <-- WHY ???
<input type="checkbox" name="permissions[0][item_visible]" value="0">
</td>
</tr>
<tr>
<td class="text-center">
<input type="hidden" name="permissions[1][item_visible]" value="0"/>
<input type="checkbox" name="permissions[1][item_visible]" value="1" checked="checked">
</td>
</tr>
</table>
如您所见,对于第二行,复选框值为1
,并且已对其进行检查,其隐藏值为0
。这是预期的代码。
的但
对于第一行,复选框值为0
AND ,隐藏值也为0
而不是1.
你能告诉我为什么吗?
我遇到的第二个问题,但可能是由第一个引起的,我需要添加required => false
因为没有它,如果我取消选中复选框,浏览器会告诉我需要选中该复选框! !
答案 0 :(得分:0)
你似乎在混淆事物。为什么您认为隐藏值不是0
?您的复选框显然代表一个布尔值,因此默认情况下,后备值应为0
,表示&#34;未选中&#34;状态。
实际问题是复选框值应为1
而不是0
。它是0
,因为您使用了错误的选项,value
不是用于确定已检查状态,而是用于实际设置value
属性值。您想要使用的是checked
或default
选项(如果有的话),因为表单助手应该能够从实体中读取值。
来自文档的引用:
checked
- 布尔值表示选中此复选框。[...]
default
- 设置复选框的默认值。这允许您启用已选中的复选框,而无需检查POST数据。匹配的POST数据值将覆盖默认值。
鉴于您可能希望在实际保存实体之前保留用户选择,您可以使用default
选项 - 如果有的话。
另请注意,在将基表的名称传递给您的输入时(实际上并不需要),请确保使用正确的驼峰表示法(即。Permissions
而不是permissions
}),因为这不代表实体属性!