Erro Acl (ARO) ao criar usuário
-
24-12-2019 - |
Pergunta
Estou tentando salvar o usuário, mas quando salvo recebo o seguinte erro
AclNode :: Node () - Não conseguiu encontrar o nó ARO identificado por "Array ([aro0.model] => função [aro0.foreign_key] =>)"
Eu também recebo esse erro no topo
Índice indefinido:role_id [CORE\Cake\Model\AclNode.php, linha 140]
Eu não sei o que fazer quando adicionei as funções, elas foram adicionadas ao aros com facilidade, então por que agora isso está me causando problemas?
Eu segui o guia fornecido por
o que deveria ser simples, mas parece que não é tão simples.
No Papel Modelo
public $primaryKey = 'role_id';
public $displayField = 'role';
public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode() {
return null;
}
No Do utilizador Modelo
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));
}
}
Meu código salvo para Do utilizador
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.'));
}
}
}
Solução
Eu concordo com Jimmy, você deveria mudar o relacionamento para $belongsTo
.Quando você salva o usuário, ele tenta salvar a tabela aros também, então você precisa modificar algumas alterações se não quiser que o usuário seja salvo no aros, apenas a função é suficiente para salvar a tabela aros (isso também é explicado no tutorial) , então veja as alterações que fiz nesses dois modelos.
O modelo de papel deve ser:
...
public $hasMany = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'role_id',
)
);
public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode() {
return null;
}
...
O modelo do usuário deve ser:
...
public $belongsTo = array(
'Role' => array(
'className' => 'Role',
'foreignKey' => 'role_id',
)
);
public function bindNode($user) {
return array('model' => 'Role', 'foreign_key' => $user['User']['role_id']);
}
...
Conforme mostrado no código acima, public $actsAs = array('Acl' => array('type' => 'requester'));
deve estar apenas no modelo de função, veja o relacionamento que adicionei e também veja as alterações nas funções parentNode e bindNode.
Tente isso e entre em contato comigo se houver alguma coisa.
Espero que ajude
Outras dicas
Com base no seu parentNode()
métodos, presumo que você deva alterar o relacionamento no modelo User como:
public $belongsTo = array('Role');
Certifique-se também de que $this->request->data['User'] contém o campo role_id corretamente ao chamar $this->User->save($this->request->data) na ação add.
E uma pequena alteração:Use 'c' minúsculo em $this->User->Create();
:
$this->User->create();