【问题标题】:How to send multiple values via checkbox in a dynmaic loop using cakePHP?如何使用 cakePHP 在动态循环中通过复选框发送多个值?
【发布时间】:2015-04-12 16:46:18
【问题描述】:

首先:是的,我知道这些 SO 问题 cakephp-checkbox-multiple-select-just-sends-the-value-of-last-selected-checkboxmultiple-inputs-with-same-name-through-post-in-php 。但是两个线程都没有回答我的同一个问题。

我的问题: 我正在为“行星路线”创建一个视图。我现在想创建一个表格,其中列出了所有“路线行星”,最后带有一个复选框。在桌子周围有一个表格(这就是我的想法)发送一个列表/id 数组以将它们从路由中删除。

我做了几次尝试,但我的请求中没有得到正确的数据。

基本信息:该表是使用 foreach-loop 构建的

- foreach($routePlanets as $routeplanet)
  - $class = $this->Html->cycle('even', 'odd')

  %tr{:class => "#{$class}"}
    %td.col1
      = [...]
    %td.col2
      = [...]          
    %td.colremove
      = # this is the line where to create the checkbox     

第一次尝试:每行的复选框

%td.remove
  = $this->Form->checkbox('id', array('value' => $routeplanet['RoutePlanet']['id'], 'hiddenField' => false))

正如我在写这篇文章时所假设的那样,这总是会给我最后一个值。例如这是生成的 HTML

// First row
<td class="remove"><input type="checkbox" name="data[Routeplanet][id]"  value="1"/></td>

// Second row
<td class="remove"><input type="checkbox" name="data[Routeplanet][id]"  value="3"/></td>

当我选择两行时,我收到以下请求,显示仅传输最后一行(或覆盖最后一行之前的所有行):

var_dump($this->request->data['Routeplanet']);
// shows 
array(1) {
  ["id"]=>
  string(1) "3"
}

当访问数据时,我得到一个带有最后一个 ID 的“有效”结果:

$planetIds =  $this->request->data['Routeplanet']['id'];
var_dump($planetIds); 
// shows: string(1) "3"

第二次尝试:然后我读入两个 SO 问题之一(见上文)以使用 name=id[],因此我将行更改为

%td.remove
  = $this->Form->checkbox('id', array('value' => $routeplanet['RoutePlanet']['id'], 'hiddenField' => false))

这会产生以下 HTML

// First row
<td class="remove"><input type="checkbox" name="data[Routeplanet][id[]]"  value="1"/></td>

// Second row
<td class="remove"><input type="checkbox" name="data[Routeplanet][id[]]"  value="3"/></td>

同时选择两个结果

var_dump($this->request->data['Routeplanet']);
// shows 
array(1) {
  ["id["]=>
  string(1) "3"
}

当访问数据时,我得到一个带有最后一个 ID 的“有效”结果:

$planetIds =  $this->request->data['Routeplanet']['id[]'];
var_dump($planetIds); 
// shows: NULL

所以我尝试了 SO 问题的第二个建议(见上文),使用 selectmultiple =&gt; checkbox 选项:

- $options[] = $routeplanet['RoutePlanet']['id']
= $this->Form->select('id', $options, array('multiple' => 'checkbox', 'hiddenField' => false))

但这会导致错误的 HTML

// First row
<td class="remove">
<div class="checkbox"><input type="checkbox" name="data[Routeplanet][id][]" value="0" id="0" /><label for="0">1</label></div>
</td>

// Second row
<td class="remove">
<div class="checkbox"><input type="checkbox" name="data[Routeplanet][id][]" value="0" id="0" /><label for="0">1</label></div>
<div class="checkbox"><input type="checkbox" name="data[Routeplanet][id][]" value="1" id="1" /><label for="1">3</label></div>
</td>

如您所见 a) 在第二行中,还添加了第一行(因为 $options[])和 b) 值不是 $routeplanet['RoutePlanet']['id'] - 它们仅用于标签(我不顺便想要)。由于布局和 HTML 错误,我可以在这里中断,但让我向您展示甚至错误的请求:

array(1) {
  ["id"]=>
  array(3) {
    [0]=>
    string(1) "0"
    [1]=>
    string(1) "0"
    [2]=>
    string(1) "1"
  }
}

然后我考虑做另一个循环来填充选项,但我已经假设所有行都将具有所有选项。我是对的:

- foreach($routePlanets as $routeplanet)
  - $options[] = $routeplanet['RoutePlanet']['id']

- foreach($routePlanets as $routeplanet)
  %td.remove
    = $this->Form->select('id', $options, array('multiple' => 'checkbox', 'hiddenField' => false))

每行生成以下 HTML:

<td class="remove">
<div class="checkbox"><input type="checkbox" name="data[Routeplanet][id][]" value="0" id="0" /><label for="0">1</label></div>
<div class="checkbox"><input type="checkbox" name="data[Routeplanet][id][]" value="1" id="1" /><label for="1">3</label></div>
</td>    

所以我现在的问题是:如何构建一个有效的表单,让我可以选择在每一行中标记一个复选框,从而使每个标记的行都在我在控制器中访问的已发送请求中?

提前致谢

【问题讨论】:

标签: php cakephp checkbox


【解决方案1】:

ndm 提供的链接非常有帮助 - 谢谢!我的错误是我只在文档中检查了“复选框”和“选择”(带有多个选项),但完全忘记了“正常”输入。

这就是我最后的做法:

表格:

- # MyModel as Helpername for easier access to the array
- $fieldname = 'MyModel.' . $i . '.id'
= $this->Form->input($fieldname, array('value' => $routeplanet['RoutePlanet']['id'], 'type' => 'checkbox', 'label' => false, 'hiddenField' => false))

控制器:

$MyModelArray = $this->request->data['MyModel'];

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 2018-04-27
    • 2020-12-01
    • 2015-07-11
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多