Aller au menu - Aller au contenu

Icône Et encore trois autres

Avatar
Mise à jour : 30/11/2010
Difficulté : Facile Facile Creative Commons BY
4 145 visites depuis 7 jours, dont 63 sur ce chapitre classé 41/786
Dans ce chapitre nous allons étudier trois nouveaux systèmes qui pourront être ajouté à votre forum très facilement en ne modifiant que quelques pages.

Alors avant d'aller plus loin voilà ces trois fonctions :
  • La liste de tous les membres
  • Un système de gestion des amis
  • Un système permettant d'envoyer des réponses automatiques par les modérateur

Le second va demander un peu de modifications y compris dans la base de données mais de toute façon vous avez l'habitude maintenant ;) .

Bon bah on y va alors !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

La liste des membres

Avant de faire quoi que ce soit concernant les amis, il faut dresser un aspect communautaire à votre forum en installant une liste des membres.

Cette liste est vraiment simple à réaliser, il suffit en fait de faire une requête et d'afficher les résultats dans un tableau.

On va rapidement voir comment faire ça, tout d'abord il vous faut une nouvelle page que personnellement j'ai appelé memberlist.php, on commence un peu comme sur la page voirforum.php.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
session_start();
$titre="Liste des membres";
include("includes/identifiants.php");
include("includes/debut.php");
include("includes/menu.php");

//A partir d'ici, on va compter le nombre de members
//pour n'afficher que les 25 premiers
$query=$db->query('SELECT COUNT(*) AS nbr FROM forum_membres');
$data = $query->fetch();

$total = $data['nbr'] +1;
$query->CloseCursor();
$MembreParPage = 25;
$NombreDePages = ceil($total / $MembreParPage);
echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> 
<a href="./memberlist.php">Liste des membres</a></p>';

//Nombre de pages

$page = (isset($_GET['page']))?intval($_GET['page']):1;

//On affiche les pages 1-2-3, etc.
echo 'Page : ';
for ($i = 1 ; $i <= $NombreDePages ; $i++)
{
    if ($i == $page) //On ne met pas de lien sur la page actuelle
    {
        echo $i;
    }
    else
    {
        echo '<p><a href="memberlist.php?page='.$i.'">'.$i.'</a></p>';
    }
}
echo '</p>';

$premier = ($page - 1) * $MembreParPage;

//Le titre de la page
echo '<h1>Liste des membres</h1><br /><br />';
?>


Là on a tout mis en place, arriver ici il faut pouvoir proposer au visiteur de classer les membres comme il le souhaite (par pseudo, age, date de naissance...). Pour le nombre de classement et leur nature c'est à vous de voir, pour ma part j'ai uniquement mis 4 propositions, le pseudo, la date d'inscription, la date de dernière connexion et le nombre de messages :) .

Ensuite il faut également faire en sorte qu'il puisse les classer par ordre croissant ou décroissant.

Pour faire ça, j'ai utilisé deux array qui vont permettre de convertir en texte compréhensible par n'importe qui le nom des champs de la table forum_membres correspondants.
Je m'explique ( :-° ), en fait on va demander au visiteur grâce à une liste déroulante de choisir par quoi il veut trier les membres. Seulement on ne peut pas lui proposer les noms des champs brut donc on passe par un tableau qui convertit tout ça.

Le mieux est encore de regarder le code ^^ .

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
//Tri

$convert_order = array('membre_pseudo', 'membre_inscrit', 'membre_post', 'membre_derniere_visite'); 
$convert_tri = array('ASC', 'DESC');
//On récupère la valeur de s
if (isset ($_POST['s'])) $sort = $convert_order[$_POST['s']];
else $sort = $convert_order[0];
//On récupère la valeur de t
if (isset ($_POST['t'])) $tri = $convert_tri[$_POST['t']];
else $tri = $convert_tri[0];

?>
<form action="memberlist.php" method="post">
<p><label for="s">Trier par : </label>

<select name="s" id="s">
<option value="0" name="0">Pseudo</option>
<option value="1" name="1">Inscription</option>
<option value="2" name="2">Messages</option>
<option value="3" name="3">Dernière visite</option>
</select>

<select name="t" id="t">
<option value="0" name="0">Croissant</option>
<option value="1" name="1">Décroissant</option>
</select>
<input type="submit" value="Trier" /></p>
</form>
<?php
//Requête

