Salut,

Je suis entrain de suivre le tuto sur les ACL du cookbook 2.x (je suis bien CakePhp 2) et je rencontre un plantage à cause des aros (Acts as a Requester dans le cookbook). Je suis sous db postgresql et j'ai déjà créé d'autres MVC pour mon site (mais j'ai un problème sur les ACL là ^^).

Lien du cookbook

Lorsque j'arrive à l'étape de créer/initialiser mes "Db Acl tables" : ./Console/cake schema create DbAcl -> aucuns soucis, tables crées correctement.

Dans le point suivant, à "Acts as a Requester" :

  • je copie dans mon modèle User

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

  • je copie dans mon modèle Group

    public $actsAs = array('Acl' => array('type' => 'requester'));
    public function parentNode() {
    return null;
    }

Dans le cookbook, ils disent de se rendre à /users/add et /groups/add et d'ajouter des groups et users. Quand je me rend maintenant à ces adresses là j'obtiens ce type d'erreurs :

Notice (8): Undefined property: CakeErrorController::$uses [CORE\Cake\Controller\Controller.php, line 362]
Notice (8): Undefined property: CakeErrorController::$uses [CORE\Cake\Controller\Controller.php, line 362]
Notice (8): Undefined property: CakeErrorController::$modelClass [CORE\Cake\Controller\Controller.php, line 371]
Notice (8): Undefined property: CakeErrorController::$uses [CORE\Cake\Controller\Controller.php, line 362]
Notice (8): Undefined property: CakeErrorController::$modelClass [CORE\Cake\Controller\Controller.php, line 371]
Notice (8): Undefined property: CakeErrorController::$modelClass [CORE\Cake\Controller\Controller.php, line 371]
Notice (8): Undefined property: CakeErrorController::$uses [CORE\Cake\Controller\Controller.php, line 362]
Notice (8): Undefined property: CakeErrorController::$uses [CORE\Cake\Controller\Controller.php, line 362]
Notice (8): Undefined property: CakeErrorController::$modelClass [CORE\Cake\Controller\Controller.php, line 371]
Notice (8): Undefined property: CakeErrorController::$uses [CORE\Cake\Controller\Controller.php, line 362]
Notice (8): Undefined property: CakeErrorController::$modelClass [CORE\Cake\Controller\Controller.php, line 371]
Notice (8): Undefined property: CakeErrorController::$modelClass [CORE\Cake\Controller\Controller.php, line 371]
Catchable fatal error: Argument 1 passed to View::__construct() must be an instance of Controller, instance of View given, called in C:\Program Files (x86)\PostgreSQL\EnterpriseDB-ApachePHP\apache\www\stock_01\lib\Cake\Controller\Controller.php on line 941 and defined in C:\Program Files (x86)\PostgreSQL\EnterpriseDB-ApachePHP\apache\www\stock_01\lib\Cake\View\View.php on line 308

/groups/add fonctionne par contre, ajoute bien des groupes en db et dans la table aros. j'obtiens le même type d'eerreur quand je veux l'editer...

Si je retire le ode ci-dessus du modèle User, j'accède bien à mes pages (/users/add, users/view, etc.). C'est pour celà que j'ai l'impression que le problème vient du modèle user avec l'association au modèle Group.

Je vous remercie d'avance en espérant résoudre ce problème, MERCI.

Je vous copie les sources au cas où^^

Models :

User.php

App::uses('AppModel', 'Model', '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 function beforeSave($options = array()) {
        $this->data'User']'password'] = AuthComponent::password($this->data'User']'password']);
        return true;
    }

    // public $validate{...} généré par console

    public $belongsTo = array(
        'Group' => array(
            'className' => 'Group',
            'foreignKey' => 'group_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
]

Group.php

App::uses('AppModel', 'Model');
class Group extends AppModel {

    public $actsAs = array('Acl' => array('type' => 'requester'));
    public function parentNode() {
        return null;
    }
    // public $validate{...} généré par console
    public $hasMany = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'group_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
}

Controllers :

AppController.php

App::uses('Controller', 'Controller');
class AppController extends Controller {
     public $components = array(
        'Acl',
        'Auth' => array(
            'authorize' => array(
                'Actions' => array('actionPath' => 'controllers')
            )
        ),
        'Session'
    );
    public $helpers = array('Html', 'Form', 'Session');
    public function beforeFilter() {
        //Configuration AuthComponent
        $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
        $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
    }
}

UsersController.php

App::uses('AppController', 'Controller');
class UsersController extends AppController {

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

    public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                $this->redirect($this->Auth->redirect());
            } else {
                $this->Session->setFlash('Your username or password was incorrect.');
            }
        }
    }

    public function logout() {
        //encore rien dedans
    }
    //add,edit,etc. généré par via la console
}

GroupsController.php

App::uses('AppController', 'Controller');
class GroupsController extends AppController {
    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('*');
    }
        //view,edit,etc. généré par la console
}

Je copie/colle pas les vues vu que je ne pense pas que ça vienne de là.

2 réponses


BenFarhat
Réponse acceptée

1 -> Dans ton model User.php enleve la ligne 5 elle est deja defini en bas

2 -> dans ton UsersController et GroupsController ou sont les fonction add, index, view et delete???

Donc au niveau tutoriel (ici la version française / tu peux changer la langue en allant en bas au menu langue de cakephp.org) tu as pa fait cette partie

Ce sont les tables que nous utiliserons pour construire le reste de notre application. Une fois que nous avons la structure des tables dans notre base de données, nous pouvons commencer à cuisiner. Utilisez Génération de code avec Bake pour créer rapidement vos models, controllers et vues.

Si tu as des soucis avec la console cake regarde cette vidéo:
http://www.grafikart.fr/tutoriels/cakephp/console-cakephp-116

Bonne continuation :)

djedje
Auteur

Merci BenFarhat en enlevant la première définition de $belongsTo dans le modèle User.php ça fonctionne :)

Je n'ai pas collé les fonctions add,index,view,delete pour pas encombrer en vous montrant le code.

J'ai généré le mvc des tables users et groups avec cake bake, il a détecté magiquement l'association et je lui ai dit de la faire. Et plus bas dans les codes à copier/coller il y avait cette définition de $belongTo à nouveau^^ -> le bug.

Encore merci :)