TUTO PHP - PARSER DU BBCODE

PrimFX Boris ('PrimFX') Le 20 mars 2016

Maintenant que vous savez comment remplacer vos textarea par un éditeur WYSIWYG, voyons comment parser le BBCode généré par celui-ci !

Code du tuto:
  • nouveau_topic.php
<?php
if(isset($_GET['categorie'])) {
   $get_categorie = htmlspecialchars($_GET['categorie']);
   $categorie = $bdd->prepare('SELECT * FROM f_categories WHERE id = ?');
   $categorie->execute(array($get_categorie));
   $cat_exist = $categorie->rowCount();
   if($cat_exist == 1) {
      $categorie = $categorie->fetch();
      $categorie = $categorie['nom'];
      $souscategories = $bdd->prepare('SELECT * FROM f_souscategories WHERE id_categorie = ? ORDER BY nom');
      $souscategories->execute(array($get_categorie));
      if(isset($_SESSION['id'])) {
         if(isset($_POST['tsubmit'])) {
            if(isset($_POST['tsujet'],$_POST['tcontenu'])) {
               $sujet = htmlspecialchars($_POST['tsujet']);
               $contenu = htmlspecialchars($_POST['tcontenu']);
               $contenu = utf8_encode($contenu);
               $contenu = str_replace('','',$contenu);
               $contenu = utf8_decode($contenu);
               
               $souscategorie = htmlspecialchars($_POST['souscategorie']);
               $verify_sc = $bdd->prepare('SELECT id FROM f_souscategories WHERE id = ? AND id_categorie = ?');
               $verify_sc->execute(array($souscategorie,$get_categorie));
               $verify_sc = $verify_sc->rowCount();
               if($verify_sc == 1) {
                  if(!empty($sujet) AND !empty($contenu)) {
                     if(strlen($sujet) <= 70) {
                        if(isset($_POST['tmail'])) {
                           $notif_mail = 1;
                        } else {
                           $notif_mail = 0;
                        }
                        $ins = $bdd->prepare('INSERT INTO f_topics (id_createur, sujet, contenu, notif_createur, date_heure_creation) VALUES(?,?,?,?,NOW())');
                        $ins->execute(array($_SESSION['id'],$sujet,$contenu,$notif_mail));
                        
                        $lt = $bdd->query('SELECT id FROM f_topics ORDER BY id DESC LIMIT 0,1');
                        $lt = $lt->fetch();
                        $id_topic = $lt['id'];
                        $ins = $bdd->prepare('INSERT INTO f_topics_categories (id_topic, id_categorie, id_souscategorie) VALUES (?,?,?)');
                        $ins->execute(array($id_topic, $get_categorie, $souscategorie));
                     } else {
                        $terror = "Votre sujet ne peut pas dépasser 70 caractères";
                     }
                  } else {
                     $terror = "Veuillez compléter tous les champs";
                  }
               } else {
                  $terror = "Sous-catégorie invalide";
               }
            }
         }
      } else {
         $terror = "Veuillez vous connecter pour poster un nouveau topic";
      }
   } else {
      die('Catégorie invalide...');
   }
} else {
   die('Aucune catégorie définie...');
}

require('views/nouveau_topic.view.php');
?>
  • topic.php