$query = $db->prepare('SELECT membre_id, membre_pseudo, membre_inscrit, membre_post, membre_derniere_visite, online_id
FROM forum_membres
LEFT JOIN forum_whosonline ON online_id = membre_id
ORDER BY '.$sort.', online_id '.$tri.'
LIMIT :premier, :membreparpage');
$query->bindValue(':premier',$premier,PDO::PARAM_INT);
$query->bindValue(':membreparpage',$MembreParPage, PDO::PARAM_INT);
$query->execute();

if ($query->rowCount() > 0)
{
?>
       <table>
       <tr>
       <th class="pseudo"><strong>Pseudo</strong></th>             
       <th class="posts"><strong>Messages</strong></th>
       <th class="inscrit"><strong>Inscrit depuis le</strong></th>
       <th class="derniere_visite"><strong>Dernière visite</strong></th>                       
       <th><strong>Connecté</strong></th>             

       </tr>
       <?php
       //On lance la boucle
       
       while ($data = $query->fetch())
       {
           echo '<tr><td>
           <a href="./voirprofil.php?m='.$data['membre_id'].'&amp;action=consulter">
           '.stripslashes(htmlspecialchars($data['membre_pseudo'])).'</a></td>
           <td>'.$data['membre_post'].'</td>
           <td>'.date('d/m/Y',$data['membre_inscrit']).'</td>
           <td>'.date('d/m/Y',$data['membre_derniere_visite']).'</td>';
           if (empty($data['online_id'])) echo '<td>non</td>'; 
           else echo '<td>oui</td>';
           echo '</tr>';
       }
       $query->CloseCursor();
       ?>
       </table>
       <?php
}
else //S'il n'y a pas de message
{
    echo'<p>Ce forum ne contient aucun membre actuellement</p>';
}
?>
</div>
</body></html>


Et le voilà le travail, vous avez à présent une liste de membres assez sommaire mais qui a le mérite de marcher :D .

J'aimerai tout de même revenir sur la requête, vous avez remarqué que je fais une jointure sur la table forum_whosonline. En fait je cherche à récupérer l'id du membre, si elle s'y trouve c'est que le membre est connecté, sinon c'est qu'il ne l'est pas et donc la valeur de $data['online_id'] sera NULL.
On réutilisera cette méthode dans la suite et maintenant on va pouvoir passer à la page de gestion des amis sans plus tarder!

Gestion des amis

Avoir des amis sur un forum... On se sent tout de suite moins seul, c'est plus rapide pour communiquer et puis ça met une meilleure ambiance, bref, que du bonheur :p .

J'imagine que la plupart d'entre vous a déjà au moins essayé ce système sur le site du zéro mais je vais quand même expliquer le principe.

Tout se passe sur une seule page que j'ai appelée amis.php, celle-ci comme beaucoup dans ce tuto, s'articule autour d'un switch.
Tout d'abord lorsque l'on arrive sur la page, un tableau liste les amis que l'on a, à partir de là il est possible de :
  • Supprimer un ami :euh:
  • Ajouter un ami
  • Valider la demande d'ajout d'un ami


En effet pour avoir un ami, il faut que celui-ci soit d'accord, c'est pourquoi lorsque vous voulez ajouter un membre à votre liste, il est immédiatement prévenu (par MP par exemple) qu'il doit se rendre sur sa page de gestion des amis pour valider ou supprimer cette demande.

Avant tout, il nous faut une table dans la base de données, celle-ci (forum_amis) comprend 4 champs :
  • ami_from : contient l'id du membre qui demande à ajouter un ami
  • ami_to : contient l'id de l'ami en question
  • ami_confirm : retourne 1 si l'amitié est réciproque, 0 sinon
  • ami_date : contient la date d'ajout


Voici le code à copier :

Code : SQL
1
2
3
4
5
6
7
CREATE TABLE `forum_amis` (
  `ami_from` int(11) NOT NULL,
  `ami_to` int(11) NOT NULL,
  `ami_confirm` enum('0','1') collate latin1_general_ci NOT NULL,
  `ami_date` int(11) NOT NULL,
  PRIMARY KEY  (`ami_to`,`ami_from`)
)


Allez on commence de suite :)

