Bonjour,

J'utilise le Framework Symfony depuis très peu de temps. J'ai commencé par suivre le tutoriel proposé : Jobeet. Puis j'ai repris ce tutoriel pour l'adapter à mes besoins.

Or, contrairement au tutoriel, l'architecture "visuelle" que je veux réaliser ne correspond pas du tout au tutoriel.
Je m'explique :
Jobeet propose une vue "index" pour la visualisation d'un module et une vue "show" pour avoir plus de détail sur un objet.
Ce que je souhaite faire, c'est d'avoir plusieurs "pages filtres" avant arriver à la page de détail.
Pour prendre un exemple, je dispose de deux tables :
- Client composé de "id", "client_id", "sfUser_id", etc.
- Machine composé de "id", "client_id" "mac_add", "etage", "chambre", etc.
sfUser_id permet de lier la table Client à la table sfUser du plugin sfDoctrineGuard .
client_id permet de lier la table Machine à la table Client.

Lorsqu'un utilisateur arrive sur le site, il doit se connecter puis il arrive sur la page index que j'ai défini comme "homepage". D'ici, il a accès a plusieurs services, dont le service de consultation de machine. Quand il accède à ce service, une liste s'affiche avec tous les étages disponibles (c'est a dire, ses étages dans lesquels ses machines sont installées). Quand il choisi un étage, une liste de toutes les chambres s'affiche. Quand il choisi une chambre, une liste de toutes les machines et enfin les détails de la machine elle-même.

Pour répondre à ce problème, j'ai donc créé plusieurs pages dans mon module (etageSucces, chambreSuccess) avec les fonctions adéquates dans le fichier "actions".

Bien entendu, seul le client connecté peut accéder à ses machines.
J'ai donc créer une requêtes permettant d'isoler les machines n'appartenant qu'au client connecté à l'aide de la colonne sfUser_id. Ensuite, j'ai ajouté une condition sur les étages avec un "select distinct": Meme si deux machines sont au même étage, je ne souhaite visualiser qu'une seule fois l'étage dans la liste.

C'est ici que commence mon premier soucis : en utilisant "createQuery()", je récupérais aussi les "id" dans le "select" et donc le "distinct" différenciait chaque machine et non chaque étage. Ce qui paraît logique. Après des recherches sur des forums, j'ai utilisé "Doctrine_RawSql()". Grâce a cette fonction, la requête lancée est correcte. Cependant, un seul résultat s'affiche dans la vue, le premier. Or, je n'ai mis aucune condition de "limit".

Voici le code de ma fonction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
$q = new Doctrine_RawSql();
$q->select('{b.etage}, {b.client_id}')
    ->distinct('{b.etage}')
    ->from('machine b')
    ->addComponent('b', 'Machine')
    ->leftJoin('client c ON b.client_id = c.client_id')
    ->addComponent('c', 'Client')
    ->where('c.sfUser_id = ?', $id)
    ->orderBy('b.etage');
 
return $q->execute();
Je n'arrive pas à comprendre pourquoi seulement le premier élément est renvoyé.

Le deuxième soucis concerne la route : Si un client rentre dans la barre d'adresse la route vers une machine qui ne lui appartient pas (en donnant le bon numéro de l'étage, le bon numéro de chambre et le bon numéro de la machine), il peut quand même la consulter. Après réflexion, c'est tout à fait logique, mais je ne vois pas comment protéger les données avec la connexion. Où et comment rajouter la fonction permettant de vérifier l'authentification pour s'assurer que la machine appartient bien au client connecté ?

Voilà globalement le difficulté que je rencontre. j'ai essayé d'être le plus claire possible. Il est cependant possible que des points ne soient pas assez claires. Si c'est le cas, n'hesitez pas à me demander plus d'informations.

Merci par avance pour votre participation et pour votre aide.