代码之家  ›  专栏  ›  技术社区  ›  aggtr

cakephp 3.6.14:创建带有复选框和流程数据的表表单

  •  1
  • aggtr  · 技术社区  · 6 年前

    我想创建一个窗体,其中有一个数组,每行有一个复选框。因此,用户可以选择将在控制器中处理哪些行。

    所以我创建了表单和数组。数组的每一行都有 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 回复  |  直到 6 年前
        1
  •  1
  •   Oerd    6 年前

    你面临的问题是,当你的webapp POST S到后端,它只发送“表单”数据。

    这意味着无论您需要发送回什么数据,您都需要在HTML中包含 form 使用表单元素的标记(即:输入、选择、隐藏等)。在cakephp模板中,您将使用 Form 帮助打印出这些元素。

    在这个具体的例子中,您正在创建一个隐藏的 id 元素和复选框元素。复选框元素的值来源于它们是否被选中,并且这个值是1或0…从你的经历来看,这似乎是正确的。

    请告诉我们您需要什么 ED数据看起来像,所以我们可以提供更好的答案。

    一些更一般的建议是从根本上解决问题:

    • 尝试查看客户端中生成的HTML(浏览器、查看源代码)
    • 使用浏览器的检查器(或开发工具)来反省网络调用,并查看什么是数据 ED到后端

    编辑 :

    当表单绑定到实体时,需要将此实体作为 $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>
    
    推荐文章