<?php
require_once('jbbcode/Parser.php');
if(isset($_GET['titre'],$_GET['id']) AND !empty($_GET['titre']) AND !empty($_GET['id'])) {
   $get_titre = htmlspecialchars($_GET['titre']);
   $get_id = htmlspecialchars($_GET['id']);
   $titre_original = $bdd->prepare('SELECT sujet FROM f_topics WHERE id = ?');
   $titre_original->execute(array($get_id));
   $titre_original = $titre_original->fetch()['sujet'];
   $parser = new JBBCode\Parser();
   $parser->addCodeDefinitionSet(new JBBCode\DefaultCodeDefinitionSet());
   $parser->addBBCode("quote", '<blockquote>{param}</blockquote>');
   $parser->addBBCode("center", '<div align="center">{param}</div>');
   if($get_titre == url_custom_encode($titre_original)) {
      $topic = $bdd->prepare('SELECT * FROM f_topics WHERE id = ?');
      $topic->execute(array($get_id));
      $topic = $topic->fetch();
      if(isset($_POST['topic_reponse_submit'],$_POST['topic_reponse'])) {
         $reponse = htmlspecialchars($_POST['topic_reponse']);
         if(isset($_SESSION['id'])) {
            if(!empty($reponse)) {
               $ins = $bdd->prepare('INSERT INTO f_messages(id_topic,id_posteur,contenu,date_heure_post) VALUES (?,?,?,NOW())');
               $ins->execute(array($get_id,$_SESSION['id'],$reponse));
               $reponse_msg = "Votre réponse a bien été postée";
               unset($reponse);
            } else {
               $reponse_msg = "Votre réponse ne peut pas être vide !";
            }
         } else {
            $reponse_msg = "Veuillez vous connecter ou créer un compte pour poster une réponse";
         }
      }
      if(isset($_GET['page']) AND $_GET['page'] > 1) {
         $reponsesParPage = 6;
      } else {
         $reponsesParPage = 5;
      }
      $reponsesTotalesReq = $bdd->prepare('SELECT * FROM f_messages WHERE id_topic = ?');
      $reponsesTotalesReq->execute(array($get_id));
      $reponsesTotales = $reponsesTotalesReq->rowCount();
      $pagesTotales = ceil($reponsesTotales/$reponsesParPage);
      if(isset($_GET['page']) AND !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $pagesTotales) {
         $_GET['page'] = intval($_GET['page']);
         $pageCourante = $_GET['page'];
      } else {
         $pageCourante = 1;
      }
      $depart = ($pageCourante-1)*$reponsesParPage;
      $reponses = $bdd->prepare('SELECT * FROM f_messages WHERE id_topic = ? LIMIT '.$depart.','.$reponsesParPage);
      $reponses->execute(array($get_id));
   } else {
      die('Erreur: Le titre ne correspond pas à l\'id');
   }
   require('views/topic.view.php');
} else {
   die('Erreur...');
}
?>
  • views/topic.view.php
<table class="forum">
   <tr class="header">
      <th class="sub-info w10">Auteur</th>
      <th class="main center">Sujet: <?= $topic['sujet'] ?></th>
   </tr>
   <?php if($pageCourante == 1) { ?>
   <tr>
      <td><?= get_pseudo($topic['id_createur']) ?></td>
      <td>
         <?php
         $parser->parse($topic['contenu']);
         // Ou plutôt $parser->parse(nl2br($topic['contenu'])); afin de conserver les retours à la ligne !
         echo $parser->getAsHtml();
         ?>
      </td>
   </tr>
   <?php } ?>
   <?php while($r = $reponses->fetch()) { ?>
   <tr>
      <td><?= get_pseudo($r['id_posteur']) ?></td>
      <td><?= $r['contenu'] ?></td>
   </tr>
   <?php } ?>
</table>
<?php
  for($i=1;$i<=$pagesTotales;$i++) {
     if($i == $pageCourante) {
        echo $i.' ';
     } else {
        echo '<a href="topic.php?titre='.$get_titre.'&id='.$get_id.'&page='.$i.'">'.$i.'</a> ';
     }
  }
 ?>
<br />
<?php if(isset($_SESSION['id'])) { ?>
   <form method="POST">
      <textarea placeholder="Votre réponse" name="topic_reponse" style="width:80%"><?php if(isset($reponse)) { echo $reponse; } ?></textarea><br />
      <input type="submit" name="topic_reponse_submit" value="Poster ma réponse"></form>
   </form>
   <?php if(isset($reponse_msg)) { echo $reponse_msg; } ?>
<?php } else { ?>
   <p>Veuillez vous connecter ou créer un compte pour poster une réponse</p>
<?php } ?>

A propos de l'auteur

PrimFX
Boris ('PrimFX')

Je m'appelle Boris, j'ai 22 ans et je suis passionné d'informatique. Suite à mes études (Licence Informatique puis MSc Computer Science au Trinity College Dublin), je gère l'entreprise Single Quote co-fondée en 2019 et je profite de mon temps libre pour partager ma passion à travers des vidéos & articles 😃

