Вопрос

Я пытаюсь сохранить пользователя, но при сохранении получаю следующую ошибку

Aclnode :: node () - не удалось найти ARO Node, идентифицированный "Array ([aro0.model] => Роль [aro0.foreign_key] =>)"

у меня тоже такая ошибка вверху

Неопределенный индекс:role_id [CORE\Cake\Model\AclNode.php, строка 140]

Я не знаю, что делать, потому что когда я добавлял роли, они с легкостью добавляли их в aros, так почему теперь у меня возникают проблемы?

Я следовал руководству, предоставленному

http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-control-application/simple-acl-control-application.html

что должно быть просто, но кажется, что это не так просто.

в Роль Модель

public $primaryKey = 'role_id';
public $displayField = 'role';
public $actsAs = array('Acl' => array('type' => 'requester'));

public function parentNode() {
   return null;
}

в Пользователь Модель

public $primaryKey = 'user_id';
public $displayField = 'username';

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

    public $hasMany = array(
        'Role'   => array(
        'className' => 'Role',         
        'foreignKey' => 'role_id'
            )
        );

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

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

Мой код сохранения для Пользователь

public function add() {                  
//Populate roles dropdownlist        
        $data = $this->User->Role->find('list', array('fields' => array('role_id', 'role')));
        $this->set('roles', $data);

        if ($this->request->is('post')) {
            $this->User->ContactDetail->create(); 
            $this->User->ContactDetail->save($this->request->data);
            $this->request->data['User']['contact_detail_id'] = $this->User->ContactDetail->id;
            $this->User->Create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved.'));
                return $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
    }
Это было полезно?

Решение

Я согласен с Джимми, тебе следует изменить отношение к $belongsTo.Когда вы сохраняете пользователя, он также пытается сохранить таблицу aros, поэтому вам необходимо внести некоторые изменения, если вы не хотите, чтобы пользователь сохранялся в aros, для сохранения таблицы aros достаточно только роли (это также объясняется в руководстве). , поэтому посмотрите, какие изменения я внес в эти две модели.

Образец для подражания должен быть:

...
    public $hasMany = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'role_id',

        )
    );

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

    public function parentNode() {
        return null;
    }
    ...

Модель пользователя должна быть:

...

    public $belongsTo = array(
        'Role' => array(
            'className' => 'Role',
            'foreignKey' => 'role_id',
        )
    );


    public function bindNode($user) {
        return array('model' => 'Role', 'foreign_key' => $user['User']['role_id']);
    }
...

Как показано в приведенном выше коде, public $actsAs = array('Acl' => array('type' => 'requester')); должно быть только в ролевой модели, см. отношения, которые я добавил, а также изменения в функциях родительского узла и связывания.

Попробуйте это и свяжитесь со мной, если что-нибудь будет.

Надеюсь, поможет

Другие советы

На основе вашего parentNode() методы, я предполагаю, что вам следует изменить отношения в модели пользователя следующим образом:

public $belongsTo = array('Role');

Также убедитесь, что $this->request->data['User'] правильно содержит поле role_id при вызове $this->User->save($this->request->data) в действии добавления.

И небольшое изменение:Используйте строчную букву «c» в $this->User->Create(); :

$this->User->create();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top