Click here or hit escape to close this.

FluxBB, topics et tags

Notice: this post is 7 years old, its content may be outdated.

Un papier programmation cette fois, de la vraie, du Php objet qui défrise de la queue de poney !

Introduction

Ce bout de code vient d’une proposition d’amélioration de mon forum de randonnée légère favoris ; afin de faciliter les recherches sur ce forum, un système de tags a été mis en place, par exemple un sujet traitant des matelas Therm-a-Rest Z-lite aura pour titre [Matelas] Therm-a-Rest Z-litre. Mais il faut ajouter ces tags à la main, suivant une norme établie, ce qui peut se révéler fastidieux, tant pour les utilisateurs pas encore habitués que pour les modérateurs qui doivent passer derrière pour faire le ménage et les corrections.

L’idée proposée est simple : ajouter, dans le formulaire de création/édition de sujet, des listes déroulantes contenant les tags utilisables pour normaliser le titre du sujet. Techniquement, puisque les deux listes sont ajoutées dans le formulaire, leurs valeurs seront postées en même temps que le reste du formulaire, et donc manipulables via $_POST. Marche à suivre détaillée.

Installation
Ce hack a été testé avec les versions suivantes :

  • FluxBB 1.2.22
  • Apache 2.2.14
  • Php 5.3.2
  • MySQL 5.1.41

L’installation d’un seul fichier est nécessaire, que vous pouvez télécharger ici. Extrayez le fichier tags.php dans votre répertoire /include/ ; si vous voulez le mettre ailleurs, c’est possible, il faudra juste le préciser un peu plus loin.

Maintenant, il y a deux fichiers qui doivent être un peu modifiés : /post.php et /edit.php qui gèrent respectivement la publication et l’édition des topics et posts.

edit.php

D’abord, on inclue les deux tags au début du sujet du topic. À la ligne 77, remplacez :

$subject = pun_trim($_POST['req_subject']);
$subject = pun_trim($_POST['tag1']." ".$_POST['tag2']." ".$_POST['req_subject']);

Puis on fournit la nouvelle version du titre. Ligne 209, remplacez :

echo pun_htmlspecialchars(isset($_POST['req_subject']) ? $_POST['req_subject'] : $cur_post['subject'])
echo pun_htmlspecialchars($subject)

Enfin, à la ligne 210, ajoutez juste avant

<label><br />
getSubject(false);
?&gt;

Ligne 2. : inclusion de la classe.
Si vous n’avez pas mis tags.php dans /include/, c’est ici qu’il faut le préciser.
Ligne 3. : on créé une instance de la classe
Ligne 4. : on récupère le titre du sujet.
Le paramètre false indique de ne pas afficher les tags dans le titre, modifiez-le en true si vous voulez les afficher.

post.php

Les modifications a effectuer pour [sp]post.php[/sp] sont très similaires à celles de [sp]edit.php[/sp] :

Ligne 86, modifier :

$subject = pun_trim($_POST['req_subject']);
$subject = pun_trim($_POST['tag1']." ".$_POST['tag2']." ".$_POST['req_subject']);

Ligne 492, ajouter :

getSubject(false);
?&gt;

Mêmes remarques que pour edit.php

Et voilà, c’est tout ! Cela devrait fonctionner 😉

Annexe : code source

Voici le code source tel qu’il est prévu pour le forum Randonner Léger.

Cette version ne propose que deux types de tags, mais il est tout-à-fait envisageable d’en ajouter d’autres. Elle fait aussi la distinction du forum ; dans le cas présent, les tags que j’appelle «types» ou «spécifiques» ne seront disponibles que dans le forum d’id 11. Les possibilités d’adaptation sont très nombreuses, n’hésitez pas à réutiliser ce code à votre guise, ça marche au GPLCe code est publié sous GNU General Public Licence : http://www.gnu.org/licenses/gpl-3.0.htmlhttp://www.april.org/files/groupes/trad-gpl/doc/GPLv3/www.rodage.org/gpl-3.0.fr.html 😉

J’ai essayé de commenter au mieux le code, cela me semble assez clair, si vous avez des questions sur le fonctionnement n’hésitez pas à les poser en mail ou commentaire.

