如何使用 cakePHP 在动态循环中通过复选框发送多个值?
How to send multiple values via checkbox in a dynmaic loop using cakePHP?
首先:是的,我知道这些 SO 问题 cakephp-checkbox-multiple-select-just-sends-the-value-of-last-selected-checkbox and multiple-inputs-with-same-name-through-post-in-php。但是这两个线程都没有回答我的同一个问题。
我的问题:
我正在为 "route of planets" 创建一个视图。我现在想创建一个 table,其中列出了所有 "routeplanets",末尾有一个复选框。在 table 周围有一个表单(这就是我的想法)发送一个 list/array 的 ID 以将它们从路由中删除。
我尝试了几次,但在我的请求中没有得到正确的数据。
基本信息:table 是使用 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>
当我 select 两行时,我收到以下请求,显示仅传输最后一行(或覆盖最后一行之前的所有内容):
var_dump($this->request->data['Routeplanet']);
// shows
array(1) {
["id"]=>
string(1) "3"
}
访问数据时,我得到一个 "valid" 结果,最后一个 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"
}
访问数据时,我得到一个 "valid" 结果,最后一个 ID:
$planetIds = $this->request->data['Routeplanet']['id[]'];
var_dump($planetIds);
// shows: NULL
所以我尝试了 SO 问题的第二个建议(见上文),使用 select
和 multiple => 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>
所以我现在的问题是:如何构建一个有效的表单,让我可以选择在每一行中标记一个复选框,从而使每个标记的行都在我在控制器中访问的已发送请求中?
提前致谢
ndm 提供的 link 非常有帮助 - 谢谢!我的错误是我只检查了文档中的 "checkbox" 和 "select"(有多个选项),但完全忘记了 "normal" 输入。
我最后是这样的:
表格:
- # 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'];
首先:是的,我知道这些 SO 问题 cakephp-checkbox-multiple-select-just-sends-the-value-of-last-selected-checkbox and multiple-inputs-with-same-name-through-post-in-php。但是这两个线程都没有回答我的同一个问题。
我的问题: 我正在为 "route of planets" 创建一个视图。我现在想创建一个 table,其中列出了所有 "routeplanets",末尾有一个复选框。在 table 周围有一个表单(这就是我的想法)发送一个 list/array 的 ID 以将它们从路由中删除。
我尝试了几次,但在我的请求中没有得到正确的数据。
基本信息:table 是使用 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>
当我 select 两行时,我收到以下请求,显示仅传输最后一行(或覆盖最后一行之前的所有内容):
var_dump($this->request->data['Routeplanet']);
// shows
array(1) {
["id"]=>
string(1) "3"
}
访问数据时,我得到一个 "valid" 结果,最后一个 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"
}
访问数据时,我得到一个 "valid" 结果,最后一个 ID:
$planetIds = $this->request->data['Routeplanet']['id[]'];
var_dump($planetIds);
// shows: NULL
所以我尝试了 SO 问题的第二个建议(见上文),使用 select
和 multiple => 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>
所以我现在的问题是:如何构建一个有效的表单,让我可以选择在每一行中标记一个复选框,从而使每个标记的行都在我在控制器中访问的已发送请求中?
提前致谢
ndm 提供的 link 非常有帮助 - 谢谢!我的错误是我只检查了文档中的 "checkbox" 和 "select"(有多个选项),但完全忘记了 "normal" 输入。
我最后是这样的:
表格:
- # 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'];