Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/04/2011, 13h05   #1
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 889
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 889
Points : 8 580
Points : 8 580
Par défaut Générateur de formulaires

Bonjour à tous.

Quand on utilise du MVC, on a souvent besoin de helpers pour se simplifier la vie. Générer un formulaire et permettre son remplissage avec plusieurs jeux de données (un objet modèle et des paramètres de requête par exemple) devient vite un casse-tête. A cet effet, j'ai créé un ensemble de classe destinées à générer et à manipuler un formulaire XHTML.

Un exemple vaut plus qu'un long discours:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$form = new FormHelper();
 
$form->addFieldset("Section A")
     ->addLine('test1')
     ->addLine('test2', 'test 2', 'radio-group', array('a' => 1, 'b' => 2, 'c' => 3))
     ->addLine('test3', 'test 3', 'textarea', 'POK');
 
$form->addFieldset("Section B")
     ->addLine('test4', 'test 4', 'select', array('a' => 1, 'b' => 2, 'c' => 3))
     ->addLine('test5', 'test 5', 'checkbox-group', array('a' => 1, 'b' => 2, 'c' => 3))
     ->addLine('test6', 'test 6', 'file');
 
$form->appendChild(InputHelper::export('save', 'submit', 'save'));
$form->autoFill(array(
    'test1' => "Un texte quelconque",
    'test2' => 2,
    'test3' => "Lorem ipsum sit amet ....",
    'test4' => 2,
    'test5' => 2,
));
 
echo $form;
Va générer:


Il est possible de créer / manipuler n'importe quel élément de formulaire de manière atomique au travers des classes suivantes:
- CheckboxGroupHelper.class.php
- FieldsetHelper.class.php
- FormHelper.class.php
- FormLine.class.php
- InputHelper.class.php
- LabelHelper.class.php
- OptionHelper.class.php
- RadioGroupHelper.class.php
- SelectHelper.class.php
- TextareaHelper.class.php
Ces classes sont dans le package joint à ce post.

L'avantage marteau de cette structure est la possibilité de remplir automatiquement un formulaire ou un fieldset avec des données en provenance d'un tableau ou d'un objet (Model dans mon cas qui est la classe de base de mes modèles.)

La plupart des méthodes des objets helpers renvoient leur référence de sorte à pouvoir faire du chainage.
Exemple:
Code :
1
2
3
4
5
6
 
echo FomHelper::export('index.php')
  ->appendChild(FieldsetElement::export('légende'))
  ->appendChild(FormLine::export('test', 'Un Test'))
  ->getInput()
  ->setId('un_id');
Va créer un formulaire puis y mettre un fieldset puis y mettre une nouvelle ligne puis obtenir l'input pour changer son ID.

Si ça intéresse du monde, je suis disposé à documenter ces classes et fournir un manuel

Merci de ne pas venir hurler que ça existe déjà dans la plupart des frameworks actuels et que j'ai réinventé la roue, j'en suis conscient. J'avais simplement besoin d'une structure simple et implémentable immédiatement.

-- Edit

Vous trouverez la documentation DoxyGen jointe à ce post.
Images attachées
Type de fichier : jpg form.jpg (76,4 Ko, 101 affichages)
Fichiers attachés
Type de fichier : rar form_helpers_docu.part1.rar (256,0 Ko, 17 affichages)
Type de fichier : rar form_helpers_docu.part2.rar (116,2 Ko, 12 affichages)
Type de fichier : zip form_helpers.zip (9,5 Ko, 8 affichages)
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 09h13   #2
ArKam
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 525
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mars 2007
Messages : 525
Points : 577
Points : 577
Moi je suis intéressé par de la documentation sur cette classe.

Et sinon, bien joué ;-)

Code clair, net et précis :-D
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 09h32   #3
grunk
Modérateur
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 2 497
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 28
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 2 497
Points : 5 209
Points : 5 209
Si je puis me permettre une petite critique , il manque un système simple de validation.
J'ai fait pour mon framework un outil similaire pour les formulaires et pouvoir spécifier des validateur (même basique) pour chaque champs est un confort non négligeable.

Dans mon cas ça donne quelque chose comme ça :

Code :
1
2
 
$form->add('Text','phone')->label('Téléphone')->id('idinput')->addValidator('Digit');
Du coup au moment de la soumission du formulaire , on vérifie que le champs remplie bien les critère du validateur. Si ce n'est pas le cas on le ré affiche le formulaire avec un message.

J'ai pas regardé le code en détail , mais as tu prévu une solution pour simplement insérer de l'html dans ton formulaire ? Quand on travail avec des designer un peu fou , on se retrouve souvent obligé d'insérer de l'html au milieu du formulaire pour répondre à leur besoin ^^
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 10h47   #4
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 889
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 889
Points : 8 580
Points : 8 580
Citation:
J'ai pas regardé le code en détail , mais as tu prévu une solution pour simplement insérer de l'html dans ton formulaire ? Quand on travail avec des designer un peu fou , on se retrouve souvent obligé d'insérer de l'html au milieu du formulaire pour répondre à leur besoin ^^
Yes, BaseHelper::appendChild() peut prendre une instance qui surcharge __toString ou une chaine toute simple.

