{"id":29027442,"url":"https://github.com/cahnory/form","last_synced_at":"2025-06-26T06:05:37.759Z","repository":{"id":139301371,"uuid":"1303183","full_name":"cahnory/fORM","owner":"cahnory","description":"An Object Relation Mapper for forms","archived":false,"fork":false,"pushed_at":"2011-02-04T13:12:00.000Z","size":108,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-03-11T13:49:38.630Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cahnory.png","metadata":{"files":{"readme":"README","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2011-01-28T15:34:26.000Z","updated_at":"2023-03-11T13:52:14.431Z","dependencies_parsed_at":"2023-03-27T13:06:29.319Z","dependency_job_id":null,"html_url":"https://github.com/cahnory/fORM","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/cahnory/fORM","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cahnory%2FfORM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cahnory%2FfORM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cahnory%2FfORM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cahnory%2FfORM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cahnory","download_url":"https://codeload.github.com/cahnory/fORM/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cahnory%2FfORM/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262010860,"owners_count":23244414,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-26T06:05:36.939Z","updated_at":"2025-06-26T06:05:37.738Z","avatar_url":"https://github.com/cahnory.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Bonjour tout le monde, si je poste aujourd'hui c'est pour vous présenter fORM.\n\nfORM est une class php5 qui a pour but de faciliter la gestion de formulaires pour le web. En définissant à l'avance la structure des données à récupérer, il devient facile d'automatiser les tâches plus ou moins courrantes et récurantes (validation, affichage,...).\n\nCréation et définition d'un formulaire\n\nPour créer un nouveau formulaire il suffit de créer une nouvelle class qui étend fORM. Prenons l'exemple d'un formulaire de contact :\n\nclass Form_Contact extends fORM\n{\n    protected function setDefinition()\n    {\n        //\tDéfinition du formulaire ici\n    }\n}\n\nLa méthode protected setDefinition vous permet de définir la structure des données du formulaire. Nous allons donc nous en servir en commençant par ajouter les champs lastname, firstname, email :\n\nclass Form_Contact extends fORM\n{\n    protected function setDefinition()\n    {\n        $this-\u003ehasOne('lastname');\n        $this-\u003ehasOne('firstname');\n        $this-\u003ehasOne('email');\n    }\n}\n\nNous avons donc ajouté nos trois champs à l'aide de la méthode hasOne. Un contact pourraît avoir plusieurs adresse email, nous alons modifier notre formulaire pour permettre la récupération de plusieurs adresses :\n\nclass Form_Contact extends fORM\n{\n    protected function setDefinition()\n    {\n        $this-\u003ehasOne('lastname');\n        $this-\u003ehasOne('firstname');\n        $this-\u003ehasMany('email');\n    }\n}\n\nPeut-être serait-il judicieux de limiter le nombre d'adresses à... disons 5 :\n\nclass Form_Contact extends fORM\n{\n    protected function setDefinition()\n    {\n        $this-\u003ehasOne('lastname');\n        $this-\u003ehasOne('firstname');\n        $email\t=\t$this-\u003ehasMany('email');\n        $email-\u003ehasLimit(5);\n    }\n}\n\nVous noterez que si nous définissons la limite manuellement nous pouvons aussi bien utiliser hasOne que hasMany.\n\nCompliquons un peu les choses avec un formulaire d'envois à des amis :\n\nclass Form_Send2Friends extends fORM\n{\n    protected function setDefinition()\n    {\n        $this-\u003ehasOne('lastname');\n        $this-\u003ehasOne('firstname');\n        $this-\u003ehasMany('email');\n        $this-\u003ehasOne('message');\n        $friend\t=\t$this-\u003ehasMany('friend');\n        $friend-\u003ehasOne('lastname');\n        $friend-\u003ehasOne('firstname');\n        $friend-\u003ehasMany('email');\n    }\n}\n\nCe qui saute tout de suite aux yeux c'est que notre formulaire est composé des même champs que le formulaire de contact. Nous y avons simplement ajouté un champs message ainsi qu'un \"noeud\" friend ayant lui aussi la même composition que le formulaire de contact. Nous allons pouvoir simplifier tout ça :\n\nclass Form_Send2Friends extends Form_Contact\n{\n    protected function setDefinition()\n    {\n    \tparent::setDefinition();\n        $this-\u003ehasOne('message');\n        $this-\u003ehasMany('friend', new Form_Contact);\n    }\n}\n\nC'est quand même bien pratique est nettement plus clair ainsi. En étandant la class Form_Contact tout en appelant sa définition (parent::setDefinition()), nous héritons de toutes ses propriétés auxquels nous pouvons ajouter de nouvelles.\nVous remarquerez que nous pouvons aussi passer un objet fORM en argument des fonction hasOne et hasMany afin de combiner et réutiliser facilement des formulaires existant.\n\n\nUtilisation d'un formulaire\n\nPour remplir notre formulaire nous alons utiliser la méthode fill :\n\n$form  =   new Form_Send2Friend;\n$form-\u003efill($_POST);\n\npour en récupérer les valeurs nous utiliserons la méthode value :\n\n$form-\u003evalue();\n\nfORM implémente les interface Iterator et ArrayAccess permettant de parcourir notre formulaire comme un simple array. Nous récupérons toujours un objet fORM ce qui nous permet de modifier, supprimer, ajouter, valider... tout ou partie de notre formulaire :\n\n//\tretournera toutes les valeurs de notre formulaire\n$form-\u003evalue();\n\n//\tretournera la valeur du champs friend[0][email]\n$form['friend'][0]['email']-\u003evalidate();\n\n// ajoute une adresse email au friend 0\n$form['friend'][0]['email'][]\t=\t'cahnory@gmail.com';\n\n//\taffichera tous les valeurs de friend\nforeach($form['friend'] as $friend) {\n\techo $friend-\u003evalue().'\u003cbr /\u003e';\n}\n\nChaque objet fORM dispose de plusieurs méthodes publiques :\nclear\ndata\nfill\nisParent\nlength\nlimit\nname\nparent\nvalidate\nvalue\n\nLa description de chaqu'une d'entre elle est présente dans la source de la class mais il est, pour la plupart, facil d'imaginer à quoi elles sont destinées.\n\nUne de ces méthodes qui doit attiser les curiosité est sans doute la méthode validate. Chaque fORM peut décider de comment il sera validé à l'aide de la méthode validateValue qui doit retourner une valeur boolean.\nPrenons le cas courant de l'adresse email. Nous allons créer un objet Field_Email comme ceci :\n\nclass Field_Email extends fORM\n{\n    protected\tfunction\tvalidateValue($value)\n    {\n        return\tfilter_var($value, FILTER_VALIDATE_EMAIL);\n    }\n}\n\nJe ne reviens pas sur la méthode de validation, c'est un problème générique qui ne manque pas d'explication sur le net. Nous alons maintenant utiliser ce nouvel objet dans notre formulaire de contact :\n\nclass Form_Contact extends fORM\n{\n    protected function setDefinition()\n    {\n        $this-\u003ehasOne('lastname');\n        $this-\u003ehasOne('firstname');\n        $this-\u003ehasMany('email', new Field_Email);\n    }\n}\n\nNotre champs email n'est plus un simple objet fORM mais un objet Field_Email et utilisera donc la fonction de validation de Field_Email.\n\nEt l'affichage dans tout ça ?\n\nL'affichage n'est pas quelque chose de propre aux formulaires. En grande majorité réalisé en html, l'affichage pourraît très bien se faire dans d'autre format et pour cette raison il n'est pas pris en charge par fORM... c'est là qu'intervient les méthodes hasData et data.\nLa méthode protected hasData va vous permettre de définir des données qui ne sont pas spécifiques aux formulaires mais qui n'en sont pas moins utiles :\n\nclass Form_Send2Friends extends Form_Contact\n{\n    protected function setDefinition()\n    {\n    \tparent::setDefinition();\n        $message\t=\t$this-\u003ehasOne('message');\n        \n        //\tDéfinition de toutes nos data\n        $message-\u003ehasData(array(\n        \t'type'\t=\u003e\t'textarea',\n        \t'label'\t=\u003e\t'Message to your friend(s)'\n        ));\n        \n        //\tDéfinition d'une seule valeur\n        $message-\u003ehasData('placeHolder', 'Type your message here...');\n        \n        $this-\u003ehasMany('friend', new Form_Contact);\n    }\n}\n\nCes informations couplées aux implémentations d'Iterator et ArrayAccess nous permet de générer facilement et automatiquement n'importe quel formulaire à l'aide de fichier de template par exemple. Un exemple (sommaire) tournant sur un framework personnel est en ligne : http://cahnory.fr/fORMDemo/\n\nN'hésitez pas à me faire part de vos remarques, elles seront appréciées. Je vous laisse avec quelques liens :\nLe projet sur github (code source) : https://github.com/cahnory/fORM\nLa démo en ligne : http://cahnory.fr/fORMDemo/\nLa démo à télécharger : http://cahnory.fr/fORMDemo/files/fORM-demo.zip","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcahnory%2Fform","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcahnory%2Fform","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcahnory%2Fform/lists"}