Page 1 sur 2
Pb d'affichage de news saisie dans un formulaire
Posté : 17 déc. 2006, 12:20
par jay64
Bonjour à tous !
J'ai d'une part un formulaire dans lequel un utilisateur va saisir une news. Ces paragraphes devront pouvoir être mis en forme à la manière d'une forum phpbb (utlisation de balises simples, de retours à la ligne, et d'intégration d'URL).
Je fais donc saisir à mon utilisateur des balises telles qu'on les connait.
La news est ensuite stockée dans une variable de type Varchar (1000) et enregistrée dans ma BDD.
Le problème, c'est qu'ensuite, dans la page qui m'affiche les news, je fais un simple
<?php echo $VariableNews ; ?>
et le problème, c'est qu'à l'affichage, au lieu que mes balises soient traduites, elles sont simplement affichées entre crochet. Vous voyez ce que je veux dire ?
Ma question est donc double :
Comment faire pour faire un formulaire de saisie de news adapté (en proposant les boutons de mise en forme tels qu'ici sur ce forum) et comment faire pour qu'ensuite, cela soit correctement interprété à l'affichage?
Merci les copains !!!
NB: j'ai fait des recherches sur le BBCODE mais je n'ai rien de trouver de concret permettant de me faire avancer !
Posté : 17 déc. 2006, 12:32
par mere-teresa
Pour résoudre ton problème d'affichage, penche toi sur la fonction str_replace() ou bien tu vas devoir tâter des expressions régulières.
Pour la saisie intuitive, FCKEditor ou TinyMCE (fouille le forum Javascript).
Posté : 17 déc. 2006, 13:58
par jay64
J'ai un peu de mal à capter comment gérer la fonction str_replace(). Peux-tu me donner un exemple concret qui à partir de ça :
$texte = "il est champion du [b]monde[/b]";
puisse me donner l'affichage souhaité.
Pour ce qui est des expressions régulières, ça a l'air encore plus chaud ... !
Merci
Posté : 17 déc. 2006, 16:43
par charabia
Posté : 18 déc. 2006, 13:13
par jay64
Oui, j'ai regardé la doc.
J'ai bien compris que cette fonction permet de remplacer des occurences par d'autres, mais mon problème consiste à savoir quoi mettre en remplacement de "[b]monde[/b]" par exemple.
Tout comme je ne sais pas comment indiquer des retours à la ligne.
Posté : 18 déc. 2006, 13:45
par winni
Fonction bbcode qui permet de déchiffrer le bbcode.
function bbcode($t)
// remplace les balises BBCode par des balises HTML
{
// gras
$t=str_replace("[b]", "<strong>", $t);
$t=str_replace("[/b]", "</strong>", $t);
// italique
$t=str_replace("[i]", "<em>", $t);
$t=str_replace("[/i]", "</em>", $t);
// soulignement
$t=str_replace("[u]", "<u>", $t);
$t=str_replace("[/u]", "</u>", $t);
$t=str_replace("[/color]", "</span>", $t);
$regCouleur="\[color= ?(([[:alpha:]]+)|(#[[:digit:][:alpha:]]{6})) ?\]";
$t=ereg_replace($regCouleur, "<span style=\"color: \\1\">", $t);
// lien
$regLienSimple="\[url\] ?([^\[]*) ?\[/url\]";
$regLienEtendu="\[url ?=([^\[]*) ?] ?([^]]*) ?\[/url\]";
if (ereg($regLienSimple, $t)) $t=ereg_replace($regLienSimple, "<a href=\"\\1\" target=\"_blank\"><span class=\"blue\">\\1</span></a>", $t);
else $t=ereg_replace($regLienEtendu, "<a href=\"\\1\" target=\"_blank\"><span class=\"blue\">\\2</span></a>", $t);
// image
$regImage="\[img\] ?([^\[]*) ?\[/img\]";
$regImageAlternatif="\[img ?= ?([^\[]*) ?\]";
if (ereg($regImage, $t)) $t=ereg_replace($regImage, "<img src=\"\\1\" alt=\"\" border=\"0\" />", $t);
else $t=ereg_replace($regImageAlternatif, "<img src=\"\\1\" alt=\"\" border=\"0\" />", $t);
return $t;
}
Et a l'affichage :
<?php echo bbcode($Variable); ?>
Adapte le suivant tes besoins.
Posté : 18 déc. 2006, 15:08
par jay64
Merci, c'est excatement ce qu'il me faut !
Par contre, comment gérer les retours à la ligne ?
Merci !
Posté : 18 déc. 2006, 15:22
par Ryle
Tu pourrais bien sur envisager de réaliser une fonction qui remplacerait les "\n" et "\r\n" correspondant aux retours charriot saisis dans un champ texte par des <br /> lors de l'affichage, mais puisqu'il existe une fonction nommée nl2br() qui fait ça très bien, ce serait dommage de ne pas en profiter

Posté : 18 déc. 2006, 15:28
par jay64
Yes !
Et puis-je combiner la fonction nl2br() avec la fonction bbcode() créée précédemment ?
Posté : 18 déc. 2006, 15:36
par Ryle
bah oui
Il te suffit de l'appeler avant, après, pendant, quand tu veux en fait... testes la donc en différents endroits et voit ce qui est le plus pratique pour toi

Posté : 19 déc. 2006, 23:02
par jay64
Bon, je progresse ... !
Cependant, j'avais avant la fonction htmlentities() qui me gardait les caractères spéciaux tels que les lettres accentuées.
Depuis que j'utilise la fonction bbcode(), je n'ai plus les lettres accentuées conservées.
Puis-je combiner ces deux choses ou intégrer le htmlentities dans la fonction bbcode() ?
Merci !
Posté : 19 déc. 2006, 23:22
par winni
Combine

Posté : 20 déc. 2006, 16:09
par jay64
en fait, le problème que je rencontre, c'est qu'en écrivant ceci :
<?php echo htmlentities(bbcode($ligne_News1['DetailNews'])); ?>
J'ai bien les lettres accentuées qui appraissent mais cette fois-ci c'est la fonction bbcode qui n'agit plus.
Je m'y prends mal pour combiner ces deux fonctions ?
Posté : 20 déc. 2006, 16:32
par winni
Montre moi ton code d'insertion stp.
Posté : 20 déc. 2006, 16:38
par jay64
Voici ma fonction bbcode :
function bbcode($t)
// remplace les balises BBCode par des balises HTML
{
// gras
$t=str_replace("[b:4aca2fe980]", "<strong>", $t);
$t=str_replace("[/b:4aca2fe980]", "</strong>", $t);
// italique
$t=str_replace("[i:4aca2fe980]", "<em>", $t);
$t=str_replace("[/i:4aca2fe980]", "</em>", $t);
// soulignement
$t=str_replace("[u:4aca2fe980]", "<u>", $t);
$t=str_replace("[/u:4aca2fe980]", "</u>", $t);
$t=str_replace("[/color]", "</span>", $t);
$regCouleur="\[color= ?(([[:alpha:]]+)|(#[[:digit:][:alpha:]]{6})) ?\]";
$t=ereg_replace($regCouleur, "<span style=\"color: \\1\">", $t);
// lien
$regLienSimple="\[url\] ?([^\[]*) ?\[/url\]";
$regLienEtendu="\[url ?=([^\[]*) ?] ?([^]]*) ?\[/url\]";
if (ereg($regLienSimple, $t)) $t=ereg_replace($regLienSimple, "<a href=\"\\1\" target=\"_blank\"><span class=\"blue\">\\1</span></a>", $t);
else $t=ereg_replace($regLienEtendu, "<a href=\"\\1\" target=\"_blank\"><span class=\"blue\">\\2</span></a>", $t);
// image
$regImage="\[img\] ?([^\[]*) ?\[/img\]";
$regImageAlternatif="\[img ?= ?([^\[]*) ?\]";
if (ereg($regImage, $t)) $t=ereg_replace($regImage, "<img src=\"\\1\" alt=\"\" border=\"0\" />", $t);
else $t=ereg_replace($regImageAlternatif, "<img src=\"\\1\" alt=\"\" border=\"0\" />", $t);
return $t;
}
?>
Et le code d'insertion est le suivant (déjà cité plus haut) :
<?php echo htmlentities(bbcode($ligne_News1['DetailNews'])); ?>
Merci !