2013-04-30 8 views
1

Я сделал простую функцию «change_email» с ее представлением и всем содержимым в контроллере. На самом деле все работает нормально, кроме сохранения данных. Когда я представить свою форму и моя модель на самом деле запускает свой бросок() - метод CakePHP выдает ошибку:CakePHP хочет получить доступ к узлу ACL

AclNode::node() - Couldn't find Aro node identified by "Array ( [Aro0.model] => User [Aro0.foreign_key] => 11) "

Конечно, он не находит узел, так как она не была создана (когда пользователь регистрируется его учетная запись, узел не будет создан автоматически). Мне интересно, почему моя модель хочет найти узел, поскольку он не нужен для реальной работы.

public function change_email() 
    { 
     if ($this->request->is("put")) { 
      if (!empty($this->request->data)) { 
       $this->User->validator() 
        ->add('password', array(
         'valid' => array(
          'rule' => 'validatePassword' 
         ) 
        )) 
        ->add('email_confirm', array(
         'valid' => array(
          'rule' => 'validateEmail' 
         ) 
        )); 
       if ($this->User->save($this->request->data)) { 
        $this->set("status", true); 
       } 
      } 
     } 
    } 

Это мой код в контроллере. Модель не имеет реального эффекта, кроме метода beforeFilter(), который только хеширует пароль.

У кого-нибудь есть идеи?

ответ

1

Использование Acl обычно требует методов parnetNode() и bindNode() в вашей модели User и Group, если это применимо.

Using AclBehavior

Most of the AclBehavior works transparently on your Model’s afterSave(). However, using it requires that your Model has a parentNode() method defined. This is used by the AclBehavior to determine parent->child relationships. A model’s parentNode() method must return null or return a parent Model reference.

В User модель, принадлежащая к Group модели

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

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

В Group модели, или если User модель не имеет родительских ассоциаций, он должен возвращать нуль

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

public function parentNode() { 
    return null; 
} 

Вы также захотите убедиться, что обновляете таблицу acos новыми методами и контроллерами. AclExtras - хороший плагин, который может автоматизировать это для вас.

+0

Я определил parentNode() в моей модели, возвращающей _null_. – Fortuna

Смежные вопросы