forum_id = $forum_id;
		// id of specific forum
		$this-&gt;forum = 11;
	
		$this-&gt;subject = $subject;
	
		$this-&gt;tag['types'] = $tag1;
		$this-&gt;tag['tags'] = $tag2;
		
		// debug
		//echo "<!-- tags.php : ".$this-&gt;subject." - ".$this-&gt;tag['types']." - ".$this-&gt;tag['tags']." -->n";

		$this-&gt;types = array(	"[Achat]" ,
					"[Acheté]" ,
					"[Vente]" ,
					"[Vendu]" ,
					"[Don]",
					"[Donné]",
					"[Troc]",
					"[Troqué]",
					"[Bon Plan hors RL]");
	
		$this-&gt;tags = array(	"[Abri]",
					"[Alimentation]",
					"[Autre]",
					"[Bâtons]",
					"[Chaussures]",
					"[GPS]",
					"[Hamac]",
					"[Hygiène]",
					"[Lampe]",
					"[Liste prévisionnelle]",
					"[Matelas]",
					"[Matériaux]",
					"[Montre]",
					"[Photo]",
					"[Popote]",
					"[Questions multiples]",
					"[Réchaud]",
					"[Sac_à_dos]",
					"[Sac_de_couchage]",
					"[Sursac]",
					"[Tarp]",
					"[Tente]",
					"[Vêtements]");
		
		
		// showing lists
		$this-&gt;showTagsList();
	}

	/**
	 * Cleans given tag to display textonly version
	 * Delete [, ] and _
	 * 
	 * @param string $tag to clean
	 * @return cleaned tag
	 */

	function clean($tag)
	{
		// backup
		$tag_propre = $tag;
		// cleaning
		$tag_propre = str_replace("[","", $tag_propre);
		$tag_propre = str_replace("]","", $tag_propre);
		$tag_propre = str_replace("_"," ", $tag_propre);
		// returning
		return $tag_propre;
	}

	/**
	 * Show tags list.
	 * Dirty way due to the way of listing tags, have to double the foreach...
	 * Delete [, ] and _
	 * To avoid repetitions we clean the subject first, and add the tags again
	 * 
	 * @param string $subject the post's subject
	 * @param string $tag1 the first tag in the subject
	 * @param string $tag2 the second tag in the subject
	 */
	public function showTagsList()
	{
		// debug
		//echo "<!-- tags.php : ".$this-&gt;subject." - ".$this-&gt;tag['types']." - ".$this-&gt;tag['tags']." -->n";

		preg_match_all("([(.*?)])",$this-&gt;subject,$matches);
		
		// if there's no tags posted, try to get them from the subject
		if($this-&gt;tag['types'] == null)
			$this-&gt;tag['types'] = $matches[0][0];
		if($this-&gt;tag['tags'] == null)
			$this-&gt;tag['tags'] = $matches[0][1];
		
		// debug
		//echo "<!-- tags.php : ".$this-&gt;subject." - ".$this-&gt;tag['types']." - ".$this-&gt;tag['tags']." -->n";

		if($this-&gt;forum_id == $this-&gt;forum)
		{
			// select list for specific tags
			printf("n");
			$this-&gt;generatOptionTags($this-&gt;types,$this-&gt;tag['types']);
			printf("n");
		}
		
		printf("n");
		$this-&gt;generatOptionTags($this-&gt;tags,$this-&gt;tag['tags']);
		printf("n");
	}
	
	/**
	 * Generates the  list
	 * We check each tag in the list for the one used in the subject
	 * this one will be the default choice to be displayed.
	 * 
	 * @param string $list the list of tags to show
	 * @param string $test the tag already in use
	 */
	private function generatOptionTags($list,$test)
	{
		printf("----n");
		
		foreach($list as $element)
		{
			// not always needed, depending on character encoding used to edit this file
			// I use UTF8 and need this to avoid getting ugly accent...
			// won't be of any use if you're not using accents, anyway.
			$element = utf8_decode($element);
			// getting a clean name for display
			$clean_element = $this-&gt;clean($element);
			// debug
			//echo "<!-- $test ?= $element -->";
			// printing tag
			printf("".$clean_element."n");
		}
	}
	
	/**
	 * Simple accessaccessor
	 * 
	 * @param boolean $show_tags do we show the tags in the subject?
	 * @return the post's subject, with or without tags, default with.
	 */
	public function getSubject($show_tags)
	{
		if($show_tags)
			return $this-&gt;subject;
		else if(!$show_tags)
			return $this-&gt;subject = trim(preg_replace("([(.*?)])", "$2", $this-&gt;subject));
		else
			return $this-&gt;subject;
	}
}
?&gt;