Bonjour,


C'est pas ce tuto que je devais faire mais pour moi c'est une des chose pas très simple a comprendre... et c'est un truc qu'on vois jamais dans les vidéos youtube


Pour comprendre la logique allez voir cette vidéo de Grafikart pendant que je mange ... ... ... bon ici on va mettre ma correction, mais finalement il n'y qu'une requête qui change vraiment.


Normalement si vous avez bien créer votre table topic vous avec pris soin de créer une date de création je l'ai mise en datetime


Ensuite au lieu de faire un truc 1 ou 0 c'est pas très pratique puisse que une fois que 1 et égal a 1 on peut plus update a moins d'incrémenté +1 a chaque réponse


Ce que j'ai fais c'est une table séparé


SELECT `id`, `user_id`, `topic_id`, `read_topic` FROM `f_topic_track`


Une fois que l'on poste un topic l'auteur va inséré dans cette table, évidement seul ceux qui sont connecter pourront update cette table comme ceci :

(il faudra faire deux requête d'affichage des topics une si on est connecter et l'autre si on l'est pas)


/**********
* view not view
***********/
if(isset($_SESSION['auth']) && !empty($_SESSION['auth'])){

    $userid = intval($_SESSION['auth']->id);

    $get = intval($match['params']['id']);

    $views = $db->prepare("SELECT id FROM f_topic_track WHERE user_id = ? AND topic_id = ?");

    $views->execute([$userid,$get]);

    $view = $views->fetch();
    
    //on update topic track en fonction de l'utilisateur
    if($view != null){

        $u = [$userid,$get];
        $db->prepare("UPDATE f_topic_track SET read_topic = NOW()  WHERE user_id = ? AND topic_id = ?")->execute($u);

    }else{

        $i = [$userid,$get];
        $db->prepare("INSERT INTO f_topic_track SET read_topic = NOW(), user_id = ?, topic_id = ?")->execute($i);

    }


}


Et une fois a l'affichage vous allez faire une jointure et check les différente dates c'est a partir d'ici qu'il faut une requête pour les connecter et les non connecter ici c'est pour la partie connecter avec l'id de l'utilisateur en session c'est important, cette partie vous la laissez vide pour les non connecter.


CASE

WHEN read_topic < f_topic_date THEN f_topic_date

WHEN read_topic > f_topic_date THEN read_topic

END AS read_last

LEFT JOIN f_topic_track ON f_topic_track.topic_id = f_topics.id AND f_topic_track.user_id = ?


Et a la toutes fin suffit de faire une condition


isset($posts->read_last) && !empty($posts->read_last > $posts->f_topic_date) ? 'vu' : 'non vu' ;


Ensuite a chaque réponse vous allez mettre a jour la date du topic où vous avez répondu


Et voilà vous avez votre système et le plus beau est que vous pouvez faire un bouton tout marquer comme lu et ainsi supprimer cette table topic_track mais seulement de l'utilisateur courant et ça c'est si il a la flemme de tout lire car si il lis tout suffura de faire un count de tout et le supprimer.


Et en bonus :


Si vous voulez ordonner en fonction des dernière réponses a un topic afin qu'il remonté en top vous pouvez faire comme ceci


CASE

WHEN f_topic_date < f_topic_message_date THEN f_topic_message_date

WHEN f_topic_date > f_topic_message_date THEN f_topic_date

ELSE f_topic_date

END AS Lastdate


Et vous fait order by Lastdate


Bonne journée !!

454 vues
30 août 2022 à 21:55 (Édité)
Cette pub permet au site de vivre ...

Commentaire

Tu veux participer ?
Alors connecte toi ou inscris toi et viens participer !
Cette pub permet au site de vivre ...