2013-02-10 4 views
0

Я новичок в CakePHP, и я пытаюсь реализовать Simple Acl Controlled Application tutorial, и я достиг той части, где вы пытаетесь добавить новых пользователей и группы.Простой Acl Controlled Application - Не позволяя мне добавлять нового пользователя

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

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.')); 
      } 
     } 
    } 

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

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

<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; 
    } 

} 

Debug сообщение:

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

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

+0

Пожалуйста, также разместите свою модель «Пользователь» и дамп '$ this-> request-> data'. Последнее может быть достигнуто путем размещения в вашем контроллере 'debug ($ this-> request-> data);' statement перед сообщением об ошибке (в предложении else). – Oldskool

+0

@ Oldskool Я добавил модель и отладочное сообщение, см. Выше .. спасибо! – iwj145

+0

Спасибо, я опубликовал ответ ниже с тем, что кажется проблемой. – Oldskool

ответ

0

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

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

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

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

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

+0

Спасибо oldskool за ваше решение! :) – iwj145

+0

Выпадающее поле по-прежнему не показывает группы, которые я установил на место, но я думаю, что это должен быть новый вопрос .. как его новая тема .. – iwj145

+1

@ iwj145 Что касается этого, вам все равно нужно добавить «найти логику» для вашего действия add в контроллере, чтобы получить группы, попробуйте: '$ this-> set ('groups', $ this-> User-> Group-> find ('list'));' – Oldskool