8721 sujets

Développement web côté serveur, CMS

Bonjour,

je voudrais votre avis sur la technique que je souhaite mettre en place...

Sur un site qui propose des voitures d'occasion, je créé un formulaire de saisie standard avec des champs type=input pour les caractéristiques du véhicule.
Pour les options du véhicule, je créé une textarea dans laquelle l'utilisateur entre les options sous forme de texte libre, le volume du contenu de cette textarea étant variable.

Je voudrais transformer le contenu de cette zone en une liste à puces, mais il est hors de question de faire saisir des balises <ul> et <li> par l'utilisateur.

alors j'ai pensé à introduire un pseudo-code assez simple comme ceci


*$jante alu**lunette arrière dégivrante**climatisation**ordinateur de bord$*


dans lequel
*$ représente <ul><li>
** représente </li><li>
$* représente </li></ul>

dans mon formulaire, avant d'envoyer la requête d'insertion, j'execute le code suivant


$options = trim($_POST['options']);
$options = str_replace("*$","<ul><li>",$options);
$options = str_replace("**","</li><li>",$options);
$options = str_replace("$*","</li></ul>",$options);


bien sur je rajoute des test... etc, et je prévois la conversion inverse pour servir un formulaire de mise à jour.

que pensez vous de cette technique?
l'emploi du signe $ est il critique? l'avantage est qu'il est situé, comme le signe *, tout près de la touche Entrée du clavier.

merci
Moi pas comprendre l'intérêt ?

Pourquoi ne pas stocker en base uniquement tes options de véhicules séparés par des pipes ( symbole | ), virgules ou autre ? Que tu exploiteras ensuite où bon te semble l'information avec un explode en php ?

Que ce soit pour l'affichage ou pour la modification d'options existantes, tu pourras toujours les exploiter avec cette fonction.
Et lors de la saisie, tu demandes à ce que chaque option soit séparé d'une virgule.


Jante Alu 19, Climatisation automatique, Rétroviseurs rabattables électriquement


Ce qui donnera à l'affichage :

<?php
   $options = explode(',', $ton_info_de_bdd);
?>
   <ul>
<?php
   foreach($options as $UneOption):
        ?>
        <li><?php echo $UneOption; ?></li>
        <?php
   endforeach;
?>
   </ul>


Mais ensuite, faire confiance a ce que l'utilisateur tape est une grosse erreur.. Même inconsciemment et par erreur de frappe, la personne peut écrire ",," et pour le coup tu as une option en plus vide.
Modifié par Apoooo (28 Aug 2013 - 09:05)
merci Apooo pour ta réponse;

effectivement ta solution est bien plus simple, et je me doutais un peu que je n'étais pas le 1er à faire face à ce genre de problématique, c'est un peu pour ça que j'avais posé la question d'ailleurs et d'où l'intérêt de ce forum.

Je ne suis pas un spécialiste du PHP et je n'avais pas eu le réflexe de l'implode mais je vais faire comme tu dis, en plus ça m'évite de transformer ce que saisis l'utilisateur après la saisie, et avant une mise à jour..

Après, l'utilisateur, il faut l'éduquer aussi Smiley smile d'autant plus qu'après la saisie j'affiche un tableau récapitulatif de ce qui vient d'être saisi , donc l'utilisateur pourra voir si il a fait une erreur.

encore merci pour ton aide

(edit) juste une question, si l'utilisateur saisi avec des sauts de lignes comme ceci

becquet,
différentiel autobloquant,
jantes alu 17",
peinture opaque,
ordinateur de bord,
échappement inox

