Bonjour, je crée un nouveau sujet pour ne pas polluer le post de Sei05...
J'ai suivi le tuto Events sur cakephp, j'aimerais finaliser ce tuto en essayant de créer un système de badge comme sur Grafikart, c'est à dire un système listant tous les badges pouvant être obtenus (en opacité 0.5 par ex) et ceux obtenus (en opacité 1 par ex).
Le soucis c'est que je n'y arrive pas. Voici mes fichiers :
Model Badge.php

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

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

Model User.php

<?php
App::uses('AppModel', 'Model');
class User extends AppModel{
    public $actsAs = array(
        'Containable'
    );
    public $hasMany = array(
        'Comment',
        'Post',
        'BadgeUser'
    );
    public $hasAndBelongsToMany = array('Badge');
}

Ma fonction badge dans mon controller Users

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 view

<?php foreach ($badges as $k => $v): ?>
    <div class="badges">
        <p class="textcenter"><?php echo $v'Badge']'name']; ?></p>
        <?php if(AuthComponent::user('id') == $v'BadgeUser']'user_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>
    </div>
<?php endforeach; ?>

en faisant ainsi j'ai les badges obtenus mais pas ceux qui pourraient être obtenu
Autre essai :

$this->loadModel('BadgeUser');
$this->BadgeUser->recursive = 0;
$this->BadgeUser->contain('User','Badge');
$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="badgeTitle bebas 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="badgeText textcenter"><?php echo $v'Badge']'content']; ?></p>
<?php endforeach; ?>

en faisant ainsi j'ai bien tous les badges listés même ceux non-obtenus mais j'ai qu'un badge obtenu alors qu'il devrait en avoir deux(du au first dans le controller certainement)

En gros vous l'avez compris, je suis perdu, j'ai essayé plein de combinaison différente et je n'y arrive pas. J'ai besoin de votre aide
merci d'avance

13 réponses


zenkiai
Auteur
Réponse acceptée

Je clos ce message j'ai réussi.
Merci

zenkiai
Auteur
Réponse acceptée

Pas de soucis !!

zenkiai
Auteur

Je fais un petit up, car je tourne en rond depuis trois jours sur ce problème ...
merci de votre aide

zenkiai
Auteur

Bonjour, est ce que quelqu'un pourrait me dire si je suis sur la bonne voie, et si quelqu'un a un indice à me donner.
Merci à tous

As-tu essayé en fesant un find all

zenkiai
Auteur

Oui bien sûr, en faisant ainsi

function badge(){
        $this->loadModel('BadgeUser');
        $this->BadgeUser->contain('User','Badge');
        $user_id = $this->Auth->user('id');
        $d'badgesusers'] = $this->BadgeUser->find('all');
        $d'badges'] = $this->BadgeUser->Badge->find('all');
        $this->set($d);
    }
et
<?php foreach ($badges as $v): ?>
    <?php foreach ($badgesusers as $k): ?>
        <?php if(AuthComponent::user('id') == $k"BadgeUser"]"user_id"] && $k'BadgeUser']'badge_id'] == $v'Badge']"id"]): ?>
            <div class="badges">
                <p class="badgeTitle bebas textcenter"><?php echo $v'Badge']'name']; ?></p>
                <img src="<?php echo $v'Badge']'url_image']; ?>">
                <p class="badgeText textcenter"><?php echo $v'Badge']'content']; ?></p>
            </div>
                <?php else: ?>
            <div class="badges">
                <p class="badgeTitle bebas textcenter"><?php echo $v'Badge']'name']; ?></p>
                <img src="/img/badges/badge0.png">
                <p class="badgeText textcenter"><?php echo $v'Badge']'content']; ?></p>
            </div>
        <?php endif; ?>
    <?php endforeach; ?>
<?php endforeach; ?>

J'ai deux fois les badges, une fois les bons badges et une deuxieme fois tous les badges qui existent, donc 6 au lieu de 3(2 obtenus et 1 non-obtenu). Si je ne mets pas le else, j'ai seulement les deux badges obtenus et pas celui non-obtenu.
Je m'arrache les cheveux depuis 5 jours sur ça..
Merci de votre aide...

Moi perso je mettrais une condition user_id dans la requête cela évite de charger toute la table dans la vue hors que tu veux seulement les badges d'un seul utilisateur.

Essaye ceci:

function badge(){
    $this->loadModel('BadgeUser');

    $this->BadgeUser->contain('User','Badge');
    $user_id = $this->Auth->user('id');
    $d'badgesusers'] = $this->BadgeUser->find('all', array(
        'conditions' => array('user_id' => AuthComponent::user('id'))
    ));
    $d'badges'] = $this->BadgeUser->Badge->find('all');

    $this->set($d);
}
<?php foreach ($badges as $v): ?>
    <?php foreach ($badgesusers as $k): ?>
        <?php if($k'BadgeUser']'badge_id'] == $v'Badge']"id"]): ?>
            <div class="badges">
                <p class="badgeTitle bebas textcenter"><?php echo $v'Badge']'name']; ?></p>
                <img src="<?php echo $v'Badge']'url_image']; ?>">
                <p class="badgeText textcenter"><?php echo $v'Badge']'content']; ?></p>
            </div>
        <?php else: ?>
            <div class="badges">
                <p class="badgeTitle bebas textcenter"><?php echo $v'Badge']'name']; ?></p>
                <img src="/img/badges/badge0.png">
                <p class="badgeText textcenter"><?php echo $v'Badge']'content']; ?></p>
            </div>
        <?php endif; ?>
    <?php endforeach; ?>
<?php endforeach; ?>
zenkiai
Auteur

Merci de ta réponse, je me sentais un peu seul...
En faisant ainsi, j'ai deux fois les badges, une fois avec les badges obtenus(2) et non obtenu(1) et une autre fois la liste de tous les badges existants ce qui me fait au total 6 badges au lieu de 3;
merci de ton aide

La je vois pas désolé j'ai essayé de mon coté et je trouve pas Jonathan c'est comment faut faire vu qu'il la fait donc j'espère qu'il verais ton message et qu'il t'aidera

zenkiai
Auteur

J'espère aussi merci de ton aide, je ne sais pas si ma méthode est la bonne, si je suis dans la bonne direction.

zenkiai
Auteur

Bonjour, est-il possible dans un double foreach, de donner une condition, qui dit que si un un id est déjà chargé(utilisé) de ne pas le mettre une seconde fois. Et si Oui, comment faites vous ?
merci

zenkiai
Auteur

Je relance mon post, car je n'ai toujours trouvé de solution...
Merci de votre aide

Faudrait qu'on prenne contact via email nous deux dis donc car j'ai l'impression de foiré aux mêmes endroits que toi ahah :D