Bonjour,
j'aurais besoin d'un petit coup de main, svp

j'ai rajouter un système de commentaire au mvc(a à z) avec le nombre de commentaire par post dans la fonction view
et j'ai crée une vars 'totalcomments' dans ma fonction view qui me donne le nombre de commentaire par post.
jusque la tous fonctionne

PostController.php

function index(){
        $perPage = 3; 
        $this->loadModel('Post');
        $condition = array('online' => 1,'type'=>'post'); 
        $d'posts'] = $this->Post->find(array(
            'conditions' => $condition,
            'fields' => 'Post.id,Post.name,Post.slug,Post.created,Category.name as catname,Post.content,Category.slug as catslug',
            'order' => 'created DESC',
            'limit' => ($perPage*($this->request->page-1)).','.$perPage,
            'join' => array('categories as Category'=>'Category.id=Post.category_id')
        ));
        $d'total'] = $this->Post->findCount($condition); 
        $d'page'] = ceil($d'total'] / $perPage);
        $this->set($d);
    }
        function view($id, $slug) {
    // Pour l'affichage du post voulu
        $this->loadModel('Post');
        $d'post'] = $this->Post->findFirst(array(
            'fields' => 'Post.id,Post.content,Post.name,Post.slug,Post.created,Category.name as catname,Category.slug as catslug',
            'conditions' => array('Post.online' => 1,'Post.id'=>$id,'Post.type'=>'post'),
            'join' => array('categories as Category'=>'Category.id=Post.category_id')
        ));
        // Pour l'affichage des commentaires
        $this->loadModel('Comment');
        $d'comments'] = $this->Comment->find(array(
            'conditions' => array('posts_id' => $id),
            'fields' => 'Comment.id,Comment.pseudo,Comment.mail,Comment.content,Comment.created',
            'order' => 'Comment.created DESC',
            'join' => array('posts as Post' => 'Post.id=Comment.posts_id')
        ));
        $condition = array('posts_id' => $id); 
        $d'totalcomments'] = $this->Comment->findCount($condition);
        if(empty($d'post'])){
            $this->e404('Page introuvable'); 
        }
        if($slug != $d'post']->slug){
            $this->redirect("posts/view/id:$id/slug:".$d'post']->slug,301);
        }
        if($this->request->data){
            if($this->Comment->validates($this->request->data)){
                $this->request->data->posts_id = $id;
                $this->request->data->created = date('Y-m-d H:i:s');
                $this->Comment->save($this->request->data);                               
                $this->Session->setFlash('Le commentaire a bien été créé');
                $this->redirect("posts/view/id:$id/slug:".$slug); 
            }else{
                $this->Session->setFlash('Merci de corriger vos informations','error');
            }
        }
        $this->set($d);
    }

pour le recupere dans ma view.php dans view/posts/ j'ai juste a ajouter la vars 'totalcomments'
et j'obtien le nombre de commentaire.

<?php echo $totalcomments; ?>

Mais le truc est que je voudrai aussi pouvoir utiliser cette vars 'totalcomments' dans ma view/index.php

mais ici je coince....
comment faire pour pouvoir utiliser la vars 'totalcomments'?
j'ai essayer quelque truc du genre mais sans succes :(

<?php echo $request->Comments->totalcomments; ?>
ou
<?php echo $comments->totalcomments; ?>
ou
<?php echo $this->request->totalcomments; ?>

est ce que quelqu'un aurais une idée svp ?

9 réponses


Tackacoder
Réponse acceptée

Bonjour,
Tu peux créer une fonction private dans ton objet

private function getComments($id) {
// Pour l'affichage des commentaires
    $this->loadModel('Comment');
    $d'comments'] = $this->Comment->find(array(
        'conditions' => array('posts_id' => $id),
        'fields' => 'Comment.id,Comment.pseudo,Comment.mail,Comment.content,Comment.created',
        'order' => 'Comment.created DESC',
        'join' => array('posts as Post' => 'Post.id=Comment.posts_id')
    ));
    $condition = array('posts_id' => $id); 
    $d'totalcomments'] = $this->Comment->findCount($condition);
return $d;
}

et tu l'appel dans tes autres fonction

$d'comments'] = $this->getComments($id);

et dans tes views, tu aura les 2 variables

$comments'comments'];
$comments'totalcomments'];
Tackacoder
Réponse acceptée

Bonjour,
Le plus simple, tu fait une boucle de tes posts.

foreach($d'posts'] as $k => $v) {
    $d'posts']$k] = $v;
    $d'posts']$k]'comments'] = $this->getComments($v->id);
}
Xtr3me
Réponse acceptée

L'erreur Cannot use object of type stdClass as array est simple à corriger cela veut dire que tu as une erreur de syntaxe en effet tu appelle l'objet comme si c'était un tableau ;).

Pour appeler un tableau tu fais ceci:

$d'comments']

Pour appeler un objet tu fais ceci:

$d->comments

Ceci est bien entendu un simple exemple il te suffit de modifier la ligne 3 grâce aux indications que je viens de te donner et le tour est joué.

nocraft0
Auteur

re salut, vraiment personne aurais une idée ?

est ce que je suis obliger de rajouter dans ma fonctionne index la partie comment que j'ai dans ma fonction view ?
pour pouvoir récupéré la variable ?

ou

