Bonjour encore moi oui ;)
Voilà j'ai un mini module d'administration qui suit le schéma suivant :
Plusieurs admin peuvent ajouter/éditer/supprimer des utilisateurs, des posts, des catégories...
Chacun des utilisateurs est sous la directive d' un seul admin.
Et les admins sont indépendants autrement dit l'un n'a aucune relation avec l'autre.
j'ai donc deux tables une user et une admin avec dans la table user un champ admin_id.
Comment faire pour que lorsqu'un admin veut éditer un user il ne puisse pas voir les users des autres admins en utilisant les mêmes bases ?
En gros lorsque j'ai un tableau avec un foreach qui affiche les différents users, il parcourt la table entière et affiche tous les users. J'aimerai qu'il n'affiche que les users dont l'admin_id correspond à l'id de l'admin.
Et lorsqu'un admin ajoute un user de la même manière j'aimerai dans mon form un champ hidden qui prend automatiquement la valeur de l'id de l'admin et qui l'enregistre dans admin_id de la table user.
Je ne sais pas si j'ai réussi à très bien expliquer si vous voulez plus de précisions demandez moi.
D'avance merci de votre lecture.
Salut,
Tu dois mettre une condition dans ton find all
$this->User->find('all', array(
'conditions' => array (
admin_id => $id)
)
);
Avec $id égal à l'id de l'admin.
D'après ce que j'ai compris, seul un admin peut ajouter un user donc il te suffit de récupérer l'id de l'admin connecté et de l'ajouter dans ton input hidden.
Merci pour ton aide une fois de plus ^^
Cependant, je récupère bien mon admin_id et l'affichage des posts etc est bien fait en fonction de l'admin connecté.
Mais j'ai du mal à récupérer cet admin_id dans mon input hidden.
<?php echo $this->Form->input('admin_id',array('value'=>$id)); ?>
Alors j'ai une erreur qui me dit que $id n'est pas défini.
Salut après ton find all, tu peux remplir ton champ admin_id de cette manière
//id correspondant à ton admin_id comme précisé par prbaron
$this->User->find('all', array(
'conditions' => array (
admin_id => $id)
)
);
//tu pré rempli ton champ admin_id
$this->request->data'User']'admin_id'] = $id;
//Puis dans ta vue
echo $this->Form->input('User.admin_id',array('type'=>hidden));
Sauf que tout ça c'est pas dans mon admin_edit ^^ c'est dans l'index donc forcement ça va pas.
Mon PostsController :
function admin_index(){
$id = $this->Auth->user('id'); // Je stock l'id de l'admin connecté dans $id (oui mes admins sont dans une table user donc au lieu de admin_id j'ai user_id
$d'posts'] = $this->Paginate('Post',array(
'type'=>'post',
'online >= 0',
'user_id' => $id // j'ajoute la condition
));
$this->set($d);
}
function admin_edit($id = null){
$this->request->data'User']'user_id'] = $id; // je pré rempli selon l'aide de elscorto
if($this->request->is('put') || $this->request->is('post')){
if($this->Post->save($this->request->data)){
$this->Session->setFlash("Le contenu a bien été modifié","notif");
$this->redirect(array('action'=>'index'));
}
}elseif($id){
$this->Post->id = $id;
$this->request->data = $this->Post->read();
}else{
$this->request->data = $this->Post->getDraft('post');
}
$d'categories'] = $this->Post->Category->find('list');
$this->Post->PostTag->contain('Tag');
$d'tags'] = $this->Post->PostTag->find('all',array(
'conditions' => array('PostTag.post_id' => $id)
));
$this->set($d);
}
function admin_delete($id){
$this->Session->setFlash('L\'article a bien été supprimée','notif');
$this->Post->delete($id);
$this->redirect($this->referer());
}
Ma vue :
<?php echo $this->Form->create('Post'); ?>
<?php echo $this->Form->input('name',array('label'=>"Nom de l'animation")); ?>
<?php echo $this->Form->input('slug',array('label'=>"URL", 'type'=>'hidden')); ?>
<?php echo $this->Form->input('Client.user_id',array('label'=>"id de l'hotel")); ?> // je ne l'ai pas mis hidden pour voir ce qu'il y avait dedans
<?php echo $this->Form->input('category_id',array('label'=>"Type d'animation")); ?>
<?php echo $this->Form->input('tags',array('label'=>"Animateurs (séparé par une virgule)",'type'=>'text')); ?>
<?php foreach($tags as $k=>$v): ?>
<p><?php echo $v'Tag']'name']; ?> <?php echo $this->Html->link("x",array('action'=>'delTag',$v'PostTag']'id'])); ?>]</p>
<?php endforeach; ?>
<?php echo $this->Form->input('id'); ?>
<?php echo $this->Form->input('content',array('label'=>"Description de l'animation")); ?>
<?php echo $this->Form->input('created',array('label'=>"Date de l'animation",'dateFormat' => 'DMY','timeFormat' => 24)); ?>
<?php echo $this->Form->input('online',array('label'=>"En ligne ?",'type'=>'checkbox')); ?>
<?php echo $this->Form->end('Sauvegarder'); ?>
Forcement ça ne fonctionne pas parce que je suis pas doué ^^
Tu fais déjà ça dans admin_index()
$id = $this->Auth->user('id'); // Je stock l'id de l'admin connecté dans $id (oui mes admins sont dans une table user donc au lieu de admin_id j'ai user_id
C'est tout simplement ce qu'il te faut. Cet élément permet de récupérer l'id de l'utilisateur connecté.
Le mieux est de le mettre dans un beforeSave() par exemple, c'est plus sécurisé que l'id dans le formulaire, car on peut le changer, même si c'est stupide.
Bon ça semble tout bon mais j'ai un big problem ...
J'ai donc deux tables séparées une pour les admin (qui est la table users) et une pour des clients (table clients).
Le problème est la connexion des clients parce que j'ai tout fait en suivant le tuto de cakePhp et dans l'AppController il y a tout ça :
<?php
class AppController extends Controller{
public $helpers = array('Text','Form','Html','Session','Cache');
public $components = array('Session','Cookie',
'Auth' => array(
'authenticate' => array(
'Form' => array(
'scope' => array('User.active' => 1)
)
)
)
);
function beforeFilter(){
$this->Auth->loginAction = array('controller'=>'users','action'=>'login','admin'=>false);
$this->Auth->authorize = array('Controller');
if(!empty($d'User']'password'])){
$d'User']'password'] = Security::hash($d'User']'password'],'sha256',true); // evidement c'est pas ça en vrai ;)
}
if(!isset($this->request->params'prefix'])){
$this->Auth->allow();
}
if (isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'admin')
$this->layout = 'admin';
if (isset($this->request->params'action']) && $this->request->params'action'] == 'signup')
$this->layout = 'signup';
if (isset($this->request->params'action']) && $this->request->params'action'] == 'login')
$this->layout = 'login';
}
function isAuthorized($user){
if(!isset($this->request->params'prefix'])){
return true;
}
$roles = array(
'admin' => 10,
'user' => 5,
'client'=> 5
);
if(isset($roles$this->request->params'prefix']])){
$lvlAction = $roles$this->request->params'prefix']];
$lvlUser = $roles$user'role']];
if($lvlUser >= $lvlAction){
return true;
}else{
return false;
}
}
return false;
}
}
Et du coup ça ne permet qu'à la table users de se connecter ça. Comment je fais pour autoriser la table client également ? D'autant plus que les clients n'ont pas de champs active puisqu'ils sont ajoutés par un admin directement donc pas besoins d'activation à ce niveau là.
Je pense que les actions CakePHP de base pour le login et les tests d'autorisation sont relatives à la tables users (mais je n'ai pas poussé les tests). Ca serait plutôt logique vu que CakePHP est basée sur les conventions de nommage.
Est il réellement nécessaire d'avoir deux tables distinctes ? Ce sont tous des users avec des rôles différents. D'après ta description, je ne vois pas le besoin d'avoir deux tables.