je suppose que ça peut se gérer aussi?
Modifié par lionel_css3 (28 Aug 2013 - 09:58)
Oui tu peux le faire avec les sauts de lignes (c'est un caractère comme un autre), dans ce cas même pas besoin de virgules.
jb_gfx a écrit :
Oui tu peux le faire avec les sauts de lignes (c'est un caractère comme un autre), dans ce cas même pas besoin de virgules.


en fait ce que je voulais dire c'est que j'avais peur que le saut de ligne soit inclus dans la <li> après l'explode mais apparemment ça n'influe pas, je viens de faire l'essai, le saut de ligne est ignoré semble t-il
Il est ignoré car le retour chariot d'un textarea n'est pas un "<br />" mais un caractère symbolisé par \r\n, \n\r, \n et \r il me semble. Donc quand tu utilises ce qui a été entré pour l'affichage, seul un <br /> fera un saut de ligne d'où le fait que tout reste sur la même ligne.

Donc comme le dit jb, tu peux utiliser simplement le retour chariot pour séparer les options. La virgule devient inutile Smiley cligne

EDIT : Pour comprendre la diff entre <br /> et les caractères, tu auras des infos sur cette fonction -> nl2br
Modifié par Apoooo (28 Aug 2013 - 10:40)
j'ai mis en place ma solution, ça marche super bien, juste un truc...que je comprends pas.
si le contenu du textarea $ma_chaine est vide, le code suivant


$options = explode(',', trim($ma_chaine));  
$total_li = count($options);  
echo "total= ".$total_li . "contenu =*" . $options[0] . "*";


affiche total= 1, contenu =** alors que je m'attendais à ce que le count() ne trouve rien étant donné que ma chaine est vide...

y a un truc qui m'échappe..... Smiley rolleyes
Tente un var_dump sur $total_li ^^ ça te permettra de savoir exactement à quoi il ressemble quand la chaîne est vide.
Oui, la chose qui t'échappe c'est le petit reflex d'aller sur la doc Smiley lol

count

Retourne le nombre d'éléments dans var. Si le paramètre var n'est ni un objet, ni un tableau, 1 sera retourné. Il y a néanmoins une exception : si le paramètre var vaut NULL, 0 sera retourné.
pour un textarea vide,

var_dump($options[0]) retourne string(0) ""
var_dump($total_li) retourne int(1)

mais si il n'y a qu'une ligne, var_dump($total_li) retournera aussi 1 aussi, et si la première virgule est précédée par rien var_dump($options[0]) retournera aussi "" alors je ne vois pas comment je peux détecter le cas dans lequel mon textarea est vide, ou alors je suis fatigué Smiley smile
bon vous m'avez bien aidé les gars..... Smiley smile

je teste les deux conditions if ($options[0] == "" && $total_li == 1): , et ça marche...

j'ai créé une fonction pour fabriquer 3 listes <ul> équitables en fonction du nombre (variables) d’éléments saisis dans le textarea, ça me permet de les mettre côte à côte dans la fiche véhicule.

j'ai pas trouvé plus simple comme fonction


// ------------------------------------------- 
//              fonction make3div  
// ------------------------------------------- 
function make3div($ma_chaine)  {

$options = explode(',', trim($ma_chaine));  
$total_li = count($options);  


$col_1 = ceil($total_li/3);
$col_2 = ceil(($total_li - $col_1)/2);
$col_3 = $total_li - ($col_1 + $col_2);
      
	   if ($options[0] == "" && $total_li == 1):
		echo '<ul><li>aucune option saisie</li></ul>';
		return; 
	   endif;
	   
	   if ($col_1 > 0):  
		echo '<ul class="first-options-ul">'; 
		for ($i =0; $i < $col_1; $i++) {  
		  echo '<li>- ' . trim($options[$i]) . '</li>';
		 }   
		echo '</ul>';
	   endif; 
	   if ($col_2 > 0):  
		echo '<ul>'; 
		 for ($j = $col_2; $j < ($col_1 + $col_2); $j++) {  
		 echo '<li>- ' . trim($options[$j]) . '</li>';
		 }   
		echo '</ul>';
	   endif; 
	   if ($col_3 > 0):  
		echo '<ul>'; 
		 for ($k = ($col_1 + $col_2); $k < $total_li; $k++) {  
		  echo '<li>- ' . trim($options[$k]) . '</li>';
		 }   
		echo '</ul>';
	   endif; 
	   
}


upload/40948-pin-2.jpg
jb_gfx a écrit :
if ( empty($options) ) Smiley langue


ça, ça marche ps... semble t-il

(edit) j'ai ajouté cette ligne

if (empty($options)) { echo "c est viiiiiiiiiide"; }

dans la fonction et je vois pas le message, par contre j'ai bien aucune option saisie affiché pour un texarea vide avec mon double test
Modifié par lionel_css3 (28 Aug 2013 - 17:27)
Bonsoir,

Je viens de tester avec :

echo var_dump(explode(',',''));


ET un tableau contenant une chaîne vide est retourné. Donc ce que vous constatez avec count = 1 est normal, de même que empty retournant false. ET c'est un comportement tout à fait logique d'explode, il n'y a rien d'illogique: pas de délimiteur, il y a donc une seule partie et cette partie, c'est toute la chaîne.
QuentinC a écrit :
Bonsoir,

Je viens de tester avec :

echo var_dump(explode(',',''));

ET un tableau contenant une chaîne vide est retourné. Donc ce que vous constatez avec count = 1 est normal, de même que empty retournant false. ET c'est un comportement tout à fait logique d'explode, il n'y a rien d'illogique: pas de délimiteur, il y a donc une seule partie et cette partie, c'est toute la chaîne.



donc mon test

if ($options[0] == "" && $total_li == 1):
		echo '<ul><li>aucune option saisie</li></ul>';
		return; 
endif;

est pertinent?
a écrit :
donc mon test est pertinent?

Probablement, oui. A voir ce que ça donne si la chaîne contient juste le délimiteur au lieu d'être vide...
Si tu ne test que l'indice 0 et que l'utilisateur entre ",mon option".
il te retournera qu'il n'a pas d'option que alors c'est faux. Seul l'indice 0 est empty.
ceci dit, c'est pas très critique.. juste après validation du formulaire, un tableau récapitulatif des champs apparaît avec le formatage en liste <ul> pour le textarea donc si il a fait une erreur, l'utilisateur le verra de suite (faut bien les responsabiliser un peu lol) et il pourra la corriger avec le formulaire de modification...

le cas ou ce textarea est vide est très peu probable...