Citation:
Du coup au moment de la soumission du formulaire , on vérifie que le champs remplie bien les critère du validateur. Si ce n'est pas le cas on le ré affiche le formulaire avec un message.
Je n'ai pas encore résolu cette problématique car je n'ai pas encore décidé par quel moyen je vais conserver cet objet entre les pages... Pour le moment, j'implémente des validateurs JS, c'est plus sexy pour l'utilisateur final.

-- EDIT

@Grunk
J'aimerai beaucoup voir la façon dont tu as implémenté tes validateurs. D'apès l'exemple que tu as fourni, je suppose que ton form helper est un factory d'objet Validator. Je suis contre cette approche car, dans le MVC, ce sont les contrôleurs qui sont responsables de la validation et non les vues, ce n'est donc logiquement pas au form helper de les générer.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 11h08   #5
grunk
Modérateur
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 2 497
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 28
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 2 497
Points : 5 209
Points : 5 209
Citation:
Envoyé par Benjamin Delespierre Voir le message
@Grunk
J'aimerai beaucoup voir la façon dont tu as implémenté tes validateurs. D'apès l'exemple que tu as fourni, je suppose que ton form helper est un factory d'objet Validator. Je suis contre cette approche car, dans le MVC, ce sont les contrôleurs qui sont responsables de la validation et non les vues, ce n'est donc logiquement pas au form helper de les générer.
J'ai effectivement une factory de validateur. Je suis d'accord avec toi sur le fait que ca respecte pas le modèle MVC à la lettre , c'est juste plus pratique dans mon cas

Pour info tu peux voir un extrait du Fw avec form et validateur ici (zip 34ko)
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 11h38   #6
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 889
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 889
Points : 8 580
Points : 8 580
Merci Grunk, je vais jeter un oeil.

-- Edit

Au point ou tu en es dans tes classe tu aurais aussi bien fait d'étendre les classes de DOMElement (ce que j'ai fait pour un autre composant) c'est beaucoup plus flexible que la solution évoqué dans ce thread mais aussi plus contraignant.
Tes classes ressemblent aux miennes, à ce détail près qu'elles sont beaucoup plus spécialisées et donc plus sûres (et du même coup plus contraignantes).
Je vais documenter les miennes en Doxygen pour ArkAm, je reviens...
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 13h49   #7
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 889
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 889
Points : 8 580
Points : 8 580
Et voilà la doc (voir le premier post).
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 19h21   #8
ArKam
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 525
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mars 2007
Messages : 525
Points : 577
Points : 577
Merci bien m'sieur
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 19h13   #9
bagage13
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mai 2011
Messages : 3
Points : 3
Points : 3
Super ! Merci, je m'en vais la tester sur ce pas.
bagage13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 01h54   #10
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 889
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 889
Points : 8 580
Points : 8 580
La dernière version de cette librairie est disponible ici: http://code.google.com/p/php-axiom/
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/05/2011, 11h56   #11
bagage13
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mai 2011
Messages : 3
Points : 3
Points : 3
Citation:
Envoyé par Benjamin Delespierre Voir le message
La dernière version de cette librairie est disponible ici: http://code.google.com/p/php-axiom/
La fonction setId() n'existe pas, sinon il est pas mal ton helper !
bagage13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 13h01   #12
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 889
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 889
Points : 8 580
Points : 8 580
Pour setter un attribut (id compris) il suffit de faire:
Code :
1
2
3
4
 
$textarea = new TextAreaHelper('name', 'value');
$textarea->setId("id-textarea");
$textarea->setTitle('titre');
ça passe dans la méthode __call de BaseHelper.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 20h30   #13
bagage13
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mai 2011
Messages : 3
Points : 3
Points : 3
AHhh ok, merci !
bagage13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 22h43   #14
Doksuri
Membre Expert
 
Avatar de Doksuri
 
Tiger Scott
Développeur Web
Inscription : juin 2006
Messages : 1 289
Détails du profil
Informations personnelles :
Nom : Tiger Scott
Âge : 43

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juin 2006
Messages : 1 289
Points : 1 672
Points : 1 672
beau travail
petit detail (tellement petit que je suis surment passe a cote)... mais as-tu prevu la possibilite d'une valeur par default ? (je pense notamment aux checkbox/radio)
__________________
La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

N'oubliez pas le Le tag resolu.

Need_!
Doksuri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 09h48   #15
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 889
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 3 889
Points : 8 580
Points : 8 580
Non la plupart n'ont pas de valeur par défaut car l'attribut value n'est pas mandataire en XHTML. Il faut la mettre à la main ou remplir le formulaire avec une série de valeur comme spécifié dans l'exemple.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h39.


 
 
 
 
Partenaires

Hébergement Web