Bonsoir, comment faut-il faire pour triés les sujets en fonction de la dernière réponse.
Que le sujet (topic) ayant la dernière réponse (post) s’affiche en premier dans la liste des sujets.
Voici mon Controller qui affiche les sujets :
function index($id = null, $slug = null) {
$this->loadModel('Forum');
$d'topics'] = $this->Forum->find('all', array(
'conditions' => array('Forum.id' => $id),
'fields' => array('name', 'topic_count'),
'contain' => array(
'Topic' => array(
'fields' => array('name', 'created', 'post_count', 'topic_view'),
//'order' => array('Topic.created' => 'DESC'),
'conditions' => array('Topic.online' => 1),
'User' => array(
'fields' => array('username')
),
'Post' => array(
'fields' => array('user_id', 'created'),
'order' => array('Post.created' => 'DESC'),
'limit' => 1,
'conditions' => array('Post.online' => 1),
'User' => array(
'fields' => array('username')
)
)
)
)
));
// echo'<pre>';
// print_r($d);
// echo'</pre>';
$this->set($d);
}
Cette requête m’affiche les sujets mais trié par date de création des sujets et non par la dernière réponse posté.
Cordialement Flo2315
Sur le mien j'ai séparé les posts des topics. C'est à dire que la personne qui ouvre un nouveau topic va créer un post égalment.
Dans la table topic j'ai 1 champ en plus, "lastpost_id" que j'ai lié à mon modèle post avec un belongsTo.
Ce qui me permet de faire un order avec le LastPost, ainsi que les sticky etc... et tout générer automatiquement lors du paginate.
Je ne sais pas si c'est clair mais, voici la structure de ma db :
topics : id, name, created, modified, user_id, lastpost_id ... autres champs ...]
posts : id, content, created, modified, user_id, topic_id
Model Topic correspondant et simplifié pour l'exemple :
<?php
App::uses('Model', 'Model');
class Topic extends AppModel
{
public $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
),
'LastPost' => array(
'className' => 'Post',
'foreignKey' => 'lastpost_id',
),
// ...]
);
public $hasMany = array(
'Post' => array(
'className' => 'Post',
'foreignKey' => 'topic_id',
),
);
// ...]
}
Model Post correspondant et simplifié pour l'exemple :
<?php
App::uses('Model', 'Model');
class Post extends AppModel
{
public $belongsTo = array(
'Topic' => array(
'className' => 'Topic',
'foreignKey' => 'topic_id',
),
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
),
);
// ...]
}
et lors de mon paginate je fais :
<?php
$this->paginate = array(
'conditions' => array(
'Topic.board_id' => $id, // Je récupère l'id de la board et je cherche les topics liés
),
'contain' => array(
'User' => array(
// ...]
),
'LastPost' => array(
'fields' => array(
'LastPost.created',
),
'User' => array(
// ...]
),
),
),
'order' => array(
'Topic.is_sticky' => 'desc',
'LastPost.created' => 'desc',
),
'limit' => 20,
);
$topics = $this->paginate('Topic');
Ce qui me permet une pagination claire avec les sticky qui apparaitront bien sur la première page et en haut, et tout le reste suivra l'ordre du dernier post. Et tu peux récupérer toutes les informations sur le dernier post, comme l'auteur, la date et tout ce qui te semblerait important à ajouter si tu veux faire un système plus compliqué ou plus complet et pas simplement la date, si tu fais juste un champ de date.
Jusqu'à présent, je n'ai pas rencontré de bugs avec ce système, tout semble bien fonctionner.
Mieux vaut dans ton cas avoir un champs dans la table sujet contenant la date du dernier post, c'est le mieux
Ok, merci pour vos réponses, le plus simple je pense c’est d’enregistrer la date du dernier post dans la table Topics comme la dit Grafikart.
@xam1311 : Si tu as un exemple, je suis preneur, on s’est jamais au cas où sa peut toujours servir :-) .
Super, merci de ta réponse slyvaan, j'ai adapter et sa fonctionne très bien merci encore :-)