Простое приложение, контролируемое Acl - не позволяет мне добавить нового пользователя

Я новичок в CakePHP и пытаюсь реализовать Руководство по простому приложению, управляемому Acl, и я добрался до той части, где вы пытаетесь добавить новых пользователей и группы..

Я успешно добавил группы, но когда я пытаюсь добавить новых пользователей, я получаю сообщение «Не удалось сохранить пользователя. Повторите попытку». Часть функции.

public function add() {
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
    }

Я заметил, что форма пытается создать раскрывающийся список всех различных групп, которые я создал, но раскрывающийся список пуст, и я создал три разные группы (Администратор, Ответчик и Добровольец).

Вот копия представления добавления пользователя.

<div class="users form">
<?php echo $this->Form->create('User'); ?>
    <fieldset>
        <legend><?php echo __('Add User'); ?></legend>
    <?php
        echo $this->Form->input('id');
        echo $this->Form->input('username');
        echo $this->Form->input('password');
        echo $this->Form->input('group_id');
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>
<div class="actions">
    <h3><?php echo __('Actions'); ?></h3>
    <ul>

        <li><?php echo $this->Html->link(__('List Users'), array('action' => 'index')); ?></li>
    </ul>
</div>

Модель по запросу:

<?php

App::uses('AppModel', 'Model');
App::uses('AuthComponent', 'Controller/Component');

class User extends AppModel {

    public $belongsTo = array('Group');
    public $actsAs = array('Acl' => array('type' => 'requester'));

    public function parentNode() {
        if (!$this->id && empty($this->data)) {
            return null;
        }
        if (isset($this->data['User']['group_id'])) {
            $groupId = $this->data['User']['group_id'];
        } else {
            $groupId = $this->field('group_id');
        }
        if (!$groupId) {
            return null;
        } else {
            return array('Group' => array('id' => $groupId));
        }
    }

    public $primaryKey = 'id';

    public $validate = array(
        'id' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),
        'username' => array(
            'notempty' => array(
                'rule' => array('notempty'),
            ),
        ),
        'password' => array(
            'notempty' => array(
                'rule' => array('notempty'),
            ),
        ),
        'group_id' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),
    );

    //The Associations below have been created with all possible keys, those that are not needed can be removed

    //old belongs to
//    public $belongsTo = array(
//        'Group' => array(
//            'className' => 'Group',
//            'foreignKey' => 'group_id',
//            'conditions' => '',
//            'fields' => '',
//            'order' => ''
//        )
//    );

    public $hasMany = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'user_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );

    public function beforeSave($options = array()) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
        return true;
    }

}

Отладочное сообщение:

array(
    'User' => array(
        'password' => '*****',
        'id' => '',
        'username' => 'iwanjones'
    )
)

Любая помощь будет оценена по достоинству. Спасибо


person iwj145    schedule 10.02.2013    source источник
comment
Пожалуйста, также опубликуйте свою модель User и дамп $this->request->data. Последнее может быть достигнуто путем размещения оператора debug($this->request->data); перед сообщением об ошибке в вашем контроллере (в предложении else).   -  person Oldskool    schedule 10.02.2013
comment
@Oldskool я добавил модель и отладочное сообщение, см. выше .. спасибо!   -  person iwj145    schedule 10.02.2013
comment
Спасибо, я разместил ответ ниже с тем, что кажется проблемой.   -  person Oldskool    schedule 11.02.2013


Ответы (1)


В форме в вашем представлении вы создаете поле id в качестве поля ввода (хотя с помощью автоматической магии Cake оно должно преобразовать его в скрытый ввод). При создании нового пользователя еще нет id. Он будет определен при сохранении (создании) записи. В большинстве приложений это будет сделано с помощью функции AUTO_INCREMENT бэкенда MySQL, которая выбирает первый доступный «бесплатный» идентификатор.

В случае добавления нового пользователя поле id не требуется. Вам это нужно только тогда, когда вы хотите отредактировать существующего пользователя и убедиться, что Cake редактирует правильного пользователя, установив его идентификатор.

В этот момент вы устанавливаете поле id в своем представлении, но оно не получает значения, так как это новый пользователь. В вашей модели вы добавили правило проверки, которое требует, чтобы поле id было числовым. Но на самом деле значение пустое. Вы должны сделать две вещи, чтобы заставить это работать:

  1. Удалите строку echo $this->Form->input('id'); из представления добавления.
  2. Удалите правило проверки для поля id из вашей модели (довольно необычно проверять поле первичного ключа, поскольку Cake уже обрабатывает это должным образом).

Это должно позволить успешно сохранить пользователя.

person Oldskool    schedule 10.02.2013
comment
Спасибо oldskool за решение! :) - person iwj145; 11.02.2013
comment
В раскрывающемся списке по-прежнему не отображаются группы, которые я создал, но я думаю, что это должен быть новый вопрос ... поскольку это новая тема ... - person iwj145; 11.02.2013
comment
@ iwj145 iwj145 Что касается этого, вам все еще нужно добавить логику поиска к вашему действию добавления в контроллере, чтобы получить группы, попробуйте: $this->set('groups', $this->User->Group->find('list')); - person Oldskool; 11.02.2013
comment
@Oldskool, у меня та же проблема, cakephp не показывает группы :/ - person Evolutio; 20.04.2014