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 :

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
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.

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 :
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>'
	}
}
La méthode _toString de l'objet permet d'afficher la totalité du formulaire.

Dans le premier exemple l'argument 'type_input' correspond dont à une classe représentant un élément de formulaire. Exemple avec un input text :

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;
	}
}
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
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();
}
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.

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.
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()');
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.

Qu'en pensez vous ? Des solutions élégantes au problèmes ?