Amis de Grafikart bonsoir,

Je poursuis ma quête de la réalisation de mon premier site complet grace à CakePhP 2.0.

J'ai un problème dans ma partie blog, j'ai une liste de mes articles avec le début de leurs contenus. Quand je clic sur un article, je bascule sur la vue "voir.ctp" , dans cette vue j'ai l'article affiché au complet avec en dessous l'ensemble des commentaires et pour finir, si vous êtes connecté, un formulaire de type textarea pour écrire votre propre commentaire.

Tout ça j'arrive à le faire je vous montrerai le code en dessous. Ensuite, si vous avez déjà posté un article, vous pouvez cliquer sur un petit bouton éditer qui redirige vers le textarea avec le commentaire pré rempli dedans.

C'est ça que je n'arrive pas à faire j'ai tenté ceci :

(PostsController):

<?php function voir($id){ //l'id de l'article écrit au complet dans ma vue voir.ctp
    if(!empty($this->request->data)){//la partie pour écrire un nouveau commentaire
        $this->Comment->save($this->request->data);
        $this->Session->setFlash("Votre commentaire a bien été enregistré !", "notif");  
    }   
    $this->layout = 'default';
    $b = $this->Post->find('first', array('conditions' => array('Post.id' => $id), 'contain' => array('Comment' => array('User'), 'Category'
    )
    ));
    $this->set('article', $b); // je récupere l'article, ses commentaires et les auteurs qui sont forcément des membres de mon site
}?>

(CommentsController) :

<?php
function log_editc($id){//l'id de mon commentaire que je transmet par le lien du bouton edité
        $this->Comment->id = $id;
        $this->request->data = $this->Comment->read();
        $this->render('voir');// le probleme c'est que cette fonction me renvoie sur /log/Comments/editc/37 par exemple

    }
?>

Le problème est bien là, ca me renvoie sur /log/Comments/editc/37 alors que l'adresse de ma page devrait être /log/Posts/voir/ $l'id du posts.

Question comment faire pour faire circuler plusieurs $id sur cette page et plusieurs fonction dans l'adresse...

Je sais pas si vous avez compris mon usine à gaz

7 réponses


Dite le moi si je me trompe, Pour réaliser ceci, tu vas devoir passer pas du js et de l'ajax :/
Cf un post que j'ai ouvert il n'y a pas longtemps
Sinon un lien vers ton commentaire à éditer sur une autre page, mais sur la page actuelle c'est pas possible sans js

Edit :
Sinon dans ton posts controller, tu fais une requete sur les commentaire poster par la personne

$comm= $this->Post->Commentaire->find('list',array(
            'conditions' => array(
                'Commentaire.user_id' => $this->Auth->user('id')),
                                'Commentaire.post_id' => $id,
                ));

Tu auras ainsi une variable avec les comms de l'utilisateur,
Ensuite dans ta vue tu fais une condition: if($comm) et tu affiche un bouton pour l'éditer.
Mais après niveau mise en forme js obligatoire.

tapesec
Auteur

Salut Xcid, si c'est possible sans JS j'ai trouvé du boulot dans l'apres midi, il suffit de passer dans la fonction voir deux parametres regarde :)

<?php function voir($id, $idC=null){// $id c'est pour l'article et $idc c'est l'id du commentaire que je transmet en cliquant sur le bouton editer
            if(!empty($this->request->data)){
                if($this->Post->Comment->validates()){
                    $this->Post->Comment->save($this->request->data);
                    $this->Session->setFlash("Votre commentaire a bien été enregistré !", "notif");  
                }else{
                    $this->Session->setFlash("Votre commentaire n' pas été enregistré !", "notif", array('type' => 'error'));  
                }
            }
            if ($idC != null){
                $this->Post->Comment->id = $idC;
                $this->request->data = $this->Post->Comment->read();
            }
        $this->layout = 'default';
        $b = $this->Post->find('first', array('conditions' => array('Post.id' => $id), 'contain' => array('Comment' => array('User'), 'Category'
        )
        ));
        $this->set('article', $b);
        }
