Génération de formulaires facile avec FuelPHP

Grâce à la classe fieldset de FuelPHP, travailler avec des formulaires ne pourrait être plus simple. Avec quelques lignes de code, vous pouvez facilement générer et valider un formulaire. Aujourd'hui, nous allons apprendre à faire exactement cela!


le Fieldset class est utilisé pour créer un formulaire et gérer sa validation de manière orientée objet. Il utilise le Forme et Validation Des classes. Cette classe, elle-même, n’a pour but que de modéliser l’ensemble de champs et ses champs, alors que les deux autres classes font le plus dur du travail..


Configuration du carburant

Nous avons besoin d’une installation FuelPHP avec un package RM activé. Je vais utiliser une base de données MySQL avec un exemple de table. Tandis que le Fieldset la classe peut être configurée pour utiliser un modèle normal, l'utilisation d'un ORM nous fera gagner du temps.

Si vous n'avez pas examiné les deux premières parties de la série FuelPHP ici sur Nettuts +, le moment est venu de découvrir les première et deuxième parties, par Phil Sturgeon..

Configurez une connexion à la base de données à fuel / app / config / development / db.php.

 return array ('default' => array ('connection' => array ('dsn' => 'mysql: host = localhost; dbname = blog', 'username' => 'root', 'password' => 'root ',),),);

Activer le package ORM via fuel / app / config.php

 'packages' => array ('orm',),

Et enfin, voici le code SQL de la table que j'utilise pour ce tutoriel.

 CREATE TABLE 'blog'. 'Posts' ('id' INT NULL AUTO_INCREMENT, 'post_title' VARCHAR (100) NOT NULL, 'post_content' TEXT NOT NULL, 'nom_auteur' VARCHAR (65) NOT NULL, 'author_email' VARCHAR (80) NON NULL, 'author_website' VARCHAR (60) NULL, 'post_status' TINYINT NULL) ENGINE = INNODB;

Modèle

Nous avons besoin d’un modèle pour que notre contrôleur puisse interagir avec la table posts. Allez-y et créez un post.php à l'intérieur app / classes / modèle /. Créer un Model_Post classe et assurez-vous qu'il se prolonge \ Orm \ Modèle. L’ORM utilisera automatiquement le des postes table dans notre base de données car nous avons utilisé le singulier "posts". Si vous souhaitez définir une autre table, définissez une propriété statique appelée $ _table_name.

 class Model_Post étend \ Orm \ Model protected static $ _table_name = 'posts'; // définit le nom de la table manuellement

Configuration des propriétés

