Bonjour à tous, j'ai suivi donc le tuto de Graf' (http://www.grafikart.fr/tutoriels/cakephp/cakephp-events-316) pour créer un système de badge.

Celui-ci fonctionne à merveille!

Seulement, j'aimerais afficher les badges que l'utilisateur (par ex: user_id > 1) à débloqué sur sa page de profil.

Voici mes codes(attention ce sont des codes que je test depuis plus de 1h et à force, j'en n'ai marre :P)

UsersController.php

$userID = $this->Auth->user('id');
$badges = $this->BadgesUser->find('all', array(
    'conditions' => array(
    'user_id' => $userID
    )
));
$badgesIMG = $this->Badges->find('all');
foreach ($badges as $k) {
    foreach ($badgesIMG as $v) {
    if($userID == $k"BadgesUser"]"user_id"]){
            if($k'BadgesUser']'badge_id'] == $v'Badges']"id"]){
        $v = $v;
        }
        }
    }
}

Voici, j'attend donc votre aide les amis!

Merci d'avance!

5 réponses


Bonjour, un petit up, car je suis dans le même cas.
Je n'arrive pas à afficher dans la page profil de mes utilisateurs leurs badges...
Merci

sei05
Auteur

Bienvenue au club alors @zenkiai ;)

Salut sei05,
Bon je suis arrivé à faire quelque chose, je me suis inspiré du tuto sur les tags. Je ne sais pas si c'est le plus simple ou le plus performant mais cela fonctionne :
j'ai créé deux models :

BadgeUser.php

<?php
App::uses('AppModel', 'Model');
class BadgeUser extends AppModel{
    public $recursive = -1;
    public $useTable = 'badges_users';
    public $actsAs = array('Containable');
    public $belongsTo = array(
        'User',
        'Badge'
    );
}

Badge.php

<?php
App::uses('AppModel', 'Model');
class Badge extends AppModel{       
}

J'ai ensuite modifié mon model User.php en ajoutant :

User.php

public $actsAs = array('Containable');
public $hasMany = array('BadgeUser');
public $hasAndBelongsToMany = array('Badge');

J'ai créé une fonction badge dans mon Userscontroller.php

UsersController.php

function badge(){
        $this->loadModel('BadgeUser');
        $this->BadgeUser->recursive = 0;
        $this->BadgeUser->contain('User','Badge');
        $user_id = $this->Auth->user('id');
        $d'badges'] = $this->Paginate('BadgeUser',array(
            'BadgeUser.user_id' => $user_id
        ));
        $this->set($d);
    }

et enfin j'ai créé une vue badge.ctp dans mon dossier User :

badge.ctp

<?php foreach ($badges as $k => $v): ?>
    <p class="textcenter"><?php echo $v'Badge']'name']; ?></p>
    <img src="<?php echo $v'Badge']'url_image']; ?>">
<?php endforeach; ?>

A oui dans ma BDD, dans ma table badges, j'ai ajouté un champ url_image pour assigné un icone au badge..
J'espère que cela va te servir, si tu as des idées pour optimiser le code, je suis preneur...

J'aurais besoin d'un aide pour finaliser ma page Badge..
j'ai réussi à afficher les badges gagner d'un utilisateur.
Cependant j'aimerais faire comme Grafikart, c'est à dire afficher tous les badges existant et mettre en clair les badges obtenus.
Je n'y arrive pas, je n'arrive pas à trouver la condition, j'ai voulu mettre comme condition que les l'id de l'utilisateur loggué doit être égal à l'user_id de BadgeUser, mais je n'arrive à récupérer la variable user_id..
Voici mon travail qui ne fonctionne pas :

function badge(){
        $this->loadModel('BadgeUser');
        $this->BadgeUser->recursive = 0;
        $this->BadgeUser->contain('User','Badge');
        $user_id = $this->Auth->user('id');
        $d'badges'] = $this->Paginate('BadgeUser',array(
            'BadgeUser.user_id' => $user_id,
        ));   
        $this->set($d);

et ma vue:

<?php foreach ($badges as $k => $v): ?>
            <div class="badges">
                <p class="textcenter"><?php echo $v'Badge']'name']; ?></p>
                <?php if(AuthComponent::user('id') == jenesaispasquoimettre ): ?>
                    <img src="<?php echo $v'Badge']'url_image']; ?>">
                <?php else: ?>
                    <img src="/img/badges/badge0.png">              
                <?php endif; ?>
                <p class="textcenter"><?php echo $v'Badge']'content']; ?></p>
            </div>
        <?php endforeach; ?>

Merci de votre aide

Je reviens à la charge car je n'y arrive toujours pas, voici mes nouveaux codes :

function badge(){
        $this->loadModel('BadgeUser');
        $this->BadgeUser->recursive = 0;
        $this->BadgeUser->contain('User','Badge');
        $user_id = $this->Auth->user('id');
        $badge_id = $this->BadgeUser->badge_id;
        $d'badges'] = $this->Paginate('Badge'); 
        $d'badgesusers'] = $this->BadgeUser->find('first',array(
            'fields' => array('BadgeUser.user_id','BadgeUser.badge_id')
        ));
        $this->set($d);
    }

et

<?php foreach ($badges as $k => $v): $bad = $badgesusers; ?>
    <p class="textcenter"><?php echo $v'Badge']'name']; ?></p>
    <?php if(AuthComponent::user('id') == $bad'BadgeUser']'user_id'] && $bad'BadgeUser']'badge_id'] == $v'Badge']'id']): ?>
    <img src="<?php echo $v'Badge']'url_image']; ?>">
    <?php else: ?>
    <img src="/img/badges/badge0.png">              
    <?php endif; ?>
    <p class="textcenter"><?php echo $v'Badge']'content']; ?></p>
<?php endforeach; ?>

je cherche toujours à faire apparaître les badges gagnés par l'user et ceux qui ne le sont pas encore.
D'ailleurs lorsque dans mon find je mets first, pas d'erreur mais lorsque je mets all, il me met

Undefined index: BadgeUser [APP/View/Users/badge.ctp, line 26]

Pourquoi ??
Merci de votre aide....