2013-09-01 1 views
0

J'essaie d'implémenter un système up/downvote pour notre application Web. Actuellement, l'utilisateur peut "poster" une question sur notre site. Lorsque l'utilisateur accède à la section de navigation de notre site, une liste de toutes les questions actuellement posées sur le site lui est présentée. Lorsque l'utilisateur clique sur le lien vers le haut ou vers le bas, la base de données doit être mise à jour via AJAX (c'est-à-dire que je ne souhaite pas rediriger l'utilisateur ou actualiser la page). Comment puis-je récupérer la question associée à chaque lien up/downvote, puis envoyer ces données au contrôleur?Envoi de données AJAX au contrôleur (Yii-Framework)

site/browse:

<?php 
    /* 
    * @var $model Question 
    */ 

    //loop through all the given questions 
    foreach($model as $q) 
    {   
     //add the upvote and downvote (text for now) 
     echo CHtml::ajaxLink('up', array('question/upvote')); 
     echo ("&nbsp - &nbsp;"); 
     echo CHtml::ajaxLink('down', array('question/downvote')); 
     echo '<br />'; 

     echo CHtml::link($q['name'], array('question/browse/'.$q['_id'])); 
     echo "<br />Description: " . $q["description"] . "<br />"; 
     echo "Owner: " . $q["user_id"] . "<br />"; 

     $timeStamp = new Timestamp($q['timestamp']); 

     echo $timeStamp->getDifferenceString() . "<br /><br />"; 
    } 
?> 

question controller:

... 
public function upvote() 
     { 
      //should retrieve question_id and then update database accordingly 
      //e.g. UPDATE Question SET value = value + 1 WHERE Question.id = id 
     } 
... 

Répondre

1

Vous pouvez passer l'identifiant de la question obtenir le upvote dans l'URL de la demande ajax, ou comme données POST à ​​la demande ajax. Je recommanderais d'utiliser les données POST via l'appel jQuery AJAX, mais ici, je vais montrer comment le faire avec le code que vous avez fourni.

<?php 
    /* 
    * @var $model Question 
    */ 

    //loop through all the given questions 
    foreach($model as $q) 
    {   
     //add the upvote and downvote (text for now) 
     echo CHtml::ajaxLink('up', array('question/upvote',array('id'=>$q['_id']))); 
     echo ("&nbsp - &nbsp;"); 
     echo CHtml::ajaxLink('down', array('question/downvote',array('id'=>$q['_id']))); 
     echo '<br />'; 

     echo CHtml::link($q['name'], array('question/browse/'.$q['_id'])); 
     echo "<br />Description: " . $q["description"] . "<br />"; 
     echo "Owner: " . $q["user_id"] . "<br />"; 

     $timeStamp = new Timestamp($q['timestamp']); 

     echo $timeStamp->getDifferenceString() . "<br /><br />"; 
    } 
?> 

Une fois que vous avez l'ID, puis dans votre contrôleur de question que vous modifier la méthode upvote() comme indiqué.

contrôleur question:

... 
public function upvote($id) 
     { 
      //you have the question id, now you can update database accordingly 
      //e.g. UPDATE Question SET value = value + 1 WHERE Question.id = id 
     } 
... 

Cela vous permettra de démarrer. Vous devriez utiliser jQuery pour générer les requêtes upvote/downvote et gérer les réponses - et je ne veux pas dire jQuery généré automatiquement par la méthode ajaxLink(). Vous pouvez également faire en sorte que l'URL soit plus belle avec une route permettant de gérer les requêtes upvote et downvote.

Questions connexes