?>

je peux voir ta vue ? voir.ctp ?

tapesec
Auteur

Oui la voici (je te préviens c'est le bordel)

<?php
      echo '<div class="article">';
      echo '<div class="presentation">'.$this->Html->image("/theme/img/images.jpg").'</div>';
      echo '<div class="contenuA"><h3>'.$this->Html->image("/theme/img/epingle.png").''.$article"Post"]"titre"].'</h3>';
      echo '<p><span class="dateP">'.date('d / m / Y', strtotime($article'Post']'created'])).'</span> | <span class="tag">'.$article'Category']'titre'].'</span> | <span class="commentaire">commentaires (<span class="nbreC">';?><?php echo $this->requestAction(array('log'=> false, 'controller' => 'Comments', 'action' =>'nbreC', $article'Post']'id']));?><?php echo '</span>).</span></p>'; ?>
<?php echo '<p>';
      echo $this->Markitup->parse($article'Post']'contenu']);
      echo '</p>';
      echo '</div>';
      echo '</div>';
      if(!empty($article'Comment'])){
      echo '<h2>Commentaires</h2>';
      }
      foreach($article'Comment'] as $c):
      echo '<div class="comment">';
      echo '<div class="avatar">'.$this->Html->image("/theme/img/elodie.png").'</div>';
      echo '<div class="contenuC"><h4><span class="auteur">'.$c'User']'username'].'</span> a écrit <span class="dateP"> le '.$c'created'].'</span>';
      if(AuthComponent::user('id') == $c'User']'id']): 
      echo $this->Html->link($this->Html->image("/theme/img/editA.png", array('class' => 'editC')),
                             array('log' => false, 'controller' => 'Posts', 'action' => 'voir', $article'Post']'id'], $c'id']), array('escape' => false));
      echo $this->Html->link($this->Html->image("/theme/img/del.png", array('class' => 'editC')),
                             array('log' => false, 'controller' => 'Comments', 'action' => 'delete'), array('escape' => false));
      endif;
      echo '</h4>';
      echo '<p>'.$c'contenu'].'</p>';
      echo '</div>';
      echo '</div>';
      endforeach;

?>
<?php 
if(AuthComponent::user('id')): 
      echo $this->Html->script('/js/markitup/jquery.markitup.js');
      echo $this->Html->script('/js/markitup/sets/bbcode/set.js');                                    
      echo $this->Form->create('Comment', array('url' =>array('controller' => 'posts', 'action' => 'voir', $article'Post']'id'])));
      echo '<h3>Laisser un commentaire :</h3>';
      echo '<p>';
      echo $this->Markitup->editor('Comment.contenu', array( 'set' => 'bbcode', 'parser' => '/posts/preview/bbcode', 'label' => false, /*'value' => "",*/ 'error' => 'ecrivez !'));
      echo $this->Form->input('post_id', array('type' => 'hidden', 'value' => $article'Post']'id']));
      echo $this->Form->input('user_id', array('type' => 'hidden', 'value' => AuthComponent::user('id')));

      echo $this->Form->submit('/theme/img/envoyer.png', array('div' => false, 'class' => 'submit'));
      echo '</p>';
endif;
?>

Sinon par rapport à mon controller dans mon post précédent, j'arrive pas à editer le commentaire, je veux dire par là que quand je modifie le contenu d'un commentaire et que je valide, ça m'en crée un nouveau, ça ne modifie pas le message voulu. (et je n'arrive toujours pas à mettre des règles de validations dans mon model commentaire).

'Je vais finir par y arriver petit à petit :p'

Salut Tapesec,
As tu résolu le problème de tes règles de validations du model Comment.php et du faite que le commentaire se rajoute au lieu de se modifier.
J'ai en faite exactement les mêmes soucis que toi.
Merci

Tu peux utiliser le renderAs.
voir la doc pour plus d'infos : Doc

sinon je pense que tu peux faire encore comme ça :

$this->render('Posts/nom_de_la_vue')