Cakephp 3.6.14: создание табличной формы с флажками и данными процесса - PullRequest
0 голосов
/ 22 января 2019

Я хочу создать форму, в которой есть массив с флажком для каждой строки.Таким образом, пользователь может выбрать, какие строки будут обрабатываться в контроллере.

Итак, я создал форму и массив.Каждая строка массива имеет имя 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'
]

Что не правильно, потому что id 'Library_Element' равен 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 голосов
/ 22 января 2019

Проблема, с которой вы столкнулись, потому что когда ваше веб-приложение POST s отправляется на сервер, оно будет отправлять только данные "формы".

Это означает, что любые данные, которые вам нужно отправить обратно, необходимо включить в теги html form, используя элементы формы (т. Е. Ввод, выбор, скрытие и т. Д.). В шаблоне Cakephp вы должны использовать помощник Form для распечатки этих элементов.

В данном конкретном случае вы создаете скрытый элемент id и элемент флажка. Элементы-флажки получают свое значение из-за того, что они отмечены или нет, и это значение равно 1 или 0 ... что кажется правильным из того, что вы испытываете.

Пожалуйста, сообщите нам, как вам нужны данные POST ed, чтобы мы могли дать лучший ответ.

Еще несколько общих советов о том, как добраться до корня вещей:

  • Попробуйте посмотреть сгенерированный html в вашем клиенте (браузер, просмотреть исходный код)
  • Используйте инспектор вашего браузера (или инструменты разработчика), чтобы проанализировать сетевые вызовы и посмотреть, какие данные POST переданы на сервер

EDIT :

Когда ваша форма связана с сущностью, эта сущность должна быть указана в качестве первого аргумента вызова $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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...