CakePHP3.3.15:FormHelper没有生成正确的复选框代码

时间:2017-03-15 18:45:38

标签: cakephp-3.0

我正在使用复选框,而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因为没有它,如果我取消选中复选框,浏览器会告诉我需要选中该复选框! !

1 个答案:

答案 0 :(得分:0)

你似乎在混淆事物。为什么您认为隐藏值不是0?您的复选框显然代表一个布尔值,因此默认情况下,后备值应为0,表示&#34;未选中&#34;状态。

实际问题是复选框值应为1而不是0。它是0,因为您使用了错误的选项,value不是用于确定已检查状态,而是用于实际设置value属性值。您想要使用的是checkeddefault选项(如果有的话),因为表单助手应该能够从实体中读取值。

来自文档的引用:

  
      
  • checked - 布尔值表示选中此复选框。
  •   
     

[...]

     
      
  • default - 设置复选框的默认值。这允许您启用已选中的复选框,而无需检查POST数据。匹配的POST数据值将覆盖默认值。
  •   

鉴于您可能希望在实际保存实体之前保留用户选择,您可以使用default选项 - 如果有的话。

另请注意,在将基表的名称传递给您的输入时(实际上并不需要),请确保使用正确的驼峰表示法(即。Permissions而不是permissions }),因为这不代表实体属性!