moi se que je voudrai faire c'est au niveau de index faire un truc du genre
get_Var(donc dans le même Controller, sélectionner la fonction voulu 'view' , et récupéré la variable voulu 'totalcomments')

<?php echo get_Var('view', 'totalcomments'); ?>

je vous remerci d'avance pour toutes suggestions
actuelement je nage :(

nocraft0
Auteur

Ho reelement merci exothermique pour ta solution,

j'arrive bien comme avant, a recuperer ces variables dans view.php

<?php echo $comments'comments']; ?>
<?php echo $comments'totalcomments']; ?>

mais dans index.php j'ai un souci
voila ma partie index de mon PostsController

/**
    * Blog, liste les articles
    **/
    function index(){
        $perPage = 3; 
        $this->loadModel('Post');
        $condition = array('online' => 1,'type'=>'post'); 
        $d'posts'] = $this->Post->find(array(
            'conditions' => $condition,
            'fields' => 'Post.id,Post.name,Post.slug,Post.created,Category.name as catname,Post.content,Category.slug as catslug',
            'order' => 'created DESC',
            'limit' => ($perPage*($this->request->page-1)).','.$perPage,
            'join' => array('categories as Category'=>'Category.id=Post.category_id')
        ));
        $d'total'] = $this->Post->findCount($condition); 
        $d'page'] = ceil($d'total'] / $perPage);
        $d'comments'] = $this->getComments($id);
        $this->set($d);
    }

mais probleme car je n'ai pas de $id dans index()
comment faire pour recuperer le nombre de commentaire par post dans l'index ?
je suis un peu perdu X

aurais tu une nouvelle piste svp ?
apres ca , je pense toucher la fin hehe
merci d'avance

nocraft0
Auteur

hello , encore une fois , vraiment merci de m'avoir repondu si vite :p

par contre la ligne 3 que tu me presente, me renvoye cette erreur
"Cannot use object of type stdClass as array"

vraiment merci pour tous

nocraft0
Auteur

heu en faite , je me rend compte que c'est pas vraiment ca l'erreur mais plutôt qu'il ne trouve pas 'comments'

( ! ) Notice: Undefined variable: comments in C:\wamp\www\tuto\view\posts\index.php

sinon je vois que j'ai bien les commentaires pour chaque post en faisant un debug($d) dans index

Array
(
    [posts] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 34
                    [name] => coucou
                    [slug] => voila
                    [created] => 2013-06-09
                    [catname] => Jeux vidéos
                    [content] => 
hkjhkjhkjhjk

                    [catslug] => jeux-videos
                )
            [1] => stdClass Object
                (
                    [id] => 33
                    [name] => voila un nouveau teste
                    [slug] => nouveau-teste
                    [created] => 2013-06-05
                    [catname] => Music
                    [content] => 
RiTE, when added to the Winner software, redirects the realtime text stream to a user-selected program. For example, a user may redirect a text stream to a chat box. This facilitates instant response to questions posed to a celebrity in the chat room. A more prevalent use of rapid text entry is in the medical transcription market where it is very important to update the medical records quickly and efficiently.

                    [catslug] => music
                )
            [comments] => Array
                (
                    [0] => Array
                        (
                            [comments] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [id] => 21
                                            [pseudo] => ghgfhg
                                            [mail] => hhgfhfghfgh
                                            [content] => hgfhfghfg
                                            [created] => 2013-06-14 22:49:34
                                        )
                                    [1] => stdClass Object
                                        (
                                            [id] => 20
                                            [pseudo] => gfddddddddg
                                            [mail] => gfdfgd
                                            [content] => gfdgg
                                            [created] => 2013-06-14 20:15:14
                                        )
                                    [2] => stdClass Object
                                        (
                                            [id] => 19
                                            [pseudo] => fgdgfdgd
                                            [mail] => gfdgdfg
                                            [content] => gfdgdfgdf
                                            [created] => 2013-06-13 17:42:03
                                        )
                                    [3] => stdClass Object
                                        (
                                            [id] => 18
                                            [pseudo] => dfsfsd
                                            [mail] => fsdfsdsdf
                                            [content] => fdsfsd
                                            [created] => 2013-06-13 14:54:44
                                        )
                                )
                            [totalcomments] => 4
                        )
                    [1] => Array
                        (
                            [comments] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [id] => 16
                                            [pseudo] => gfdgfdgfdgdf
                                            [mail] => gfdgdfgfdg
                                            [content] => gfdgdfgdfg
                                            [created] => 2013-06-13 13:30:27
                                        )
                                    [1] => stdClass Object
                                        (
                                            [id] => 14
                                            [pseudo] => boby
                                            [mail] => boby@gmail.com
                                            [content] => ca dechire
                                            [created] => 2013-06-13 00:13:09
                                        )
                                )
                            [totalcomments] => 2
                        )
                )
        )
    [total] => 2
    [page] => 1
)

et dans ma view index je recupere la variable comme tu me l'avais evoquer

<span class="comments"><a href=""><?php echo $comments'totalcomments']; ?></a></span>

mais ca passe pas :(
encore merci de bien vouloir m'aider

nocraft0
Auteur

hehe, big thanks a vous deux
effectivement c'etais bien ca...
a bientot

De rien tout le plaisir était pour moi en ces jours de révisions je voulais m'évader un peu xD.