Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
En regardant un peu les fichiers du ZF j'ai été un peu surpris de la structure de "Zend_Form".
J'ai remarqué que chaque éléments avait une class propre qui ne fait, dès fois, qu'initialiser un ou plusieurs variables :
class Zend_Form_Element_Button extends Zend_Form_Element_Submit { /** * Use formButton view helper by default * @var string */ public $helper = 'formButton'; }
D'autres font bcp plus que ça !
Donc ma petite question :
Pourquoi segmenter ainsi en plusieurs class ?
Quel en est l'avantage ?
Merci pour vos lumières.
Cordialement,
Kaimite
Dernière modification par Kaimite (09-12-2008 18:30:32)
Hors ligne
Image toi que les races de chiens n'existes pas et que tu n'es qu'une seule race : "le chien".
On appelle 'chien' à la fois un Rottweiler et un bauceron (ca se ressemble)
Imagine qu'on supprime la "catégorie", et qu'on appelle un tigre un mammifère et une loutre un mammifère.. (loutre et tigre son mammifère, pourtant rien à voir !)
Et pire, on appelle tout ce qui est vivant sur cette planète : animal..
Le but des classes est de savoir de quoi on parle
Zend_Form_Element -> ok, mais quel element ? Zend_Form_Element_Select -> la on comprend mieux
Chaque élément possède ses propriétés, mais également des propriétés en commun.
C'est pour ça que l'élément Zend_Form_Element_Button possède les même propriétés qu'un élément submit (car c'est ce qu'il est) mais possède se propre propriété 'formHelper'
Hors ligne
Je suis tout a fait d'accord avec toi sur le problème canin !
J'ai développé ma propre classe de formulaire et je peux bien sur ajouter différents champs :
$monFormulaire = new Kaimite_Formulaire("idFormulaire", "Action", "Methode"); $monFormulaire -> inputText("nom_champ", "Le Label "); $monFormulaire -> Textarea("corps", "Corps : "); $monFormulaire -> appliquerCSSType("CaseCocher", array("radio", "checkbox")); echo $monFormulaire -> renvoyerFormulaire();
Et je n'ai pas senti le besoin de faire une class par élément.
Pourtant j'utilise bien des méthodes communes à chaque élément du formulaire comme par exemple :
renvoyerLabel();
ou d'autres...
Si Zend l'a fait pour son framework c'est qu'il y a surement une bonne raison. Maintenance, organisation du code autre...
En gros pourquoi demander à une sous class spécifique de rajouter un élément dans mon formulaire au lieu de le faire directement dans la class globale ?
Le but est-il de bien séparer pour avoir des class "spécialisées" plutôt qu'une seule class globale
En gros séparer mon formulaire en différentes entités comme suit :
Formulaire - Elements - Input - Password - Textarea - Boutons - Submit - Reset - Select - Multiples - Radio - CheckBox - FieldSet - Legend
Merci pour ta réponse
Cordialement,
Kaimite
Hors ligne
Le ZF, de part toutes les options qu'il nous offre est pleins de propriétés.
Toi, tu utilises des objets sous forme de fonctions. Imagine s'il fallait migrer les classes en fonction ! Il faudrait leur passer 10 paramètres. ($monform->inputtext('nom champ', 'valeur', 'prefixrequired', 'id', 'class', 'decorateur', 'validateur', 'viewhelper',) (et j'en passe ! certains devraient être des tableaux !)
De plus, ca allongerait considérablement la classe Form et ca lecture deviendrait long, dure à maintenir.
Sans compter les propriétés de champs qui sont identiques et qu'il faudrait donc dupliquer entre différent type de champs, ..
Et sémantiquement :
$monformulaire->inputText();
$monformulaire->addElement($inputtext);
Je préfère le deuxième
Mais, si ton code te vas, vas y, fonce. Le ZF, c'est la liberté.
Hors ligne
Je ne dit pas que ma class est mieux... et je n'insinue pas que tu l'a dit ;-)
J'essaie de coder avec de meilleurs pratiques et comme j'aime bien comprendre avant de faire je pose la question.
Maintenant je comprends mieux. Un champ input n'est pas un formulaire mais un élément de formulaire il vaut donc mieux créer une class qui correspond à sa nature.
Cordialement,
Kaimite
Hors ligne
oui moi j'ai besoin d'un dateInput et d'un mailInput
avec une seule classe je la dérive et j'y ajoute les méthode qui vont me générer le dateInput et mailInput
mais du coup j'hérite d'une classe généraliste et pas de classe spécifique.
en héritant de textInput je n'ai que les spécificité de date et mail à ajouter le reste est hérité avec une classe plus générale il faut que je réimplémente ce qui devrait être hérité
maintenant j'ai besoin d'un periodInput qui est en fait un couple de dateInput sauf qu'il dépende l'un de l'autre
Un beginDateInput et endDateInput serait les bien venus
la encore si je n'ai qu'une classe il me faut reprendre tout ce qui existe alors qu'avec l'héritage je n'ai pas en m'en soucier.
en fait je pourrait très bien n'avoir qu'une classe et pleins de fonction mais pour pouvoir faire ça il me faut connaitre l'implémentation interne de la classe pour appeler les bon éléments et n'ajouter que mon code spécifique.
avec l'héritage je n'ai pas à savoir comment c'est fait, j'ai juste besoin de savoir que ça existe et comment l'utiliser.
en utilisant des classes et en dérivant efficacement voilà à quoi j'arrive
<?php $htmlDocument = new Document_Html('XHTML','Transitional'); $htmlDocument ->addNameSpace('fast', 'urn:org.jquery.fast') ->setNSAtrribute('fast','includepath', '/public/scripts/components/') ->setLanguage('fr') ->getHead() ->contentType() ->meta ('test', 'machin') ->title('coucou', array('class'=>'test')) ->addScript('/public/scripts/jquery-latest.js') ->addScript('/public/scripts/components/cascadingselect.js') ->linkStyle('/public/styles/default.css', 'screen') ->getDocument() ->getBody() ->aName('la','top') ->image('/truc/chose.gif', array('border'=>0), array('color'=>'#fff')) ->end() ->h2('Login') ->end() ->form('/mycontroler/myaction', 'POST') ->label('login','25')->end() ->inputText('form[login]','', array('id' => 25)) ->label('pass','26')->end() ->inputPassword('form[pass]','', array('id' => 26)) ->inputSubmit('form[ok]',1) ->inputReset() ->display(); ?>
A+JYT
Hors ligne
Moi je réponds simplement au titre "Interet de segmenter une class en plusieurs sous-class ?"
Il faut toujours bien pensé "Objet". Dans un programme, un entité qui n'est pas un type primitif (int, string, etc) est un objet et se code donc via une class. La base même de la POO, tout simplement j'ai envie de dire
Hors ligne
Pages: 1