Cakephp 3.6.14:使用复选框和过程数据创建表表单

时间:2019-01-22 11:07:12

标签: php arrays forms cakephp checkbox

我想创建一个表格,其中每行都有一个带有复选框的数组。因此,用户可以选择将在控制器中处理的行。

因此,我创建了表单和数组。数组的每一行都有Task Element的名称和一个复选框来选择它:

enter image description here

<h3><?= __('Task Elements') ?></h3>
<?php echo $this->Form->create('AddElement', ['url'=>['action' => 'add',$tasktypeid]]); ?>
<table cellpadding="0" cellspacing="0">
    <thead>
        <tr>
            <th scope="col"><?= $this->Paginator->sort('id') ?></th>
            <th scope="col"><?= $this->Paginator->sort('name') ?></th>
            <th scope="col"><?= $this->Paginator->sort('element_category_id') ?></th>
        </tr>
    </thead>
    <tbody>      
        <?php foreach ($taskElements as $taskElement): ?>      
        <tr>
            <td><?= $this->Number->format($taskElement->id) ?></td>
            <?= $this->Form->hidden('id',['value' => $taskElement->id]); ?>
            <td><?= $this->Form->control(h($taskElement->name), ['type' => 'checkbox']);?></td>
            <td><?= $taskElement->element_category_id != 0 ? $this->Html->link($taskElement->element_category->name, ['controller' => 'ElementCategories', 'action' => 'view', $taskElement->element_category->id]) : '' ?></td>

        </tr>
        <?php endforeach; ?>            
    </tbody>
</table><?php
echo $this->Form->submit('Add');
echo $this->Form->end();?>

但是在控制器debug($this->request->getData());中返回以下内容:

[
'id' => '32',
'Library_Element' => '0',
'Library_Element_2' => '0'
]

这是不正确的,因为'Library_Element'id是27而不是32。因此它应该返回2行的数组而不是1行3列的数组。

这是我希望收到的正确数组:

Array
(
    [0] => Array
        (
            [id] => 27
            [Library_Element] => '0'
        )

    [1] => Array
        (
            [id] => 32
            [Library_Element_2] => '0'
        )
)

或者理想情况下,我想获得一个像这样的数组:

Array
(
    [0] => Array
        (
            [id] => 27
            [name] => 'Library Element'
            [checked] => '0'
        )

    [1] => Array
        (
            [id] => 32
            [name] => 'Library Element 2'
            [checked] => '0'
        )
)

该如何解决?然后在控制器中,我要迭代POST数据,并检查是否检查了每一行。如何正确迭代数据?

1 个答案:

答案 0 :(得分:1)

您面临的问题是,当您的Web应用POST进入后端时,它将仅发送“表单”数据。

这意味着无论您需要发送回什么数据,都需要使用表单元素(例如:输入,选择,隐藏等)将其包含在html form标签中。在Cakephp模板中,您将使用Form帮助器来打印出这些元素。

在这种具体情况下,您将创建一个隐藏的id元素和一个复选框元素。复选框元素的值来自是否经过检查的事实,并且该值是1或0 ...从您的经验来看,这似乎是正确的。

请告诉我们您需要如何使用POST格式的数据,以便我们提供更好的答案。

关于物联网的一些通用建议:

  • 尝试查看客户端中生成的html(浏览器,查看源代码)
  • 使用浏览器的检查器(或开发工具)对网络调用进行内部检查,并查看POST将哪些数据存储到后端

编辑

将表单绑定到实体时,需要将该实体作为$this->Form->create($entity, ...)调用的第一个参数提供。在您的情况下,您提供的是字符串,而不是实体。

看看用于将相关数据保存为以下格式的文档:https://book.cakephp.org/3.0/en/views/helpers/form.html#creating-inputs-for-associated-data

<tbody>      
    <?php foreach ($taskElements as $id => $taskElement): ?>      
    <tr>
        <td><?= $this->Number->format($taskElement->id) ?></td>
        <?= $this->Form->hidden("task.$id.id",['value' => $taskElement->id]); ?>
        <?= $this->Form->hidden("task.$id.name",['value' => $taskElement->name]); ?>
        <td><?= $this->Form->control("task.$id.checked", ['type' => 'checkbox']);?></td>
        <td><?= $taskElement->element_category_id != 0 ? $this->Html->link($taskElement->element_category->name, ['controller' => 'ElementCategories', 'action' => 'view', $taskElement->element_category->id]) : '' ?></td>

    </tr>
    <?php endforeach; ?>            
</tbody>