2017-03-15 32 views
0

我與複選框戰鬥在那裏的CakePHP不產生正確的代碼,我不明白爲什麼:CakePHP3.3.15:表單助手不產生正確的複選框代碼

我初始化實體一樣,在我的控制器:

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隱藏的價值也0而不是1

你能告訴我爲什麼嗎?

我有第二個問題,但可能是由於第一個問題導致我需要添加required => false因爲沒有它,如果我取消選中複選框,瀏覽器告訴我需要選中該框!

回答

0

你似乎在混淆東西。爲什麼你會期望隱藏的值不是0?您的複選框顯然表示一個布爾值,所以默認情況下,回退值應爲0,它表示「未選中」狀態。

實際的問題是,複選框的值應該是1而不是0。它是0,因爲您使用了錯誤的選項,value不用於確定檢查狀態,而是實際設置value屬性值。考慮到表單助手應該能夠自己從實體讀取值,您要使用的是checkeddefault選項(如果有的話)。從文檔

報價:

  • checked - 布爾表明,該複選框被選中。

[...]

  • default - 設置複選框的默認值。這使您可以選中複選框,而不必檢查POST數據。匹配的POST數據值將覆蓋默認值。

考慮,你可能希望保留用戶的選擇,直到實體實際上是被保存,你會使用default選項 - 如果在所有。

此外請注意,當傳遞基表的名稱到您的輸入(這實際上並不需要)時,請確保使用適當的駱駝套管表示法(即。Permissions而不是permissions),因爲這不代表實體屬性!

+0

你說得對,問題不在我身上。實際上,我使用了'value',因爲複選框的狀態並不反映'item_'的值。這是我的主要問題。無論「item_visible」的值是多少,複選框都會被選中,我不明白爲什麼。這似乎是問題來自使用items數組,我不認爲我使用了壞記號....也許你可以看看這個[gist](https://gist.github.com/2ndGAB/a77a6b01822d82da27043c7b148a5847) – 2ndGAB

+0

好吧,當然,我讀對角線的帖子的結尾: - / – 2ndGAB