Votre commentaire

Vous devez être connecté pour poster un commentaire. Se connecter ou Créer un compte

Commentaires 12

  • yorizon Le 12 novembre, à 20:19 (Édité le 12 novembre 2021 à 20:20) | Répondre

    Merci

  • bambotcha Le 24 octobre, à 04:50 (Édité le 24 octobre 2020 à 04:50) | Répondre

    Bonjour PrimFx, Merci beaucoup pour les tutos :-)

  • ouija Le 25 novembre, à 17:24 | Répondre

    Salut
    J'ai vraiment besoin d'aide
    Moi le retour a la ligne ne marche pas donc ...
    Aidez moi stp

  • DevInput Le 29 juin, à 10:41 | Répondre

    Salut PrimFx, je cherche comment faire comme toi pour que quand l'utilisateur n'est pas connecter il ne peut pas voir le code, mais mon texte est en bbcode avec une balise [code][/code], quand j'essaie de le parser en mettant du php tout s'affiche et le php ne se fait pas lire.
    Comment faire ?

  • Balatharas Le 11 avril, à 16:52 | Répondre

    Voilà le bout de code pour les points d'interrogation
    [code]<?php
    $var = utf8_encode($var);
    $var = str_replace('', '', $var);
    $var = utf8_decode($var);
    ?>[/code]

  • yvan Le 1 avril, à 21:27 | Répondre

    salut merci pour les tutos j'ai pu faire un petit tchat grace à toi mais j'ai repris la tuto sur créer un espace membre mais j'ai un problème au niveau de mon code .lorsque j'arrive au niveau de la connexion à la bd tous les code ne passe plus

  • quiqou55 Le 30 mars, à 17:25 | Répondre

    Bien comme tuto :)

    Juste une petite information si vous utilisez composer vous pouvez l'installer grace a cette ligne : composer require jbbcode/jbbcode ;)

  • Clouder Le 25 mars, à 20:07 | Répondre

    #PrimFX Oui d'accord, sa serait pour te faire du monde et aussi pour moi (pour mon autre site à la fois).
    Je ferais des tutos vraiment basiques pour que les gens aimes venir sans se casser la tête ! :D

    Je te met le lien vers l'une de mes vidéos et pas de critique, je commence. Si tu peux si tu veux. :p

    Lien : https://www.youtube.com/watch?v=lWezYgBwmQk

  • PrimFX Le 25 mars, à 15:12 | Répondre

    @Clouder Ah d'accord :p Ça marche, ben je verrai quand ta série sera terminée, histoire de peut-être tout regrouper en un seul article, ou bien en faire un topic sur le forum, comme ça tu pourras directement répondre aux questions, etc. à voir ;-)

  • Clouder Le 22 mars, à 16:09 | Répondre

    @PrimFX Salut, :)

    Je voulais plutôt dire que 'moi' je commence à faire des vidéos pour faire un site de A à Z. (J'en ai déjà posté 3) et si tu voulais les mettre en plus sur ton site si tu souhaites ^^.

    Je partirais pour faire un simple site (style : réseau sociale) avec un peu de tout. :)

    Voila ^^ Dis moi quoi :p

  • PrimFX Le 22 mars, à 15:08 | Répondre

    @Clouder Salut ! Etant donner que créer un site de A à Z en mêlant HTML, CSS et PHP est très long, je pense plutôt faire de petits cas pratiques pour chaque langage, tu as l'exemple du forum en PHP. Je montrerai peut-être comment faire certains trucs en CSS, puis en JS, etc. Mais un site complet avec tous les langages prendrait trop de temps à expliquer en tuto :p

  • Clouder Le 21 mars, à 15:54 | Répondre

    Salut @PrimFX :)

    Dit j'ai commencé à faire des tutoriels en PHP, HTML pour faire un site de A à Z, par la suite il y aura aussi après avoir montrer les bases en PHP, des tutoriels en CSS de A à Z à partir de la structure des tutoriels en PHP, HTML.

    J'aurais aimé savoir si sa te tente de les poster sur ton site. :)

    Voila voila. :D