Dankzij de fieldset-klasse van FuelPHP kan het werken met formulieren niet eenvoudiger zijn. Met een paar regels code kunt u eenvoudig een formulier genereren en valideren. Vandaag gaan we leren hoe we dat precies moeten doen!
De
fieldset
class wordt gebruikt om een formulier te maken en de validatie ervan op een objectgerichte manier af te handelen. Het gebruikt deHet formulier
enbevestiging
klassen. Deze klasse is alleen bedoeld om de veldset en zijn velden te modelleren, terwijl de andere twee klassen de dupe zijn van het werk.
We hebben een FuelPHP-installatie nodig met een RM-pakket ingeschakeld. Ik ga een MySQL-database gebruiken met een voorbeeldtabel. Terwijl de fieldset
klasse kan worden geconfigureerd om een normaal model te gebruiken, het gebruik van een ORM zal ons enige tijd besparen.
Als je de eerste paar delen van de FuelPHP-serie hier op Nettuts + nog niet hebt bekeken, is het nu een goed moment om deel één en twee te bekijken, door Phil Sturgeon.
Stel een databaseverbinding in op brandstof / app / config / ontwikkeling / db.php
.
return array ('default' => array ('connection' => array ('dsn' => 'mysql: host = localhost; dbname = blog', 'gebruikersnaam' => 'root', 'wachtwoord' => 'root ',),),);
Schakel het ORM-pakket in brandstof / app / config.php
'pakketten' => array ('orm',),
En, ten slotte, hier is de SQL voor de tabel die ik gebruik voor deze tutorial.
CREËER TABEL 'blog'. 'Berichten' ('id' INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 'post_title' VARCHAR (100) NOT NULL, 'post_content' TEXT NOT NULL, 'author_name' VARCHAR (65) NOT NULL, 'author_email' VARCHAR (80) NOT NULL, 'author_website' VARCHAR (60) NULL, 'post_status' TINYINT NULL) MOTOR = INNODB;
We hebben een model nodig voor onze controller om te communiceren met de posts-tabel. Ga je gang en maak een post.php
binnen app / klassen / model /
. Maak een Model_Post
klasse en zorg ervoor dat deze wordt uitgebreid \ Orm \ Model
. De ORM gebruikt automatisch de posts
tabel in onze database omdat we het enkelvoud van "berichten" hebben gebruikt. Als u een andere tabel wilt instellen, moet u een statische eigenschap instellen met de naam $ _table_name
.
class Model_Post breidt \ Orm \ Model protected static $ _table_name = 'posts'; // stel de tabelnaam handmatig in
We zouden de kolommen van onze berichtentabel binnen ons model moeten specificeren. Tegelijkertijd kunnen we ook labels instellen, valideringsregels opstellen die we kunnen gebruiken in onze fieldset-klasse om het formulier te genereren. Deze gaan allemaal in een bijbehorende array, genaamd $ _properies
. Met alles op zijn plaats, zou ons uiteindelijke model er zo uit moeten zien:
class Model_Post breidt \ Orm \ Model protected static $ _table_name = 'posts'; beschermd statisch $ _properties = array ('id', 'post_title' => array (// kolomnaam 'data_type' => 'string', 'label' => 'Berichttitel', // label voor het invoerveld 'validatie '=> array (' required ',' max_length '=> array (100),' min_length '=> array (10)) // validatieregels),' post_content '=> array (' data_type '=>' string ' , 'label' => 'Inhoud plaatsen', 'validatie' => array ('verplicht')), 'author_name' => array ('data_type' => 'string', 'label' => 'Naam auteur', 'validatie' => array ('required', 'max_length' => array (65), 'min_length' => array (2))), 'author_email' => array ('data_type' => 'string', ' label '=>' Auteur Email ',' validatie '=> array (' verplicht ',' valid_email ')),' author_website '=> array (' data_type '=>' string ',' label '=>' Website van auteur ',' validatie '=> array (' required ',' valid_url ',' max_length '=> array (60))),' post_status '=> array (' data_type '=>' string ',' label '=> 'Poststatus', 'validatie' => array ('verplicht'), 'form' => array ('type' => 'select', 'options' => array (1 => 'Publ ished ', 2 =>' Draft ')),));
Laten we eens kijken welke opties we kunnen gebruiken. data type
houdt eenvoudig het type van de velden vast. Het kan een string, een integer of een mysql_date zijn. De waarde voor de label
eigenschap wordt weergegeven als het veldlabel zodra het formulier is gegenereerd. bevestiging
accepteert een reeks validatieregels. Standaard zijn deze velden tekstinvoervelden. De ... gebruiken het formulier
, je kunt er een select of texarea van maken.
De ORM behandelt de kolom met de naam ID kaart
als de primaire en zal niet worden getoond bij het genereren van een formulier. Als de primaire sleutelkolom van uw tabel anders is, gebruikt u de $ _primary_key
eigenschap om het te specificeren.
/ ** * Berichtmodel * / class Model_Post breidt \ Orm \ Model protected static $ _table_name = 'posts'; beschermde statische $ _primary_key = array ('id'); // u kunt meerdere kolommen instellen, ... $ _primary_key => array ('id', 'user_id')
Nu het model gereed is, laten we de controller maken. Controllers moeten hierin worden geplaatst brandstof / app / klassen / controller /
. Ik heb een controller gemaakt, genaamd Controller_Posts (posts.php)
en uitgebreid vanaf Controller_Template
.
/ ** * Post-controller brandstof / app / klassen / controller / posts.php * / class Controller_Posts breidt \ Controller_Template // list posts-functie action_index () // voeg een nieuwe functie action_add () // edit-functie toe action_edit ($ id)
Gebruikers kunnen een lijst met berichten bekijken, nieuwe toevoegen of een bestaande bewerken. Omdat ik de sjablooncontroller gebruik, kan ik een basissjabloonbestand gebruiken om mee te werken. Sjablonen gaan erin brandstof / app / views / template.php
0):?>
', $ bericht,''; ?>
Dit is slechts standaard HTML-markering met de Twitter-bootstrap. De $ inhoud
variabele heeft de inhoud. We kunnen een reeks berichten instellen en als we dit doen, wordt het afgedrukt als een ongeordende lijst.
Dit is waar het plezier begint. We gaan het formulier genereren voor het toevoegen van nieuwe berichten. Zoals je misschien al geraden hebt, werken we met de action_add ()
methode. Laten we het formulier genereren en doorgeven aan onze sjabloon.
// voeg een nieuwe functie toe action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ this-> template-> set ('content', $ form-> build (), false); // false zal aangeven dat brandstof niet nodig is om de html-tags naar een veilige reeks om te zetten.
Fieldset :: smederij ()
retourneert een nieuw exemplaar van de veldsetklasse. Het is hetzelfde als doen nieuwe Fieldset
. Het gebruik van de smederij
methode hier, kunnen we onze instanties noemen. Als we een exemplaar twee keer met dezelfde naam aanroepen, wordt een bestaand exemplaar geretourneerd als dit beschikbaar is [het fabriekspatroon]. Geef de naam door aan de naam om uw exemplaar een naam te geven smederij
methode. Fieldset :: forge ( 'new_post')
De ... gebruiken add_model
methode, geven we het model door waarvoor we de formulieren willen genereren. Fieldset haalt de gegevens uit $ _properties
om het formulier te genereren. Oproep aan de het formulier()
methode van het veldsetobject retourneert een exemplaar van Het formulier
klasse, en door de bouwen()
methode, we kunnen een html (string) uitvoer van het formulier krijgen.
$ this-> template-> set ('content', $ form, false);
Uiteindelijk passeren we de $ form
naar de sjabloon als inhoud. Een andere methode om variabelen door te geven aan een sjabloon is $ this-> template-> content = $ form
.
Start uw browser op en navigeer naar http: //path_to_site/index.php/posts/add
. Je zou een formulier moeten zien identiek aan dit.
Geen verzendknop? Laten we dat oplossen. We moeten een nieuw veld toevoegen aan ons formulierobject.
$ form-> add ('submit', ", array ('type' => 'submit', 'value' => 'Add', 'class' => 'btn medium primary'));
De ... gebruiken toevoegen
methode kunnen we extra velden toevoegen aan ons formulier. Eerste parameter is onze nieuwe veldennaam, de tweede is voor label, voor de derde parameter passeren we een array van attributen.
Na het toevoegen van dit, onze action_add ()
zal er zo uitzien.
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);
En onze vorm ...
Nu we een mooi formulier hebben, laten we het valideren en opslaan in de database. Het fieldset-object bevat een instantie uit de validatieklasse van FuelPHP. Alle regels zijn toegepast en klaar voor gebruik.
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- > validatie () -> run () == true) $ fields = $ fieldset-> validated (); $ post = new Model_Post; $ post-> post_title = $ fields ['post_title']; $ post-> post_content = $ velden ['post_content']; $ post-> author_name = $ velden ['author_name']; $ post-> author_email = $ fields ['author_email']; $ post-> author_website = $ fields ['author_website'] ; $ post-> post_status = $ velden ['post_status']; if ($ post-> save ()) \ Response :: redirect ('posts / edit /'.$ post-> id); else $ this-> template-> messages = $ fieldset-> validation () -> errors (); $ this-> template-> set ('content', $ form-> build (), false);
$ Fieldset-> validatie ()
retourneert een validatieklasseinstantie en door deze te openen rennen()
methode kunnen we controleren of de validatie is geslaagd. Als dat zo is, voegen we een nieuw bericht toe aan onze database. $ Fieldset-> gevalideerd ()
zal een reeks gevalideerde velden retourneren. Als de validatie wordt doorgegeven en het bericht wordt opgeslagen, wordt de gebruiker omgeleid naar de bewerkpagina, anders geven de validatiefouten door aan onze sjabloon als berichtvariabele.
Als u probeert om ongeldige gegevens in te dienen, krijgt u een uitvoer zoals zo:
Alles lijkt goed, behalve voor één probleem: gegevens die we indienen, verschijnen niet na het vernieuwen van de pagina. Geen zorgen, één methode aanroep en je bent klaar.
$ fieldset = Fieldset :: forge () -> add_model ('Model_Post') -> repopulate (); // repopulate-methode vult uw formulier met geposte gegevens
Gaaf he? Voeg enkele geldige gegevens toe en deze zullen doorsturen naar de action_edit ()
methode, die nog niet klaar is.
Het bewerken van een sectie is vrijwel hetzelfde als onze post toevoegen sectie. Behalve dat we de gegevens moeten vullen met een bestaande post. Ik ga het dupliceren action_add
code.
function action_edit ($ id) $ post = \ Model_Post :: find ($ id); $ fieldset = Fieldset :: forge () -> add_model ('Model_Post') -> vul in ($ post); // model post-object wordt doorgegeven aan de vulmethode $ form = $ fieldset-> form (); $ form-> add ('submit', ", array ('type' => 'submit', 'value' => 'Bewaar', 'class' => 'btn medium primair')); if ($ fieldset- > validatie () -> run () == true) $ fields = $ fieldset-> validated (); // $ post = new Model_Post; $ post-> post_title = $ fields ['post_title']; $ post- > post_content = $ fields ['post_content']; $ post-> author_name = $ fields ['author_name']; $ post-> author_email = $ fields ['author_email']; $ post-> author_website = $ fields ['author_website ']; $ post-> post_status = $ velden [' post_status ']; if ($ post-> save ()) \ Response :: redirect (' posts / edit /'.$ id); else $ this-> template-> messages = $ fieldset-> validation () -> errors (); $ this-> template-> set ('content', $ form-> build (), false);
Met een paar kleine aanpassingen aan onze action_add ()
methode, we hebben onze bewerkingsmethode. herbevolken ()
methode is vervangen door bevolken()
methode. De ... gebruiken bevolken
methode, kunnen we een formulier invullen met de gegevens van een bestaande post.
In dit geval pakken we de post uit onze database met behulp van de $ id
parameter en geef deze vervolgens door aan de vereiste methode. We hebben het niet nodig $ post = nieuw Model_Post;
meer omdat we niets toevoegen aan de database. De $ bericht
object dat we in het begin maken, wordt gebruikt om de nieuwe waarden toe te wijzen. Na het bewerken wordt het teruggeleid naar het bewerkingsscherm. Werden gedaan! Voeg enkele berichten toe en probeer ze te bewerken.
Laten we het lijstgedeelte opbouwen, zodat gebruikers alle berichten op één plek kunnen bekijken.
De aanbieding wordt afgehandeld door de action_index ()
methode
// list posts function action_index () $ posts = \ Model_Post :: find ('all'); $ view = \ View :: forge ('listing'); $ view-> set ('posts', $ posts, false); $ this-> template-> content = $ view; // In configuratiebestand worden View-objecten op de witte lijst geplaatst zodat Fuelphp niet aan de HTML-code ontsnapt.
Model_Post :: find ( 'all')
retourneert een reeks berichtenobjecten voor al onze berichten. Gebruik makend van Bekijk :: smederij ()
, een nieuw view-object wordt geïnstantieerd. De parameter voor Bekijk :: smederij ()
is de naam voor onze specifieke kijk. Het bevindt zich op app / views / listing.php
. Het array met berichtenobjecten ($ posts
) wordt vervolgens doorgegeven aan ons. De listingweergave zorgt voor de listing en tenslotte wijzen we de view toe aan $ This-> template> inhoud
.
In de weergave lopen we door $ posts
en genereer de lijst.
POST_TITLE; ?> id, '[Bewerken]');?>
POST_CONTENT; ?>
Door auteur naam; ?>
author_email; ?>
author_website; ?>
Als je berichten in de database hebt, ziet het er ongeveer zo uit.
Alles lijkt correct te werken; er zijn echter enkele kleine problemen. Het gegenereerde formulier heeft een tekstveld voor de berichtinhoud, wat beter zou zijn als een tekstgebied.
// Model_Post 'post_content' => array ('data_type' => 'string', 'label' => 'Inhoud plaatsen', 'validatie' => array ('verplicht'), 'form' => array ('type '=>' textarea ') // geeft ons een textarea),
U kunt alle veldtypen tekst, tekstgebied, select, radio etc. doorgeven. Voor select- of radio-elementen kunt u de opties instellen. Opties instellen voor een selectie met een andere tabel is ook mogelijk. Als u de standaardlay-out wilt wijzigen, plaatst u een formulierconfiguratiebestand in brandstof / app / config / form.php
Als je niet zeker weet wat je erin moet plaatsen, kopieer dingen van brandstof / kern / config / form.php
. Fuel gebruikt dit bestand om de formulieren te genereren.
Ik hoop dat je nu een goed begrip hebt van de klasse fieldset. Als u vragen heeft, kunt u me dit laten weten in de reacties hieronder. Heel erg bedankt voor het lezen!