Dans son tuto sur les Event Grafikart fait un SessionComponent::setFlash() pour afficher un message mais moi quand je fais ceci et ben j'ai l'erreur suivante:
Non-static method SessionComponent::setFlash() should not be called statically, assuming $this from incompatible context [APP/Event/BadgesEventListener.php, line 38]
Donc comment faire pour afficher un message de succès?
Déjà essayé et j'ai l'erreur suivante:
Undefined property: BadgesEventListener::$Session [APP/Event/BadgesEventListener.php, line 40]
Fatal error: Call to a member function setFlash() on a non-object
Voilà:
<?php
App::uses('CakeEventListener', 'Event');
class BadgesEventListener implements CakeEventListener {
public $type = array(
'blog.comment.add'
);
public function implementedEvents() {
return array(
'Model.Blog.comment' => 'commentAdd',
);
}
public function listBadges($type) {
$badges = ClassRegistry::init('Badges');
return $badges->find('list', array(
'fields' => array('id', 'level'),
'conditions' => array('type' => $type)
));
}
public function unlock($badge_id, $user_id) {
$userBadges = ClassRegistry::init('UserBadges');
$badges = $userBadges->find('first', array(
'conditions' => array('UserBadges.badge_id' => $badge_id, 'UserBadges.user_id' => $user_id)
));
if(empty($badges)) {
$userBadges->create();
$userBadges->save(array(
'badge_id' => $badge_id,
'user_id' => $user_id
));
$this->Session->setFlash('Vous venez de débloquer un nouveau badge');
//SessionComponent::setFlash('Vous venez de débloquer un nouveau badge');
}
}
public function commentAdd($event) {
$data = $event->subject()->data;
$user_id = $data'BlogComments']'user_id'];
if(empty($user_id)) {
return false;
}
$comment = ClassRegistry::init('BlogComments');
$count = $comment->find('count', array(
'conditions' => array('BlogComments.users_id' => $user_id)
));
$badges = $this->listBadges('blog.comment.add');
foreach($badges as $badge_id => $limit) {
if($count >= $limit) {
$this->unlock($badge_id, $user_id);
}
}
}
}
En faites je viens de trouver pourquoi le message de l'Event ne s'affiche pas c'est tout simplement parce que dans mon controller je fais un $this->Session->setFlash() pour dire que le commentaire à bien été posté et du coup Cakephp écrase le premier message donc je vais devoir modifier le core de Cakephp pour arranger ça.
Et pour le message d'erreur: Non-static method SessionComponent::setFlash() should not be called statically, assuming $this from incompatible context [APP/Event/BadgesEventListener.php, line 38] Grafikart dit que c'est normal dans sa video mais bon pas trop je trouve car c'est moche de voir ça une fois en prod j'espère que Cakephp va corriger ça.
C'est à cause de PHP 5.4 il faut attendre que le core de CakePHP soit compatible avec cette version de PHP, rien que tu ne puisse faire :(
Et tu sais Grafikart comment faut faire si on fait plusieurs setFlash pour qu'il les affiche tous au lieu de les écrasé et juste afficher le dernier?
j'ai le même soucis avec les deux setflash, si quelqu'un a une solution, je suis preneur..
Merci