Cakephp 3

时间:2016-09-13 17:38:32

标签: forms cakephp

我已经看到了这一点: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表单提交中的调试显示以下内容:

$_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>

1 个答案:

答案 0 :(得分:0)

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>