【问题标题】:Dynamic form input fields in Cakephp 3Cakephp 3 中的动态表单输入字段
【发布时间】:2016-09-13 17:38:32
【问题描述】:

我已经看到了这个:https://waltherlalk.com/blog/dynamic-form-input-fields,并且一直活跃在这个:Dynamically add form field rows - cakePHP。我已经达到了按照原始教程进行设置的阶段,并根据 monsur.hoq 的 Stackoverflow 帖子进行了更改。

该表单运行良好,但在保存时,它只保存了“学生”部分的数据:没有任何内容发送到年级。我的控制器的添加部分目前如下所示:

public function add()
{
    $student = $this->Students->newEntity();
    if ($this->request->is('post')) {
        $student = $this->Students->patchEntity($student, $this->request->data);
        if ($this->Students->save($student)) {
            $this->Flash->success(__('The student has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The student could not be saved. Please, try again.'));
        }
    }
    $this->set(compact('student'));
    $this->set('_serialize', ['student']);
}

所有代码均根据烘焙或 monsur.hoq 帖子塑造的教程。

如果有人能帮助我找到 Walther Lalk 教程的可用 Cakephp3 示例,我将不胜感激。

调试工具栏显示提交表单时生成的以下 SQL:

INSERT INTO students (name, created, modified) 
VALUES 
  (
    'Test Two', '2016-09-13 16:04:07', 
    '2016-09-13 16:04:07'
  )    

所有要做的就是确认问题。在提交表单时在 PHP Storm 中进行调试显示以下内容:

$_POST = {array} [3]
 _method = "POST"
 name = "Test Four"
 Grade = {array} [1]
  0 = {array} [3]
   id = ""
   subject = "Maths"
   grade = "3"    

add.ctp如下:

    <nav class="large-3 medium-4 columns" id="actions-sidebar">
    <ul class="side-nav">
        <li class="heading"><?= __('Actions') ?></li>
        <li><?= $this->Html->link(__('List Students'), ['action' => 'index']) ?></li>
        <li><?= $this->Html->link(__('List Grades'), ['controller' => 'Grades', 'action' => 'index']) ?></li>
        <li><?= $this->Html->link(__('New Grade'), ['controller' => 'Grades', 'action' => 'add']) ?></li>
    </ul>
</nav>
<div class="students form large-9 medium-8 columns content">
    <?= $this->Form->create($student) ?>
    <fieldset>
        <legend><?= __('Add Student') ?></legend>
        <?php
            echo $this->Form->input('name');
        ?>
    </fieldset>
    <fieldset>
        <legend><?php echo __('Grades');?></legend>
        <table id="grade-table">
            <thead>
            <tr>
                <th>Subject</th>
                <th>Grade achieved</th>
                <th>&nbsp;</th>
            </tr>
            </thead>
            <tbody></tbody>
            <tfoot>
            <tr>
                <td colspan="2"></td>
                <td class="actions">
                    <a href="#" class="add">Add grade</a>
                </td>
            </tr>
            </tfoot>
        </table>
    </fieldset>
    <script id="grade-template" type="text/x-underscore-template">
        <?php echo $this->element('grades');?>
    </script>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>
</div>
<script>
    $(document).ready(function() {
        //I changed undescore default template settings
        _.templateSettings = {
            interpolate: /\{\{(.+?)\}\}/g
        }

        var
            gradeTable = $('#grade-table'),
            gradeBody = gradeTable.find('tbody'),
            gradeTemplate = _.template($('#grade-template').remove().text()),
            numberRows = gradeTable.find('tbody > tr').length;

        gradeTable
            .on('click', 'a.add', function(e) {
                e.preventDefault();

                $(gradeTemplate({key: numberRows++}))
                    .hide()
                    .appendTo(gradeBody)
                    .fadeIn('fast');
            })
            .on('click', 'a.remove', function(e) {
                e.preventDefault();

                $(this)
                    .closest('tr')
                    .fadeOut('fast', function() {
                        $(this).remove();
                    });
            });

        if (numberRows === 0) {
            gradeTable.find('a.add').click();
        }
    });
</script>

【问题讨论】:

  • 在patchEntity之前添加debug($student);debug($this-&gt;request-&gt;data);和在patchEntity之后添加debug($student);,在您的问题中发布结果;从保存选项中删除“关联”
  • 我明天会尽快完成这件事——我今天必须放弃它。感谢您的帮助!

标签: forms cakephp


【解决方案1】:

CakePHP 2 更改为 CakePHP 3 字段名称约定,

Grade.{$key}.gradegrades.{$key}.grade

使用以下内容创建 View/Elements/grades.ctp 文件。 https://waltherlalk.com/blog/dynamic-form-input-fields

<?php
$key = isset($key) ? $key : '<%= key %>';
?>
<tr>
    <td>
        <?= $this->Form->hidden('grades.{$key}.id') ?>
        <?= $this->Form->text('grades.{$key}.subject'); ?>
    </td>   
    <td>
        <?= $this->Form->select("grades.{$key}.grade",
          [
            'A+',
            'A',
            'B+',
            'B',
            'C+',
            'C',
            'D',
            'E',
            'F'
          ],
          [
            'empty' => '-- Select grade --'
          ]); ?>
    </td>
    <td class="actions">
        <a href="#" class="remove">Remove grade</a>
    </td>
</tr>

【讨论】:

  • 谢谢你 - 它没有帮助,很抱歉。我仍然相信它一定与控制器相关,但找不到需要工作的地方。
猜你喜欢
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多