Bonjour,

voici ma fonction:
function badge(){
    $this->loadModel('Badge');
    $this->Badge->contain('BadgeUser');
    $d'badges'] = $this->Badge->find('all');
    $this->set($d);
}
voici ma vue:
<?php foreach ($badges as $k => $v): $v = current($v); ?>
    <div class="badges">
        <p class="textcenter"><?php echo $v'name']; ?></p>
        <?php if($v'BadgeUser']'badge_id'] == $v'id']): ?>
           <img src="<?php echo $v'url_image']; ?>">        
        <?php else: ?>
           <img src="/img/badges/badge0.png">
            <?php endif; ?>       
        <p class="textcenter"><?php echo $v'content']; ?></p>
    </div>
<?php endforeach; ?>
et le debug de la fonction:
app/Controller/UsersController.php (line 156)
array(
    'badges' => array(
        (int) 0 => array(
            'Badge' => array(
                'id' => '1',
                'name' => 'badge1',
                'content' => 'texte badge1',
                'url_image' => '/img/badges/badge1.png'
            ),
            'BadgeUser' => array(
                (int) 0 => array(
                    'id' => '1',
                    'badge_id' => '1',
                    'user_id' => '1'
                )
            )
        ),
        (int) 1 => array(
            'Badge' => array(
                'id' => '2',
                'name' => 'badge2',
                'content' => 'texte badge2',
                'url_image' => '/img/badges/badge2.png'
            ),
            'BadgeUser' => array(
                (int) 0 => array(
                    'id' => '2',
                    'badge_id' => '2',
                    'user_id' => '1'
                )
            )
        ),
        (int) 2 => array(
            'Badge' => array(
                'id' => '3',
                'name' => 'badge3',
                'content' => 'texte badge3',
                'url_image' => '/img/badges/badge3.png'
            ),
            'BadgeUser' => array()
        )
    )
)

Dans ma vue, j'ai une erreur comme quoi BadgeUser est inconnue.

Comment faites vous pour récupérer le champ badge_id de mon tableau et l'envoyer vers la vue?
Merci de votre aide...

8 réponses


Remplace $v'BadgeUser']'badge_id'] par $v[0]'BadgeUser']'badge_id'] si ca fonctionne c'est que tu a oublié un foreach ;)
Et il me semble que c'est la solution ;)

zenkiai
Auteur

Merci duffJohn, en effet cela fonctionne ainsi, mais ma condition ne doit pas fonctionner car lorsque la condition n'est pas valide et qu'il s'oriente vers le else, il me met:

Undefined offset: 0 [APP/View/Users/badge.ctp, line 26]

Aurais tu une idée ?

zenkiai
Auteur

J'ai réussi à enlever le undefined offset, cependant lorsque un autre utilisateur obtient le badge1, int(0) de BadgeUser devient int(1), ce qui fait que

$v'BadgeUser'][0]'badge_id']

ne fonctionne plus. Tu me parles d'un foreach oublié, peux tu approfondir.
Comment faire disparaitre ce int() pour que cela devienne comme ceci

'BadgeUser' => array(
                (
                    'id' => '2',
                    'badge_id' => '1',
                    'user_id' => '2'
                )

Merci de votre aide

En regardant ton code soit tu peux faire:

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

Dis moi si cela convient.
Je n'ai tenu compte que de ton code plus haut, donc résous en même temps ton soucis de else.

zenkiai
Auteur

Merci de l'aide que tu m'apportes car je désespère un peu sur ce problème.
J'ai essayé ton code mais en faisant cela, j'ai cette erreur

Fatal error: Cannot use string offset as an array in /home/.../badge.ctp on line 27

De plus, j'ai déjà essayé avec plusieurs foreach mais j'ai toujours tous mes badges en triple vu qu'il y en a trois(et je crains plus si je rajoute des badges ce qui sera le cas).Il existe peut être un moyen de donner une condition du style si un badge est déjà affiché ne plus le mettre...

Met peu etre un compteur, qui s'incrémente a chaque foreach, et la condition d'affichage est que le badge a afficher doit avoir le même id que le compteur.

Sinon en relisant je pense que tu devrai plutot partir sur un code ressemblant a ceci:

<?php foreach ($badges as $k => $v): $v = current($v); ?>
    <?php foreach ($v as $kk => $vv): ?>
        <div class="badges">
            <p class="textcenter"><?php echo $vv'Badge']'name']; ?></p>
            <?php foreach($vv as $kkk => $vvv):?>
            <?php if($vvv=='BadgeUser'){foreach ($vvv as $kkkk => $vvvv) {
                if($vvvv'badge_id']==$vv'Badge']'id'])?>
                    <img src="<?php echo $v'url_image']; ?>">        
                <?php else: ?>
                    <img src="/img/badges/badge0.png">
                <?php endif; ?>
            <?php }} ?>     
            <p class="textcenter"><?php echo $vv'Badge']'content']; ?></p>
        </div>
    <?php endforeach; ?>
<?php endforeach; ?>

Si ceci est bien ton debug de $badges initialement:

array(
    'badges' => array(
        (int) 0 => array(
            'Badge' => array(
                'id' => '1',
                'name' => 'badge1',
                'content' => 'texte badge1',
                'url_image' => '/img/badges/badge1.png'
            ),
            'BadgeUser' => array(
                (int) 0 => array(
                    'id' => '1',
                    'badge_id' => '1',
                    'user_id' => '1'
                )
            )
        ),
        (int) 1 => array(
            'Badge' => array(
                'id' => '2',
                'name' => 'badge2',
                'content' => 'texte badge2',
                'url_image' => '/img/badges/badge2.png'
            ),
            'BadgeUser' => array(
                (int) 0 => array(
                    'id' => '2',
                    'badge_id' => '2',
                    'user_id' => '1'
                )
            )
        ),
        (int) 2 => array(
            'Badge' => array(
                'id' => '3',
                'name' => 'badge3',
                'content' => 'texte badge3',
                'url_image' => '/img/badges/badge3.png'
            ),
            'BadgeUser' => array()
        )
    )
zenkiai
Auteur

En adoptant ton code comme ceci [code]<?php foreach ($badges as $k => $v): $v = current($v); ?> <?php foreach ($v as $kk => $vv): ?>

<?php echo $v['name']; ?>

<?php foreach($vv as $kkk => $vvv): ?> <?php if($vvv=='BadgeUser'){foreach ($vvv as $kkkk => $vvvv) { if($vvvv['badge_id']==$v['id']):?> ![](<?php echo $v['url_image']; ?>)<?php else: ?> <?php endif; ?><?php }} ?><?php endforeach; ?>

<?php echo $v['content']; ?>

<?php endforeach; ?><?php endforeach; ?>[/code] j'ai cette erreur [code]Invalid argument supplied for foreach() [APP/View/Users[/code] Merci

Quelle ligne l'erreur?
Et pourrais tu faire un debug de ce que tu passe directement a ta page le $badges je pense.
Mettre ce que cela retourne.

Pour pouvoir avoir une idée de ou provient l'erreur.