Salut à tous,
Je viens chercher un peu d'aide (en fait surtout des avis/idées) à propos d'un set de class utilisé dans mon FW.
j'ai donc des classes me permettant de réaliser des formulaires de la manière suivante :
Tous marche très bien , et j'aimerais aller un peu plus loin avec mes éléments de formulaire en faisant par exemple un type "date" intégrant un datepicker en JS. Le but de la manoeuvre étant d'avoir quelques chose de très souple me permettant dans un projet d'avoir un datepicker jquery puis dans un autre un truc différents en mootools par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $form = new Form_Form('nom_du_form'); $form->setMethod('post'); $form->add('type_input','nom_input')->value(5)->id('test'); echo $form
Je m'interroge donc sur la meilleure façon de venir insérer ce Javascript.
Voici en simplifier comment ça marche :
Une classe Form , qui sert de "factory" pour les différents éléments :
La méthode _toString de l'objet permet d'afficher la totalité du formulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 class Form_Form { //... public function add($type,$nom) { if(!isset($this->champs[$nom])) { $classChamps = 'Form_Element_'.$type; $oChamps = new $classChamps($nom,$this); if($type !='Html') { if($type=='Submit') $this->champs_submit[$nom] = $oChamps; elseif($type == 'Hidden') $this->champs_hidden[$nom] = $oChamps; $this->champs[$nom] = $oChamps; } else $this->champs[$nom.uniqid()] = $oChamps; return $oChamps; } else throw new UnexpectedValueException('Un champs avec le nom '.$nom.' existe déjà dans '.$this->uniqid); } public function __toString() { $form = ''; $form = '<form>'; foreach($this->champs as $input) { $form .= $input->__toString(); } $form.= '</form>'; $form.= '<script type="text/javascript">'; //générer ici tous le js relatifs aux inputs $form.= '</script>' } }
Dans le premier exemple l'argument 'type_input' correspond dont à une classe représentant un élément de formulaire. Exemple avec un input text :
Chaque classe "element" dérive de Form_Field (ici form_input, mais elle dérive elle même de form_field) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 class Form_Element_Text extends Form_Input { protected $minLength; public function __construct($nom,$form) { parent::__construct($nom,$form); if(!isset($this->attrs['type'])) $this->setAttributes('type','text'); $this->minLength = 0; } public function minLength($taille) { if(ctype_digit((string)$taille) && $taille>=0) $this->minLength = $taille; return $this; } public function isValid($value) { if(parent::isValid($value)) { if(!$this->required && empty($value)) return true; if(!$this->minLength == 0) $carac = $this->minLength -1; else return true; if(isset($value[$carac])) return true; else $this->errorMsg = Form_Error::TOOSHORT.$this->minLength; } return false; } public function __toString() { $css = $this->cssClass(); $label = ''; if(!empty($this->label)) { $label = "\t".'<label for="'.$this->attrs['id'].'" class="'.$this->cssLabel.'">'.$this->label.'</label>'."\n"; if($this->labelNewLine) $label.="\t".'<br />'."\n"; } $attributs = $this->attrsToString(); //Posted value ou value par défaut $value = $this->form->getPostedvalue($this->attrs['name']); if(empty($value)) $value = $this->value; $field = "\t".'<input '.$css.' value="'.htmlspecialchars($value).'" '.$attributs.' />'."\n"; return $label.$field; } }
Note : les classes ont été simplifiée pour aller à l'essentiel , ne vous formalisez pas si il y'a des chose pas très cohérente.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 abstract class Form_Field { protected $form; protected $label; protected $cssLabel; protected $value; protected $class; protected $attrs; protected $info; protected $imgInfo; protected $fieldNewLine; protected $labelNewLine; protected $required; protected $errorMsg; protected $errorClass; protected $validator; protected function __construct($nom,$form) { //Initialisation des propriété } public function value($txt='') { $this->value = $this->sanitizedValue($txt); return $this; } public function id($txt) { $this->attrs['id'] = $txt; return $this; } //Tout un tas de getter/setters abstract public function __toString(); }
Donc pour insérer du JS j'avais dans un premier temps penser déclarer un tableau $javascript dans la classe Form et remplir se tableau dans les class '_Element_' via un setter puisque chaque élément reçoit une instance du formulaire qui le construit.
Mais je suis pas convaincu et commence à me dire que le JS n'as pas grand chose à faire au millieu du code PHP qui va déclarer tout celà. D'autant plus que si le JS est un peu compliqué ça va vite devenir crado dans le code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $form->add('type_input','nom_input')->value(5)->id('test')->JS('$("#test").plugin()');
Qu'en pensez vous ? Des solutions élégantes au problèmes ?
Partager