Активация модели плагина не работает в cakephp 2.3 с помощью ACL для торта

Я просто пытаюсь реализовать аутентификацию пользователя Cakephp ACL в плагине с именем «Cauth». То же самое, что я реализую раньше, прекрасно работает. На этот раз разница в том, что она находится под плагином. Здесь, в контроллере, $ this-> User-> Group-> find ('list'); не работает. Я получил следующую фатальную ошибку:

Fatal Error Error: Call to a member function find() on a non-object File: my_dir_path\app\Plugin\Cauth\Controller\UsersController.php Line: 60 Notice: If you want to customize this error message, create app\View\Errors\fatal_error.ctp 

Мой код:

Модель группы:

 var $useTable = 'groups'; public $hasMany = array ( 'User' => array ( 'className' => 'Cauth.User', 'foreignKey' => 'group_id', 'dependent' => false, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'exclusive' => '', 'finderQuery' => '', 'counterQuery' => '' ) ); 

Модель пользователя:

 var $useTable = 'users'; public $belongsTo = array ( 'Group' => array ( 'className' => 'Cauth.Group', 'foreignKey' => 'group_id', 'conditions' => '', 'fields' => '', 'order' => '' ) ); 

Контроллер пользователей добавляет действие, поле выбора группы не работает.

Контроллер пользователей добавляет действие:

 App::uses('CauthAppController', 'Cauth.Controller'); class UsersController extends CauthAppController { 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.')); } } $groups = $this->User->Group->find('list'); $this->set(compact('groups')); } 

Может ли кто-нибудь помочь мне перестрелять эту проблему.

Особое примечание: он работает над следующим случаем.

Дело 1:

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

 $this->User->bindModel( array ('belongsTo' => array ('Group')) ); 

т.е.

 public function add() { $this->User->bindModel( array ('belongsTo' => array ('Group')) ); 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.')); } } $groups = $this->User->Group->find('list'); $this->set(compact('groups')); } 

Случай 2:

Если я разрешаю имя действия для всех. Администратор имеет все разрешения, хотя мне также нужно написать beforeFilter для admin.

 public function beforeFilter() { parent::beforeFilter(); $this->Auth->allow('index', 'add'); } 

Я нашел еще один случай, чтобы сделать его работоспособным.

Случай 3:

Код моего AppController был –

 class AppController extends Controller { public $helpers = array ('Form', 'Time', 'Html', 'Session', 'Js', 'DebugKit.Toolbar'); public $counter = 0; public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authorize' => array ( 'Actions' => array ('actionPath' => 'controllers') ) ), 'Session' ); public function beforeFilter() { //Configure AuthComponent $this->Auth->loginAction = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->logoutRedirect = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array ('plugin' => '', 'controller' => 'pages', 'action' => 'display'); } } 

В этом случае он не работал. Но когда я это сделал –

 class AppController extends Controller { public $helpers = array ('Form', 'Time', 'Html', 'Session', 'Js', 'DebugKit.Toolbar'); public $counter = 0; public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authenticate' => array('Form') ), 'Session' ); public function beforeFilter() { //Configure AuthComponent $this->Auth->loginAction = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->logoutRedirect = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array ('plugin' => '', 'controller' => 'pages', 'action' => 'display'); } } 

Затем ассоциация снова начинает работать. Все еще не могу понять, в чем проблема с этим объявлением компонента.

 public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authorize' => array ( 'Actions' => array ('actionPath' => 'controllers') ) ), 'Session' ); 

И если я так не заявляю, мой ACL не работает. т.е. все группы получают одинаковое разрешение.

Пожалуйста, помогите мне. Я стою на этом очень долгое время.

Solutions Collecting From Web of "Активация модели плагина не работает в cakephp 2.3 с помощью ACL для торта"

Наконец, я нашел решение после долгой борьбы со следующей ссылки –

https://cakephp.lighthouseapp.com/projects/42648/tickets/2464-plugin-using-acl-not-loading-proper-model

Когда я использовал компонент Auth, пользовательский контроллер не использовал модель Cauth.user. Он был загружен с помощью AppModel. Но без компонента auth он работал правильно. Так что правильный способ использования компонента auth будет

  'Auth' => array ( 'authorize' => array ( 'Actions' => array ( 'actionPath' => 'controllers', 'userModel' => 'Cauth.User', ), ) ), 

Это общий AppController будет –

 class AppController extends Controller { public $helpers = array ('Form', 'Time', 'Html', 'Session', 'Js', 'DebugKit.Toolbar'); public $counter = 0; public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authorize' => array ( 'Actions' => array ( 'actionPath' => 'controllers', 'userModel' => 'Cauth.User', ), ) ), 'Session' ); public function beforeFilter() { //Configure AuthComponent $this->Auth->loginAction = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->logoutRedirect = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array ('plugin' => '', 'controller' => 'pages', 'action' => 'display'); } } 

И теперь все работает нормально. Спасибо всем.

Предполагая, что группа является именем модели (таблицы), измените эту строку:

  $groups = $this->User->Group->find('list'); 

в

  $groups = $this->Group->find('list'); 

надеюсь, это поможет!

Попробуйте две вещи, чтобы исправить это. Сначала добавьте следующие контроллеры плагинов пользователей и групп.

 public $uses = array('Users.User', 'Users.Group'); 

Во-вторых, определите компоненты в своих контроллерах плагинов. В учебном курсе ACL Auth они помещают это в основной AppController, вам нужно переместить его в плагин.

Вы можете либо сделать следующее в своем UserAppController или UserController

 public $components = array( 'Acl', 'Auth', 'Session' ); 

Надеюсь, что это сработает.