Djebel1 Nul professionnel | Bonjour, j'aurai besoin de vos avis sur un script.
Le contexte : Quelqu'un sur ce forum (qu'il me pardonne, je ne sais plus qui c'est) m'a expliqué dans un topic qu'il séparait le code php du code html généré, pour garder des scripts de programation propres et clairs. Je lui demande donc comment il fait, et il m'explique que par exemple, pour créer un formulaire il utilise une fonction PHP qui le génère, et hop ainsi, pas de html dans sa page PHP.
Bon, j'essaye de me mettre gentillement au PHP, et après tout, y a rien de mieux que de mettre les mains dans le cambouï. Donc je me suis dit que j'allais faire cette fameuse fonction générant des formulaires pour me mettre dans le bain.
La question :
J'ai l'impression de ne pas avoir abordé le problème de la bonne manière. En effet, pour générer mon formulaire avec ma fonction, il faut que j'assigne de nombreuses valeurs dans un tableau avec beaucoup de dimensions . Finalement, je trouve ça extrêmement peu pratique. Bref j'aimerais que vous me disiez ce que vous en pensez, et comment mieux aborder ce problème (soyez pas trop méchant svp, je me doute bien que c'est pas top et j'aimerai savoir comment faire mieux )
Trève de bavardages, passons au code !
N.B. : je ne me suis pas encore du tout préoccupé des <div> et autres joyeusetés nécessaires pour la mise en forme par la suite.
La fonction :
Code :
- <?php
- /*
- ** Function : form
- ** Input : STRING $action, STRING $form_id, ARRAY $fields, ARRAY $fieldset, STRING $method, STRING $enctype, STRING $accept_charset, STRING $accept
- ************************************************************************************
- Pour les fieldset :
- $fieldset [$x] : $x=numéro du fieldset
- $fieldset[$x]['id'] : id du fieldset ; facultatif
- $fieldset[$x]['legend'] : légende du fieldset ; <<<<obligatoire>>>>
- $fieldset[$x]['legend_id'] : id de la légende du fieldset ; facultatif
-
- Pour les champs :
- $fields[$x][$x2] : $x : numéro du fieldet - $x2 : numéro du champ au sein de ce fieldset
-
- Pour tous les champs :
- $fields[$x][$x2]['label'] : label du champ ; facultatif
- $fields[$x][$x2]['label_id'] : id du label du champ ; facultatif
- $fields[$x][$x2]['field_type'] : type du champ (password, text, radio, textarea, select ...) ; <<<<obligatoire>>>>
- $fields[$x][$x2]['field_id'] : id du champ ; <<<<obligatoire>>>>
- $fields[$x][$x2]['field_class'] : class du champ ; facultatif (la class 'form' est assignée si rien n'est spécifié)
- $fields[$x][$x2]['field_value'] : valeur par défaut du champ ; facultatif (sauf pour les champ de type boutons radio ou checkbox. Pour une selection multiple dans un champ select, placer toutes les valeurs des options qui doivent être sélectionnées)
- $fields[$x][$x3]['oth_attributes'] : permet de rajouter au champ des attributs non prévus par ce tableau $fields ; facultatif
-
- Pour les champs select :
- $fields[$x][$x2]['option'][$x3] ; $x3=numéro de l'option du select
- $fields[$x][$x2]['multiple'] : si différent de 0, le champ select accepte une selection multiple ; facultatif
- $fields[$x][$x2]['size'] : nombre d'options visibles ; facultatif
-
- Pour les boutons radio et les checkbox :
- $fields[$x][$x2]['title'] : rajoutera un titre permettant de regrouper l'ensemble des boutons radios ou checkbox qui doivent l'être. Ne mettre ce titre que pour le premier des boutons ; obligatoire pour les boutons radio ou checkbox
- $fields[$x][$x2]['title_id'] : id du titre ; facultatif
- $fields[$x][$x2]['field_name'] : les boutons radio ou checkbox liés entre eux doivent avoir le même nom. Spécifiez donc le même nom pour tous les champs qui doivent être liés (mais vous devez utilisez des id différents). Ce tableau peut être utilisé pour d'autres types de champ, même si cela n'a pas d'intéret
- $fields[$x][$x2]['checked'] : si différent de 0, ce bouton sera sélectionné ; facultatif
-
- Pour les champ de type <button> :
- $fields[$x][$x2]['button_content'] : conteneur du bouton (<button> button_content</button> ) ; obligatoire
- $fields[$x][$x2]['button_type'] : spécifie le type de bouton ; facultatif
- ************************************************************************************
- ** Output : aucun
- ** Description : génération d'un formulaire xhtml
- ** Creator : Fred
- ** Date : 28/09/2005
- */
- function form ($action, $form_id, $fields, $fieldset, $method='post', $enctype=null, $accept_charset=null, $accept=null)
- {
- //ouverture de la balise form
- echo '<form method="', $method, '" action="', $action, '" id="', $form_id, '"';
- //gestion des paramètres optionnels du form
- if ($enctype) echo ' enctype="', $enctype, '"';
- if ($accept_charset) echo ' accept_charset="', $accept_charset, '"';
- if ($accept) echo ' accept="', $accept, '"';
- //fermeture de la balise form
- echo '>', "\n";
- $x=0;
- //chaque fieldset du formulaire va être traité dans cette boucle
- while ($fields[$x])
- {
- echo "\t", '<fieldset class="form"'; //ouverture du fieldset
- if ($fieldset[$x]['id']) echo ' id="', $fieldset[$x]['id'], '"'; //ajout de l'id du fieldset s'il est défini
- echo '>', "\n"; //fermeture du fieldset
- if (!$fieldset[$x]['legend']) die ('<p class="alert">You must specify a legend</p>');
- echo "\t\t", '<legend class="form"'; //ouverture balise legend
- if ($fieldset[$x]['legend_id']) echo ' id="', $fieldset[$x]['legend_id'], '"';//si un id est défini pour la légende, on l'ajoute
- echo '>', $fieldset[$x]['legend'], '</legend>', "\n\n"; //fin de la balise legend
- $x2=0;
- //on va maintenant traiter les champs contenus dans ce fieldset
- while ($fields[$x][$x2])
- {
- if (!$fields[$x][$x2]['field_type']) die ('<p class="alert">You must specify the field type</p>');
- if (!$fields[$x][$x2]['field_id']) die ('<p class="alert">You must specify an ID for this field</p>');
- //s'il s'agit d'un bouton radio ou ckeckbox, il faut un titre à cet ensemble de bouton en plus du label de chaque bouton
- //il ne faut renseigner $fields[$x][$x2]['title'] que pour le premier bouton de la série, pour ne mettre qu'un seul titre à cet ensemble de bouton
- if ($fields[$x][$x2]['title'] and ($fields[$x][$x2]['field_type']=='radio' or $fields[$x][$x2]['field_type']=='checkbox') )
- {
- echo "\t\t", '<p class="radio_checkbox_title"';
- //si un id est définit pour le titre, il faut le placer
- if ($fields[$x][$x2]['title_id']) echo ' id="', $fields[$x][$x2]['title_id'], '"';
- //fin de la balise title
- echo '>', $fields[$x][$x2]['title'], '</p>', "\n";
- }
- //On place le label qui permet de mettre le focus sur le champ en cliquant sur son nom
- //on change la classe du label s'il s'agit d'un bouton radio/checkbox, ou non.
- if ($fields[$x][$x2]['label'])
- {
- echo "\t\t", '<label for="', $fields[$x][$x2]['field_id'], '"';
- if ($fields[$x][$x2]['field_type']=='radio' or $fields[$x][$x2]['field_type']=='checkbox')
- echo ' class="radio_checkbox_label"';
- else
- echo ' class="normal_label"';
- //on place l'id s'il y en a un de défini
- if ($fields[$x][$x2]['label_id']) echo ' id="', $fields[$x][$x2]['label_id'], '"';
- //on finit la balise label
- echo '>', $fields[$x][$x2]['label'], '</label>', "\n";
- }
- echo "\t\t";
- //on va traiter les textarea et les select, ils ont des parties communes faciles à caser
- if ($fields[$x][$x2]['field_type']=='textarea' or $fields[$x][$x2]['field_type']=='select')
- {
- //début de la balise du champ
- echo '<', $fields[$x][$x2]['field_type'], ' name="', $fields[$x][$x2]['field_id'], '" id="', $fields[$x][$x2]['field_id'], '"';
- //s'il n'y a pas de class de défini, on assigne la class 'form'
- if ($fields[$x][$x2]['field_class']) echo ' class="', $fields[$x][$x2]['field_class'], '"'; else echo ' class="form"';
- //['oth_attributes'] permet de caser tous les attributs de balise non prévus avec le tableau $fields
- if ($fields[$x][$x2]['oth_attributes']) echo ' ', $fields[$x][$x2]['oth_attributes'];
- //on ajuste la fin pour le textarea
- if ($fields[$x][$x2]['field_type']=='textarea')
- {
- echo '>', $fields[$x][$x2]['field_value'], '</textarea>', "\n";
- }
- //on ajuste la fin pour le select
- else
- {
- if ($fields[$x][$x2]['multiple']) echo ' multiple="multiple"';
- if ($fields[$x][$x2]['size']) echo ' size="', $fields[$x][$x2]['size'], '"';
- echo '>', "\n";
- $x3=0;
- //et on ajoute les options du select
- while ($fields[$x][$x2]['option'][$x3])
- {
- //début de la balise option
- echo "\t\t\t", '<option value="', $fields[$x][$x2]['option'][$x3], '"';
- //si la valeur par défaut du champ est égal à une des options, cette option doit être sélectionnée
- if ($fields[$x][$x2]['field_value']==$fields[$x][$x2]['option'][$x3]) echo ' selected="selected"';
- //dans le cas ou une multi-sélection est possible, la valeur par défaut du champ contient toutes les options qui doivent être sélectionnées
- elseif ($fields[$x][$x2]['multiple'] and !(strpos ($fields[$x][$x2]['field_value'], $fields[$x][$x2]['option'][$x3])===false) ) echo ' selected="selected"';
- //fermeture de la balise option
- echo '>', $fields[$x][$x2]['option'][$x3], '</option>', "\n";
- $x3++;
- }
- echo "\t\t", '</select>', "\n";
- if ($x3==0) die ('<p class="alert">You must specify some options for a select tag</p>');
- }
- }
- //gestion de la balise button
- elseif ($fields[$x][$x2]['field_type']=='button')
- {
- //on vérifie qu'il y a un contenu au bouton, sinon c'est inutile, autant prendre un <input type='button'>
- if (!$fields[$x][$x2]['button_content']) die ('If you dont need any content for <button>, you should use an input type button');
- //ouverture de la balise
- echo '<button name="', $fields[$x][$x2]['field_id'], '" id="', $fields[$x][$x2]['field_id'], '"';
- //s'il n'y a pas de class de défini, on assigne la class 'form'
- if ($fields[$x][$x2]['field_class']) echo ' class="', $fields[$x][$x2]['field_class'], '"'; else echo ' class="form"';
- //['oth_attributes'] permet de caser tous les attributs de balise non prévus avec le tableau $fields
- if ($fields[$x][$x2]['oth_attributes']) echo ' ', $fields[$x][$x2]['oth_attributes'];
- //spécification possible du type de bouton (submit, reset, push)
- if ($fields[$x][$x2]['button_type']) echo ' type="', $fields[$x][$x2]['button_type'], '"';
- //fermeture
- echo '>';
- echo $fields[$x][$x2]['button_content'], '</button>'; //classiquement pour le button_content : une image <src=... (ne pas oublier d'ajouter un alt pour l'accessibilité)
- }
- //on passe aux champs de type <input type= ...
- else
- {
- //s'il s'agit d'un bouton radio ou checkbox, le nom du champ doit resté identique pour plusieurs champs, contrairement à l'id.
- //S'il ne s'agit pas d'un bouton radio ou d'une checkbox, $name prendra la valeur de l'id et le gardera jusqu'à l'écriture de la balise.
- //s'il s'agit d'un bouton radio ou checkbox, $name sera modifié afin de garder le même nom pour les boutons radios ou checkbox reliés entre eux.
- $name=$fields[$x][$x2]['field_id'];
- //on doit faire des vérifs ici dans le cas de bouton radio ou checkbox, car on ne pourra pas afficher le message d'erreur en pleine balise
- if ($fields[$x][$x2]['field_type']=='radio' or $fields[$x][$x2]['field_type']=='checkbox')
- {
- //pour les boutons radios et checkbox, il faut forcément une valeur à chaque champ pour ensuite récupérer la paire nom/valeur du champ
- if (!$fields[$x][$x2]['field_value']) die ('<p class="alert">you must specify a value for a radio or checkbox button</p>');
- //de la même manière, il faut forcément spécifier un nom de champ s'il s'agit d'un bouton radio ou une checkbox
- if (!$fields[$x][$x2]['field_name'])
- die ('<p class="alert">you must specify an id AND an name for a radio or checkbox button</p>');
- else $name=$fields[$x][$x2]['field_name']; //modification de $name comme expliqué plus haut
- }
- //début de la balise.
- //rappel : s'il ne s'agit pas d'un bouton radio ou d'une checkbox, $name=$fields[$x][$x2]['field_id']. Sinon, $name=$fields[$x][$x2]['field_name']
- echo '<input type="', $fields[$x][$x2]['field_type'], '" name="', $name, '" id="', $fields[$x][$x2]['field_id'], '"';
- //s'il n'y a pas de class de défini, on assigne la class 'form'
- if ($fields[$x][$x2]['field_class']) echo ' class="', $fields[$x][$x2]['field_class'], '"'; else echo ' class="form"';
- //['oth_attributes'] permet de caser tous les attributs de balise non prévus avec le tableau $fields
- if ($fields[$x][$x2]['oth_attributes']) echo ' ', $fields[$x][$x2]['oth_attributes'];
- //affichage de la valeur du champ ; par sécurité on évitera d'afficher dans le source un mot de passe
- if ($fields[$x][$x2]['field_value'] and $fields[$x][$x2]['field_type']!='password') echo ' value="', $fields[$x][$x2]['field_value'], '"';
- //si ['checked'] est différent de 0, c'est qu'on veut sélectionner ce bouton par défaut (ne s'applique qu'aux boutons radios ou checkbox)
- if ($fields[$x][$x2]['checked'] and ($fields[$x][$x2]['field_type']=='radio' or $fields[$x][$x2]['field_type']=='checkbox') ) echo ' checked="checked"';
- echo ' />', "\n"; //fermeture de la balise
- }
- echo "\n";
- $x2++;
- }
- echo "\t", '</fieldset>', "\n\n"; //fermeture du fieldset
- $x++;
- }
- echo '</form>', "\n"; //fermeture du form
- }
- ?>
|
Un exemple d'utilisation bidon :
Code :
- <?php
- $fieldset[0]['legend']='le beau form';
- $fieldset[1]['legend']='le 2eme !!';
- $fields[0][0]['field_type']='textarea';
- $fields[0][0]['field_id']='test';
- $fields[0][0]['field_value']='blabla';
- $fields[0][0]['field_class']='form';
- $fields[0][0]['label']='joli';
- $fields[0][1]['field_type']='select';
- $fields[0][1]['field_id']='test2';
- $fields[0][1]['field_value']='choix 2 choix 3';
- $fields[0][1]['field_class']='form';
- $fields[0][1]['label']='joliiiii';
- $fields[0][1]['option'][0]='choix 1';
- $fields[0][1]['option'][1]='choix 2';
- $fields[0][1]['option'][2]='choix 3';
- $fields[0][1]['multiple']=1;
- $fields[1][0]['title']='choisissez';
- $fields[1][0]['field_type']='checkbox';
- $fields[1][0]['field_id']='test3';
- $fields[1][0]['field_name']='check';
- $fields[1][0]['field_value']=1;
- $fields[1][0]['field_class']='form';
- $fields[1][0]['label']='radio1';
- $fields[1][1]['field_type']='checkbox';
- $fields[1][1]['field_id']='test4';
- $fields[1][1]['field_name']='check';
- $fields[1][1]['field_value']=2;
- $fields[1][1]['field_class']='form';
- $fields[1][1]['checked']=1;
- $fields[1][1]['label']='radio2';
- $fields[1][2]['field_type']='submit';
- $fields[1][2]['field_id']='test5';
- $fields[1][2]['field_value']=submit;
- form ('test.php', 1, $fields, $fieldset);
- ?>
|
Et enfin, le code html généré :
Code :
- <form method="post" action="test.php" id="1">
- <fieldset class="form">
- <legend class="form">le beau form</legend>
- <label for="test" class="normal_label">joli</label>
- <textarea name="test" id="test" class="form">blabla</textarea>
- <label for="test2" class="normal_label">joliiiii</label>
- <select name="test2" id="test2" class="form" multiple="multiple">
- <option value="choix 1">choix 1</option>
- <option value="choix 2" selected="selected">choix 2</option>
- <option value="choix 3" selected="selected">choix 3</option>
- </select>
- </fieldset>
- <fieldset class="form">
- <legend class="form">le 2eme !!</legend>
- <p class="radio_checkbox_title">choisissez</p>
- <label for="test3" class="radio_checkbox_label">radio1</label>
- <input type="checkbox" name="check" id="test3" class="form" value="1" />
- <label for="test4" class="radio_checkbox_label">radio2</label>
- <input type="checkbox" name="check" id="test4" class="form" value="2" checked="checked" />
- <input type="submit" name="test5" id="test5" class="form" value="submit" />
- </fieldset>
- </form>
|
Voili voilou, j'attends vos conseils  Message édité par Djebel1 le 29-09-2005 à 05:35:08
|