Nous devrions spécifier les colonnes de notre table posts dans notre modèle. Dans le même temps, nous pouvons également configurer des étiquettes et des règles de validation de formulaire à utiliser avec notre classe fieldset pour générer le formulaire. Tous ceux-ci vont dans un tableau associé, appelé $ _properies. Avec tout en place, notre modèle final devrait ressembler à ceci:

 class Model_Post étend \ Orm \ Model protected static $ _table_name = 'posts'; protected static $ _properties = array ('id', 'post_title' => array (// nom de la colonne 'data_type' => 'chaîne', 'label' => 'Post Title', // label du champ de saisie 'validation '=> array (' required ',' max_length '=> array (100),' min_length '=> array (10)) // règles de validation),' post_content '=> array (' type_données '=>' chaîne ' , 'label' => 'Publier le contenu', 'validation' => array ('required')), 'author_name' => array ('data_type' => 'chaîne', 'label' => 'Nom de l'auteur', 'validation' => array ('required', 'max_length' => array (65), 'min_length' => array (2)), 'author_email' => array ('type_données' => 'chaîne', ' label '=>' Email de l'auteur ',' validation '=> array (' required ',' valid_email ')),' author_website '=> array (' data_type '=>' chaîne ',' label '=>' Site Web de l'auteur ',' validation '=> array (' required ',' valid_url ',' max_length '=> array (60))),' post_status '=> array (' data_type '=>' chaîne ',' label '=> 'Post Status', 'validation' => array ('required'), 'form' => array ('type' => 'select', 'options' => array (1 => 'Publ ished ', 2 =>' Draft ')),)); 

Examinons quelles options nous pouvons utiliser. Type de données détient simplement le type des champs. Il peut s'agir d'une chaîne, d'un entier ou de mysql_date. La valeur pour le étiquette la propriété sera affichée comme étiquette de champ une fois le formulaire généré. validation accepte un tableau de règles de validation. Par défaut, ces champs seront des champs de saisie de texte. En utilisant le forme, vous pouvez en faire une sélection ou texarea.

L'ORM traite la colonne nommée identifiant en tant que primaire et ne sera pas affiché lors de la génération d'un formulaire. Si la colonne de clé primaire de votre table est différente, utilisez la commande $ _primary_key propriété à spécifier.

 / ** * Post Model * / class Model_Post étend \ Orm \ Modèle protected static $ _table_name = 'posts'; static static $ _primary_key = array ('id'); // vous pouvez configurer plusieurs colonnes,… $ _primary_key => array ('id', 'user_id')

Manette

Maintenant que le modèle est prêt, créons le contrôleur. Les contrôleurs doivent être placés dans carburant / application / classes / contrôleur /. J'ai créé un contrôleur, appelé Controller_Posts (posts.php) et l'a étendu de Controller_Template.

 / ** * Post Controller fuel / app / classes / controller / posts.php * / class Controller_Posts extended \ Controller_Template // liste les posts fonction action_index ()  // ajoute une nouvelle fonction action_add ()  // fonction edit action_edit ($ id) 

Les utilisateurs pourront voir une liste de publications, en ajouter de nouvelles ou en modifier une existante. Comme j'utilise le contrôleur de modèle, je peux utiliser un fichier de modèle de base pour travailler. Les modèles vont dans fuel / app / views / template.php

        

0):?>
    ', $ message,''; ?>

Ceci est simplement un balisage HTML standard avec le bootstrap de Twitter. le $ contenu variable aura le contenu. Nous pouvons définir un tableau de messages et si nous le faisons, il sera imprimé sous forme de liste non ordonnée.


Ajout de nouveaux messages

C'est là que commence le plaisir. Nous allons générer le formulaire pour ajouter de nouveaux messages. Comme vous l'avez peut-être deviné, nous travaillerons avec le action_add () méthode. Générons le formulaire et transmettons-le à notre modèle.

 // ajoute une nouvelle fonction action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ this-> template-> set ('content', $ form-> build (), false); // false indiquera à carburant de ne pas convertir les balises HTML en chaîne sécurisée. 

Fieldset :: forge () renverra une nouvelle instance de la classe fieldset. C'est comme faire nouveau Fieldset. Cependant, en utilisant le la forge méthode ici, nous pouvons nommer nos instances. Si nous appelons une instance deux fois avec le même nom, une instance existante sera retournée si elle est disponible [le modèle Factory]. Pour nommer votre instance, passez le nom à la forge méthode. Fieldset :: forge ('new_post')

En utilisant le add_model méthode, nous transmettons le modèle à partir duquel nous voulons que les formulaires soient générés. Fieldset va récupérer les données de $ _properties générer le formulaire. Appeler le forme() méthode de l'objet fieldset retournera une instance de Forme classe, et en appelant le construire() méthode, nous pouvons obtenir une sortie HTML (chaîne) de la forme.

 $ this-> template-> set ('content', $ form, false);

Enfin, nous passons le $ forme au modèle en tant que contenu. Une autre méthode pour passer des variables à un modèle est $ this-> template-> content = $ form.

Lancez votre navigateur et accédez à http: //path_to_site/index.php/posts/add. Vous devriez voir un formulaire identique à celui-ci.

Pas de bouton d'envoi? Réglons ça. Nous devons ajouter un nouveau champ à notre objet formulaire.

 $ form-> add ('submit', ", array ('type' => 'submit', 'value' => 'Add', 'class' => 'btn medium primary'));

En utilisant le ajouter méthode, nous pouvons ajouter des champs supplémentaires à notre formulaire. Le premier paramètre est notre nouveau nom de champs, le second est pour label, pour le troisième paramètre nous passons un tableau d'attributs.

Après avoir ajouté ceci, notre action_add () ressemblera à ceci.

 function action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ form-> add ('submit', ", array ('type' => 'submit', 'value' => 'Add', 'class' => 'btn medium primary')); $ this-> template -> set ('content', $ form-> build (), false);

Et notre forme…


Validation et Sauvegarde

Maintenant que nous avons un bon formulaire, validons-le et sauvegardons-le dans la base de données. L'objet fieldset inclut une instance de la classe de validation de FuelPHP. Toutes les règles ont été appliquées et prêtes à l'emploi.

 function action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ form-> add ('submit', ", array ('type' => 'submit', 'value' => 'Add', 'class' => 'btn medium primary')); if ($ fieldset- > validation () -> run () == true) $ fields = $ champset-> validated (); $ post = nouveau Model_Post; $ post-> post_title = $ fields ['post_title']; $ post-> post_content = $ fields ['post_content']; $ post-> nom_auteur = $ fields ['nom_auteur']; $ post-> author_email = $ fields ['author_email']; $ post-> author_website = $ fields ['author_website'] ; $ post-> post_status = $ fields ['post_status']; if ($ post-> save ()) \ Response :: redirect ('posts / edit /'.$ post-> id); else  $ this-> template-> messages = $ fieldset-> validation () -> errors (); $ this-> template-> set ('contenu', $ formulaire-> build (), false);

$ fieldset-> validation () renvoie une instance de classe de validation et en accédant à son courir() méthode, nous pouvons vérifier si la validation est passée. Si tel est le cas, nous ajoutons un nouveau message à notre base de données.. $ fieldset-> validated () renverra un tableau de champs validés. Si la validation est passée et que la publication est enregistrée, l’utilisateur sera redirigé vers la page d’édition, sinon les erreurs de validation seront transmises à notre modèle en tant que variable de message.

Si vous essayez de soumettre des données non valides, vous obtiendrez une sortie comme celle-ci:

Tout semble aller pour le mieux, sauf un problème: les données que nous soumettons n'apparaissent pas après l'actualisation de la page. Ne vous inquiétez pas, un appel de méthode et vous avez terminé.

 $ fieldset = Fieldset :: forge () -> add_model ('Model_Post') -> repopulate (); // la méthode repopulate va remplir votre formulaire avec les données publiées

Cool hein? Ajoutez des données valides et il sera redirigé vers le action_edit () méthode, qui n'est pas encore prête.


Editer un article

La modification d'une section est à peu près la même chose que notre section d'ajout de publication. Sauf que nous devons renseigner les données avec une publication existante. Je vais dupliquer le action_add code.

 function action_edit ($ id) $ post = \ Model_Post :: find ($ id); $ fieldset = Fieldset :: forge () -> add_model ('Model_Post') -> populate ($ post); // l'objet post model est passé à la méthode de peuplement $ form = $ fieldset-> form (); $ form-> add ('submit', ", array ('type' => 'submit', 'value' => 'Save', 'class' => 'btn medium primary')); if ($ fieldset- > validation () -> run () == true) $ fields = $ champset-> validated (); // $ post = new Model_Post; $ post-> post_title = $ fields ['post_title']; $ post- > post_content = $ fields ['post_content']; $ post-> nom_auteur = $ fields ['nom_auteur']; $ post-> author_email = $ fields ['author_email']; $ post-> author_website = $ fields ['author_website ']; $ post-> post_status = $ fields [' post_status ']; if ($ post-> save ()) \ Response :: redirect (' posts / edit /'.$ id); else $ this-> template-> messages = $ fieldset-> validation () -> errors (); $ this-> template-> set ('contenu', $ formulaire-> build (), false);

Avec quelques petites modifications à notre action_add () méthode, nous avons notre méthode d'édition. repeupler() cette méthode a été remplacée par peupler() méthode. En utilisant le peupler méthode, nous pouvons remplir un formulaire avec les données d'un article existant.

Dans ce cas, nous extrayons le message de notre base de données à l'aide de la touche $ id paramètre, puis passez-le à la méthode requise. Nous n'avons pas besoin $ post = new Model_Post; plus parce que nous n’ajoutons rien à la base de données. le $ post L'objet que nous créons au début est utilisé pour assigner les nouvelles valeurs. Une fois édité, il sera redirigé vers son écran d'édition. Avaient fini! Ajoutez quelques articles et essayez de les éditer.


Pages de liste

Construisons la section de liste afin que les utilisateurs puissent voir tous les messages en un seul endroit.

La liste est gérée par le action_index () méthode

 // liste des publications function action_index () $ posts = \ Model_Post :: find ('all'); $ view = \ View :: forge ('listing'); $ view-> set ('posts', $ posts, false); $ this-> template-> content = $ view; // Dans le fichier de configuration, les objets de vue sont inscrits sur la liste blanche afin que Fuelphp n'échappe pas au code HTML. 

Model_Post :: find ('all') renverra un tableau d'objets posts pour tous nos posts. En utilisant Voir :: forge (), un nouvel objet de vue est instancié. Le paramètre pour Voir :: forge () est le nom de notre vue spécifique. Il est situé à app / views / listing.php. L'objet tableau de posts ($ posts) est ensuite passé à notre vue. La vue Liste prend en charge la liste et enfin nous affectons la vue à $ this-> template-> content.

Dans la vue, nous parcourons $ posts et générer la liste.

  

titre de l'article; ?> id, '[Edit]');?>

Publier un contenu; ?>

Par nom de l'auteur; ?>
author_email; ?>
author_website; ?>

Si vous avez des articles dans la base de données, cela ressemblera à quelque chose comme ça.


Quelques modifications finales

Tout semble fonctionner correctement. Cependant, il y a quelques problèmes mineurs. Le formulaire généré a un champ de texte pour le contenu de la publication, ce qui serait mieux sous forme de texte..

 // Model_Post 'post_content' => array ('data_type' => 'string', 'label' => 'Post Content', 'validation' => array ('required'), 'form' => array ('type '=>' textarea ') // nous donnera une textarea),

Vous pouvez transmettre tous les types de champs text, textarea, select, radio, etc. Pour les éléments select ou radio, vous pouvez définir les options. Il est également possible de définir des options pour une sélection utilisant une autre table. Si vous souhaitez modifier la disposition par défaut, placez un fichier de configuration de formulaire dans fuel / app / config / form.php Si vous n’êtes pas sûr de ce qu’il faut y mettre, copiez le contenu de carburant / noyau / config / form.php. Fuel utilise ce fichier pour générer les formulaires.


Résumé

J'espère que vous avez maintenant une compréhension claire de la classe fieldset. Si vous avez des questions, s'il vous plaît laissez-moi savoir dans les commentaires ci-dessous. Merci beaucoup pour la lecture!