Déjà le début de la page est très classique, il faut simplement récupérer la valeur de action qui se trouve dans l'url et s'assurer que le visiteur est bien connecté.
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
session_start();
$titre="Gestion des amis";
include("includes/identifiants.php");
include("includes/debut.php");
include("includes/menu.php");
$action = isset($_GET['action'])?htmlspecialchars($_GET['action']):'';

echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> <a href="./amis.php">Gestion des amis</a>';
if ($id==0) erreur(ERR_IS_CO);
 
//Le titre 
echo '<h1>Gestion des amis</h1><br /><br />';
?>


Comme prévu, rien de très compliqué ni de nouveau :p

Ajouter un ami



Pour ajouter un ami, on propose au membre un champ dans lequel il écrira le pseudo de cette personne, ensuite il faut lancer une série de tests pour s'assurer qu'il n'y a pas de problème.

Tout d'abord le formulaire :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?
switch($action)
{
    case "add": //On veut ajouter un ami
    if (!isset($_POST['pseudo']))
    {
    echo '<form action="amis.php?action=add" method="post">
    <p><label for="pseudo">Entrez le pseudo</label>
    <input type="text" name="pseudo" id="pseudo" />
    <input type="submit" value="Envoyer" />
    </p></form>';
    }
?>


Comme vous voyez, on ne lance le formulaire que si la variable $_POST['pseudo'] est vide, c'est-à-dire si on vient d'arriver sur la page.

Ensuite pour la batterie de tests, j'ai prévu 3 conditions :
  • L'ami doit exister ^^
  • L'ami ne doit pas être déjà présent dans la liste d'ami, ni en cours de demande
  • L'ami ne doit pas être le membre en question


On va donc traduire ça en php.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
    else
    {
        $pseudo_d = $_POST['pseudo'];
        //On vérifie que le pseudo renvoit bien quelque chose :o

        $query=$db->prepare('SELECT membre_id, COUNT(*) AS nbr FROM forum_membres 
        WHERE LOWER(membre_pseudo) = :pseudo GROUP BY membre_pseudo');
        $query->bindValue(':pseudo',strtolower($pseudo_d),PDO::PARAM_STR);
        $query->execute();
        $data = $query->fetch();
        $pseudo_exist = $data['nbr'];
        $i = 0;
        $id_to=$data['membre_id'];
        if(!$pseudo_exist)
        {
            echo '<p>Ce membre ne semble pas exister<br />
            Cliquez <a href="./amis.php?action=add">ici</a> pour réessayer</p>';
            $i++;
        }
        $query->CloseCursor();
        $query = $db->prepare('SELECT COUNT(*) AS nbr FROM forum_amis 
        WHERE ami_from = :id AND ami_to = :id_to
        OR ami_from = :id AND ami_to = :id_to');
        $query->bindValue(':id',$id,PDO::PARAM_INT);
        $query->bindValue(':id_to', $id_to, PDO::PARAM_INT);
        $query->execute();
        $deja_ami=$query->fetchColumn();
        $query->CloseCursor();

        if ($deja_ami != 0)
        {
            echo '<p>Ce membre fait déjà parti de vos amis ou a déjà proposé son amitié :p<br />
            Cliquez <a href="./amis.php?action=add">ici</a> pour réessayer</p>';
            $i++;
        }
        if ($id_to == $id)
        {
            echo '<p>Vous ne pouvez pas vous ajouter vous même<br />
            Cliquez <a href="./amis.php?action=add">ici</a> pour réessayer</p>';
            $i++;
        }
        if ($i == 0)
        {
            $query=$db->prepare('INSERT INTO forum_amis (ami_from, ami_to, ami_confirm, ami_date)
            VALUES(:id, :id_to, :conf, :temps)');
            $query->bindValue(':id',$id,PDO::PARAM_INT);
            $query->bindValue(':id_to', $id_to, PDO::PARAM_INT);
            $query->bindValue(':conf','0',PDO::PARAM_STR);
            $query->bindValue(':temps', time(), PDO::PARAM_INT);
            $query->execute();
            $query->CloseCursor();
            echo '<p><a href="/voirprofil.php?m='.$data['membre_id'].'">'.stripslashes(htmlspecialchars($pseudo_d)).'</a> 
            a bien été ajouté à vos amis, il faut toutefois qu il donne son accord.<br />
            Cliquez <a href="./index.php">ici</a> pour retourner à l index du forum<br />
            Cliquez <a href="./amis.php">ici</a> pour retourner à la page de gestion des amis</p>';
        }
    }
?>


Comme vous le voyez, la variable $i s'occupe de compter le nombre d'erreur. Même si je vois mal comment il peut y en avoir plusieurs en même temps o_O , cela permet de savoir si on peut lancer la requête ou non.

Voilà vous pouvez à présent demander à ajouter des amis ce qui est quand même un premier pas ^^ .

On va à présent voir la validation de ces demandes.

Validation des demandes



Cette partie du switch se présente de la façon suivante :
On affiche un tableau qui liste les membres qui vous ont voulu comme ami mais dont vous n'avez pas encore validé la demande.
Pour chacun on propose un lien vers l'acceptation et un autre vers le refus.
De la même façon, il va falloir vérifier qu'on vient d'arriver sur la page (auquel cas on affiche le tableau) ou qu'on a déjà fait son choix (dans ce cas on lance les requêtes).

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
case "check":
    $add = (isset($_GET['add']))?htmlspecialchars($_GET['add']):0;
    if (empty($add))
    {
        $query = $db->prepare('SELECT ami_from, ami_date, membre_pseudo FROM forum_amis
        LEFT JOIN forum_membres ON membre_id = ami_from
        WHERE ami_to = :id AND ami_confirm = :conf
        ORDER BY ami_date DESC');
        $query->bindValue(':id',$id,PDO::PARAM_INT);
        $query->bindValue(':conf','0',PDO::PARAM_STR); 
        $query->execute();

        echo '<table align="center"><tr>
        <th class="pseudo"><strong>Pseudo</strong></th>
        <th class="inscrit"><strong>Date d ajout</strong></th>
        <th><strong>Action</strong></th></tr>';

        if ($query->rowCount() == 0)
        {
            echo '<td colspan="3" align="center">Vous n avez aucune proposition</td>';
        }
        while ($data = $query->fetch())
        {
            echo '<tr><td><a href="./voirprofil.php?m='.$data['ami_from'].'&amp;action=consulter">'.stripslashes(htmlspecialchars($data['membre_pseudo'])).'</a></td>
            <td>'.date('d/m/Y',$data['ami_date']).'</td>
            <td><a href="./amis.php?action=check&amp;add=ok&amp;m='.$data['ami_from'].'">Accepter</a> - 
            <a href="./amis.php?action=delete&amp;m='.$data['ami_from'].'">Refuser</a> 
            </td></tr>';
        }
        $query->CloseCursor();
    }
?>


Si vous étudiez un peu les deux liens, vous verrez que dans ce switch on ne va s'occuper que du cas où vous acceptez la demande de validation. On récupère la valeur de l'ami qui se trouve dans l'url sous le nom de m. C'est par ailleur la présence, ou l'absence de cette variable qui nous indique si on doit afficher le tableau ou si on doit lancer les requêtes.


D'ailleurs on va voir les requêtes de suite :)

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
    else
    {
        $membre = (int) $_GET['m'];
        $query = $db->prepare('UPDATE forum_amis SET ami_confirm = :conf 
        WHERE ami_from = :membre AND ami_to = :id');
        $query->bindValue(':conf','1',PDO::PARAM_STR);
        $query->bindValue(':membre',$membre,PDO::PARAM_INT);
        $query->bindValue(':id',$id,PDO::PARAM_INT);
        $query->execute();
        $query->closeCursor();
        echo '<p>Le membre a bien été ajouté à votre liste d ami<br />
        Cliquez <a href="./amis.php">ici</a> pour retourner à la liste des amis';
    }
break;
?>


On change la valeur du champ ami_confirm à 1 et le tour est joué !

Hep attends une minute, dans la base de données on aura tantôt des membres qui seront dans les listes en tant que ami_to ou ami_from !


Oui mais ça ne pose pas de problème, il suffira de s'arranger avec la requête pour ne pas oublier de cas. En fait à partir du moment où la demande est validée, la différence entre les champs ami_to et ami_from n'existe plus.

Allez on file vers la suppression et puis on aura gagné !

Supprimer un ami



Derrière ce titre très ambigu ( :D ) se cache la dernière partie de notre switch.
La suppression d'un ami peut être de deux natures, soit vous voulez vous débarrasser d'un ami que vous avez depuis un moment et dont vous avez déjà validé la demande d'ajout. Soit vous voulez refuser une demande d'ajout.

L'avantage c'est qu'on a même pas besoin de faire la différence entre les deux, il suffit de récupérer la valeur de l'id du membre et de le virer de la base de données.

En revanche, comme il s'agit d'une suppression, il faut s'assurer que ce n'est pas une erreur en demandant une confirmation.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
case "delete":
    $membre = (int) $_GET['m'];
    if (!isset($_GET['ok']))
    {
        echo '<p>Etes vous certain de vouloir supprimer ce membre ?<br />
        <a href="./amis.php?action=delete&amp;ok=ok&amp;m='.$membre.'">oui</a> - <a href="./amis.php">non</a></p>';
    }
    else
    {
        $query = $db->prepare('DELETE FROM forum_amis WHERE ami_from = :membre AND ami_to = :id');
        $query->bindValue(':membre',$membre,PDO::PARAM_INT);
        $query->bindValue(':id',$id,PDO::PARAM_INT);
        $query->execute();
        $query->closeCursor();

        $query = $db->prepare('DELETE FROM forum_amis WHERE ami_to = :membre AND ami_from = :id');
        $query->bindValue(':membre',$membre,PDO::PARAM_INT);
        $query->bindValue(':id',$id,PDO::PARAM_INT);
        $query->execute();
        $query->closeCursor();

        echo '<p>Membre correctement supprimé :D <br />
        Cliquez <a href="./amis.php">ici</a> pour retourner à la liste des amis</p>';
    }
break;
?>


Vous voyez que comme on ignore si le membre se trouve au champ ami_to ou ami_from, on supprime les deux sans faire de distinction.

Il est tout de même important de prévenir l'ami en question, vous pouvez vous arranger pour qu'il reçoive le cas échéant un MP pour le prévenir. Il est en est d'ailleurs de même pour les demandes d'ajout, les validations etc...


Enfin on affiche la liste des amis



Je vais passer vite là dessus étant donné que c'est ce que l'on a fait dans le premier chapitre.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
default:

    $query = $db->prepare('SELECT (ami_from + ami_to - :id) AS ami_id, ami_date, membre_pseudo, online_id 
    FROM forum_amis
    LEFT JOIN forum_membres ON membre_id = (ami_from + ami_to - :id)
    LEFT JOIN forum_whosonline ON online_id = membre_id
    WHERE (ami_from = :id OR ami_to = :id) AND ami_confirm = :conf ORDER BY membre_pseudo');
    $query->bindValue(':id',$id,PDO::PARAM_INT);       
    $query->bindValue(':conf','1',PDO::PARAM_STR);
    $query->execute();
    
    echo '<table align="center"><tr>
    <th class="pseudo"><strong>Pseudo</strong></th>
    <th class="inscrit"><strong>Date d ajout</strong></th>
    <th><strong>Action</strong></th>
    <th><strong>Connecté</strong></th></tr>';

    if ($query->rowCount() == 0)
    {
        echo '<td colspan="4" align="center">Vous n avez aucun ami pour l instant</td>';
    }
    while ($data = $query->fetch())
    {
        echo '<tr><td><a href="./voirprofil.php?m='.$data['ami_id'].'&amp;action=consulter">'.stripslashes(htmlspecialchars($data['membre_pseudo'])).'</a></td>
        <td>'.date('d/m/Y',$data['ami_date']).'</td>
        <td><a href="./messagesprives.php?action=repondre&amp;dest='.$data['ami_id'].'">Envoyer un MP</a><br />
        <a href="./amis.php?action=delete&m='.$data['ami_id'].'">Supprimer</a></td>';
        if (!empty($data['online_id'])) echo '<td>Oui</td>'; else echo '<td>Non</td>';
        echo '</tr>';
    }
    echo '</table>';
    $query->CloseCursor();

    //On compte le nombre de demande en cours et on met quelques liens
    $query=$db->prepare('SELECT COUNT(*) FROM forum_amis 
    WHERE ami_to = :id AND ami_confirm = :conf');
    $query->bindValue(':id',$id,PDO::PARAM_INT);
    $query->bindValue(':conf','0', PDO::PARAM_STR);
    $query->execute();
    $demande_ami=$query->fetchColumn();

    //Cette ligne va permettre d'afficher 0 plutôt qu'un vide
    if (empty($demande_ami)) $demande_ami=0;
    echo '<br /><ul>
    <li><a href="./amis.php?action=add">Ajouter un ami</a></li>
    <li><a href="./amis.php?action=check">Voir les demandes d\'ajout ('.$demande_ami.')</a></li></ul>';
break;
}

?>
</div>
</body></html>


Alors un arrêt important sur cette requête, c'est une méthode assez astucieuse proposée par tarekbouchkati dans les commentaires du tuto. En fait on ne veux pas récupérer les entrées de le base de donnée qui concerne le membre connecté en tant qu'ami (sinon on aurait son propre nom dans la liste d'amis puisqu'il n'est pas possible de faire la différence).
Avec cette méthode, on ne va garder que l'id qui n'est pas celle du membre et ainsi afficher le bon nom. C'est un peu étrange mais je vous laisse réfléchir à ce que donnerait le résultat de la requête en piochant indifféremment dans ami_from et ami_to.

Pour le reste c'est du classique, on récupère tout ce qui concerne le membre dans la table forum_amis puis on affiche. Maintenant c'est à vous de personnaliser cette page comme ça vous arrange.

Si vous voulez connaitre le nombre de demandes d'amis en cours, il vous suffit d'utiliser la dernière requête de ce script


En général, il est très utile comme sur le SDZ de mettre dans le menu la liste des amis connectés ce qui n'est pas très compliqué si vous avez suivi jusque ici :)

Réponses automatiques

Bon on passe maintenant à l'autre système qui est la réponse automatique que les modérateurs peuvent activer pour leur éviter de répéter 10 fois par jour la même chose.
Croyez moi sur un forum assez important ça évite pas mal de crise de nerfs à votre équipe ^^

Alors, le principe est assez simple, sur la base de données vous allez enregistrer une série de messages que vous voulez voir afficher. Puis sur la page voirtopic.php, à côté de toutes les options de modérations, vous mettrez une liste déroulante qui contient tous ces messages. Ensuite le modérateur en sélectionne un puis envoie le tout. Il faut également penser à verrouiller le topic une fois tout ça fait.

Vous pouvez également stocker les messages sur un fichier php à part ce qui peut être plus facile pour les écrire.
Dans tous les cas il faut tenir compte du parsage, comme sur ce tuto, les messages sont parsés à l'affichage, il faudra les écrire comme si vous faisiez un post (donc en utilisant le bbcode/zcode etc... :-°


Vous allez donc lancer ceci dans votre base de données
Code : SQL
1
2
3
4
5
6
CREATE TABLE `forum_automess` (
`automess_id` TINYINT( 3 ) NOT NULL AUTO_INCREMENT ,
`automess_mess` TEXT NOT NULL ,
`automess_titre` VARCHAR( 200 ) NOT NULL ,
PRIMARY KEY ( `automess_id` )
) TYPE = MYISAM ;


Je pense que vous pouvez deviner un peu le principe, le titre sera le texte qui va apparaitre dans la liste déroulante et le message sera ... le message qui sera posté :D

Afficher la liste déroulante



Pour ce code qui se trouve sur la page voirtopic.php, le code est simple puisqu'il suffit de faire une requête et de tout lister. Par contre, assurez vous bien d'être toujours dans la partie de votre page qui est sous la vérification d'accès. En effet, seuls les modérateurs peuvent poster des réponses automatiques :)

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
echo '<p>Réponse automatique :</p>
<form method="post" action=postok.php?action=autorep&amp;t='.$topic.'>
<select name="rep">';
$query=$db->query('SELECT automess_id, automess_titre
FROM forum_automess');
while ($data = $query->fetch())
{
     echo '<option value="'.$data['automess_id'].'">
     '.$data['automess_titre'].'</option>';
}
echo '</select>  
<input type="submit" name="submit" value="Envoyer" /></form>';
$query->CloseCursor();
?>


Le mieux est encore de placer ce code à la suite du script qui affichait la liste déroulante pour le déplacement du topic.

Etant donné qu'une fois la réponse activée le topic sera verrouillé, il peut être préférable de ne pas afficher cette option dans le cas où le topic est déjà verrouillé. Il suffit pour cela de mettre une condition en jouant sur la valeur du champ topic_locked


Traitement du message



Pour cette partie on va reprendre la page postok.php et ajouter une dernière option à notre switch.
Si vous regardez la cible du formulaire qui se trouve plus haut, vous voyez que je l'ai appelé autorep. Par ailleurs, ce formulaire renvoie l'id du message à afficher sous le sobre nom de rep.

A partir de là il suffit de faire une requête pour récupérer le texte en question et l'afficher comme s'il s'agissait d'un vrai message. Puis avant de terminer il faudra veiller à fermer le sujet.

Bref, beaucoup de copie de code déjà vu et un peu de nouveautés :) .

Début du script



Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
case "autorep":
$topic = (int) $_GET['t'];
$query=$db->prepare('SELECT forum_topic.forum_id, auth_modo
FROM forum_topic
LEFT JOIN forum_forum ON forum_forum.forum_id = forum_topic.forum_id
WHERE topic_id = :topic');
$query->bindValue(':topic',$topic,PDO::PARAM_INT);
$query->execute();
$data=$query->fetch();
$forum=$data['forum_id'];
if (!verif_auth($data['auth_modo']))
{
    erreur(ERR_AUTH_MODO);
}
$query->CloseCursor();
?>


Comme habituellement (je vous renvoie au TP sur la modération si ça ne vous rappelle vraiment rien) on fait une vérification sur les droits du membre, on récupère des infos sur le topic et puis on commence.

Récupération du message




Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$rep = (int) $_POST['rep'];
$query=$db->prepare('SELECT automess_mess FROM forum_automess 
WHERE automess_id = :rep');
$query->bindValue(':rep',$rep,PDO::PARAM_INT);
$query->execute();
$data = $query->fetch();
$message = $data['automess_mess'];
$query->CloseCursor();
?>


Rien de très compliqué ici, on récupère simplement des informations avant de commencer à lancer la machine ^^

Enregistrement du message



Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
$query=$db->prepare('INSERT INTO forum_post
(post_createur, post_texte, post_time, topic_id, post_forum_id)
VALUES(:id,:mess,:temps,:topic,:forum)');
$query->bindValue(':id', $id, PDO::PARAM_INT);   
$query->bindValue(':mess', $message, PDO::PARAM_STR);  
$query->bindValue(':temps', time(), PDO::PARAM_INT);  
$query->bindValue(':topic', $topic, PDO::PARAM_INT);   
$query->bindValue(':forum', $forum, PDO::PARAM_INT); 
$query->execute();

$nouveaupost = $db->lastInsertId();
$query->CloseCursor(); 

//On change un peu la table forum_topic
$query=$db->prepare('UPDATE forum_topic SET topic_post = topic_post + 1, topic_last_post = :nouveaupost WHERE topic_id =:topic');
$query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);   
$query->bindValue(':topic', (int) $topic, PDO::PARAM_INT); 
$query->execute();
$query->CloseCursor(); 

//Puis même combat sur les 2 autres tables
$query=$db->prepare('UPDATE forum_forum SET forum_post = forum_post + 1 , forum_last_post_id = :nouveaupost WHERE forum_id = :forum');
$query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);   
$query->bindValue(':forum', (int) $forum, PDO::PARAM_INT); 
$query->execute();
$query->CloseCursor(); 

$query=$db->prepare('UPDATE forum_membres SET membre_post = membre_post + 1 WHERE membre_id = :id');
$query->bindValue(':id', $id, PDO::PARAM_INT); 
$query->execute();
$query->CloseCursor(); 

?>


Ce code est exactement le même que celui qui se trouvait dans la partie traitant des réponses. On enregistre le message, on met à jour le forum et le profil du membre (oui une réponse automatique reste une réponse et donc augmente de 1 le nombre de posts d'un modo ^^ ).

On verrouille et c'est gagné !



Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?
$query=$db->prepare('UPDATE forum_topic
SET topic_locked = :lock
WHERE topic_id = :topic');
$query->bindValue(':lock','1',PDO::PARAM_STR);
$query->bindValue(':topic',$topic,PDO::PARAM_INT);
$query->execute();
$query->CloseCursor();

echo '<p>La réponse automatique a bien été envoyée ! <br />
Cliquez <a href="./voirtopic.php?t='.$topic.'">ici</a>
pour revenir au topic<br />
Cliquez <a href="./index.php">ici</a>
pour revenir à l index du forum</p>';

break;
?>


Et voilà le travail les amis :p Tout est maintenant en place pour que vos modérateurs ne se tracassent pas trop et puissent assouvir leur moindre désir de répression :diable: .
Voilà pour ce chapitre qui achève le tuto sur la création d'un forum. A partir de maintenant je pense que vous avez une bonne base pour commencer ;)

Avant qu'on se quitte j'aimerai revenir sur le système de messages automatiques et particulièrement sur leur création. J'ai vu sur un forum, dans le panneau d'admin une option qui permettait d'écrire directement les messages et de les enregistrer dans la base de données ce qui évite du coup d'avoir à le faire manuellement en prenant compte le parsage etc...

Si ça vous intéresse je ne pense pas que ça pose de problème de difficulté ou autre donc je vous conseille de faire ça :)
Chapitre précédent Sommaire Chapitre suivant

Partager

29 commentaires pour "Et encore trois autres"
Note moyenne : 3.61 / 4 (348 votes)
Pseudo Commentaire
Hors ligne nicolasc76 # Posté le 07/05/2010 à 11:54:16

Salut,

Tout d'abord, un grand merci. Excellent tuto, grâce auquel j'apprends énormément.

Quelque chose me semble tout de même étrange :

Code : PHP
1
2
3
$deja_ami = mysql_result(mysql_query("SELECT COUNT(*) AS nbr FROM forum_amis 
WHERE ami_from = '".intval($_SESSION['id'])."' AND ami_to = '".$data['membre_id']."'
OR ami_from = '".intval($_SESSION['id'])."' AND ami_to = '".$data['membre_id']."'"),0);


Ça ne devrait pas plutôt être :

Code : PHP
1
2
3
$deja_ami = mysql_result(mysql_query("SELECT COUNT(*) AS nbr FROM forum_amis 
WHERE ami_from = '".intval($_SESSION['id'])."' AND ami_to = '".$data['membre_id']."'
OR ami_from = '".$data['membre_id']."' AND ami_to = '".intval($_SESSION['id'])."'"),0);


?

Car comme ça, je comprends que test deux fois la même chose o_O.

Ce code est dans la section "Ajouter un ami".

Voilà,

Encore merci,

N.
Hors ligne mom936 # Posté le 10/05/2010 à 19:18:07
Al-Khawarizmi
Avatar

Ville : Aulnay sous bois
Pays : France métropolitaine
Études : Lycée Louis-le-Grand - Paris 5ème

Pas mal, sinon pour la liste des membres pourquoi ne pas juste regarder les membres dont la dernière visite est supérieure à time() - 300. ça évite de créer une table et ça marche beaucoup mieux !

REMBOURSE TON FORFAITCitation
  • La langue glisse plus souvent que le pied.
  • Affirmer ne pas avoir de prétention, n'est-ce pas là la plus grande des prétentions ?

 
Hors ligne sisy60 # Posté le 28/07/2010 à 11:19:38

Super tuto, je l'ai déjà commencer, et en survolant le tout j'ai juste aperçu un petit oubli :
Citation
Vous pouvez également stocker les messages sur un fichier php à part ce qui peut être plus facile pour les écrire.
Dans tous les cas il faut tenir compte du parsage, comme sur ce tuto, les messages sont parsés à l'affichage, il faudra les écrire comme si vous faisiez un post (donc en utilisant le bbcode/zcode etc... :-°
<= la parenthèse ;)
Mais sinon, super tuto, simple et clair, 20/20
Hors ligne eric64 # Posté le 28/02/2011 à 10:51:57
Avatar

Bonjour a tous un super tuto mes je me trouve devant un petit problème avec la liste des membres pour membre_derniere_visite la date ne s'affiche pas et je nais pas de code d'erreur si quelqu'un peu me dire le pour quoi merci d'avance
voila ma note pour ce superbe tuto 19/20

Merci d'avance ;)
 
Hors ligne aaaarto # Posté le 05/11/2011 à 17:41:15

Bonjour à tous les Zero !
Alors moi je me pose une question quand même, concernant la table d'amis.
Comment va-t-on faire quand Mr From ou Mr To vont vouloir ajouter un 2eme ami alors qu'ils existe déjà dans un champ en primary key ?
Ne faudrait-il pas rajouter un champ ID basique avec AI en PRIMARY et laisser tranquille Mr From et Mr To ?
Sinon on va droit vers l'erreur duplicate entry for Key PRIMARY, me trompe-je ?

EDIT :
Mea culpa : les ID sont 'light" et il y a 2 primary key

Voir tous les commentaires