Takket være FuelPHPs feltsettklasse kan det ikke være enklere å jobbe med skjemaer. Med noen få linjer med kode, kan du enkelt generere og validere et skjema. I dag skal vi lære å gjøre nettopp det!
De
fieldset
klassen brukes til å lage et skjema og håndtere sin validering på en objektorientert måte. Den brukerForm
ogValidering
klasser. Denne klassen, i seg selv, er bare ment å modellere feltet og feltene, mens de andre to klassene utfører arbeidets brunt.
Vi trenger en FuelPHP installasjon med en RM-pakke aktivert. Jeg skal bruke en MySQL-database med et eksempelbord. Mens fieldset
klassen kan konfigureres til å bruke en vanlig modell, ved hjelp av en ORM vil vi spare litt tid.
Hvis du ikke har gjennomgått de første par delene av FuelPHP serien her på Nettuts +, er det nå en flott tid å sjekke ut del ett og to, av Phil Sturgeon.
Konfigurer en databaseforbindelse på drivstoff / app / config / utvikling / db.php
.
returner array ('default' => array ('connection' => array ('dsn' => 'mysql: vert = localhost; dbname = blogg', 'brukernavn' => 'root', 'passord' => 'rot ',),),);
Aktiver ORM-pakken gjennom drivstoff / app / config.php
'pakker' => array ('orm',),
Og til slutt, her er SQL for tabellen jeg bruker for denne opplæringen.
CREATE TABLE 'blogg'. 'Innlegg' ('id' INT IKKE NULL AUTO_INCREMENT PRIMARY KEY, 'post_title' VARCHAR (100) IKKE NULL, 'post_content' TEKST IKKE NULL, 'author_name' VARCHAR (65) IKKE NULL, 'author_email' VARCHAR (80) IKKE NULL, 'forfatter_website' VARCHAR (60) NULL, 'post_status' TINYINT NULL) MOTOR = INNODB;
Vi trenger en modell for vår kontroller til å samhandle med innleggstabellen. Gå videre og opprett en post.php
innsiden app / klasser / modell /
. Lage en Model_Post
klasse og sørg for at den strekker seg \ Orm \ Modell
. ORM vil automatisk bruke innlegg
bord i vår database siden vi har brukt singularet av "innlegg". Hvis du vil angi et annet bord, må du sette opp en statisk egenskap som kalles $ _table_name
.
klassen Model_Post utvider \ Orm \ Modell beskyttet statisk $ _table_name = 'posts'; // sette tabellnavnet manuelt
Vi bør spesifisere kolonnene i vårt innleggstabell i vår modell. Samtidig kan vi også sette opp etiketter, skjema valideringsregler for bruk med vår feltsettklasse for å generere skjemaet. Alle disse går i en tilknyttet gruppe, kalt $ _properies
. Med alt på plass, bør vår siste modell se slik ut:
klassen Model_Post utvider \ Orm \ Modell beskyttet statisk $ _table_name = 'posts'; beskyttet statisk $ _properties = array ('id', 'post_title' => array (// kolonnenavn 'data_type' => 'streng', 'label' => 'Posttittel', // etikett for innskrivingsfelt 'validering '=> array (' required ',' max_length '=> array (100),' min_length '=> array (10)) // valideringsregler),' post_content '=> array (' data_type '=>' string ' , 'label' => 'Innholdsinnhold', 'validering' => array ('required')), 'author_name' => array ('data_type' => 'streng', 'label' => 'Forfatternavn' '' '' '' '' '' '' '' ',' author_email '=> array (' data_type '=>' string ',' label '=>' Forfatter Email ',' validation '=> array (' required ',' valid_email ')),' author_website '=> array (' data_type '=>' streng ',' label '=>' Forfatter Nettsted ',' validering '=> array (' required ',' valid_url ',' max_length '=> array (60))),' post_status '=> array (' data_type '=>' streng ',' label '=> 'Poststatus', 'validering' => array ('required'), 'form' => array ('type' => 'velg', 'options' => array (1 => 'Publ ished ', 2 =>' Draft '))),));
La oss undersøke hvilke alternativer vi kan bruke. data-type
holder bare feltets type. Det kan være enten streng, heltall eller mysql_date. Verdien for merkelapp
Egenskapen vil bli vist som feltetikett når skjemaet er generert. validering
aksepterer en rekke valideringsregler. Som standard vil disse feltene være tekstinntastingsfelter. Bruker skjema
, du kan gjøre det til en velg eller texarea.
ORM behandler kolonnen som heter id
som den primære og vil ikke bli vist når du genererer et skjema. Hvis tabellens primærnøkkelkolonne er annerledes, bruk $ _primary_key
eiendom for å spesifisere det.
/ ** * Post Model * / klasse Model_Post utvider \ Orm \ Modell beskyttet statisk $ _table_name = 'posts'; beskyttet statisk $ _primary_key = array ('id'); // du kan konfigurere flere kolonner, ... $ _primary_key => array ('id', 'user_id')
Nå som modellen er klar, la oss opprette kontrolleren. Kontrollører skal plasseres innenfor brensel / app / timer / styreenhet /
. Jeg har opprettet en kontroller, kalt Controller_Posts (posts.php)
og utvidet den fra Controller_Template
.
/ ** * Post Controller drivstoff / app / klasser / controller / posts.php * / klasse Controller_Posts utvider \ Controller_Template // list innlegg funksjon action_index () // legg til en ny funksjon action_add () // rediger funksjon action_edit ($ id)
Brukere vil kunne se en liste over innlegg, legge til nye eller redigere en eksisterende. Fordi jeg bruker maleregulatoren, kan jeg bruke en base malfil å jobbe med. Maler går inn drivstoff / app / visninger / template.php
0):?>
', $ melding''; ?>
Dette er bare standard HTML markup med Twitter bootstrap. De $ innhold
variabel vil ha innholdet. Vi kan angi en rekke meldinger, og hvis vi gjør det, vil det bli skrevet ut som en uordnet liste.
Det er her moroa begynner. Vi skal generere skjemaet for å legge til nye innlegg. Som du kanskje har gjettet, jobber vi med action_add ()
metode. La oss generere skjemaet og sende det til vår mal.
// legg til ny en funksjon action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ this-> template-> set ('content', $ form-> build (), false); // false vil fortell brensel for ikke å konvertere HTML-kodene til sikker streng.
Fieldset :: forge ()
vil returnere en ny forekomst av feltsettklassen. Det er det samme som å gjøre nye Fieldset
. Imidlertid bruker du smi
Metode her, vi kan nevne våre forekomster. Hvis vi kaller en forekomst to ganger med samme navn, vil en eksisterende forekomst bli returnert hvis tilgjengelig [fabrikkmønsteret]. For å nevne forekomsten din, send navnet til smi
metode. Fieldset :: smie ( 'new_post')
Bruker add_model
metode, vi overfører modellen som vi vil ha skjemaene som skal genereres fra. Fieldset tar dataene fra $ _properties
å generere skjemaet. Ringer på form ()
Metoden fra feltsettobjektet returnerer en forekomst fra Form
klasse, og ved å ringe bygge()
metode, kan vi få en html (streng) utgang av skjemaet.
$ this-> template-> set ('content', $ form, false);
Til slutt passerer vi $ skjema
til malen som innhold. En annen metode for å overføre variabler til en mal er $ this-> template-> content = $ form
.
Brann opp nettleseren din og naviger til http: //path_to_site/index.php/posts/add
. Du bør se et skjema som er identisk med dette.
Ingen innleveringsknapp? La oss fikse det. Vi må legge til et nytt felt i vårt skjemaobjekt.
$ form-> add ('submit', ', array (' type '=>' send ',' verdi '=>' Legg til ',' klasse '=>' btn medium primær '));
Bruker Legg til
Metode vi kan legge til flere felt i vårt skjema. Første parameter er vårt nye feltnavn, det andre er for etikett, for den tredje parameteren passerer vi en rekke attributter.
Etter å ha lagt til dette, vår action_add ()
vil se slik ut.
funksjon action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ form-> add ('submit', ', array (' type '=>' send ',' verdi '=>' Legg til ',' klasse '=>' btn medium primær ')); $ this-> mal -> sett ('innhold', $ form-> build (), false);
Og vårt skjema ...
Nå som vi har et fint skjema, la oss validere det og lagre i databasen. Feltobjektet inneholder en forekomst fra FuelPHPs valideringsklasse. Alle reglene har blitt brukt og klar til å gå.
funksjon action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ form-> add ('submit', ', array (' type '=>' send ',' verdi '=>' Legg til ',' klasse '=>' btn medium primær ')) > validering () -> run () == true) $ felt = $ fieldset-> validert (); $ post = ny Model_Post; $ post-> post_title = $ felt ['post_title']; $ post-> post_content = $ felt ['post_content']; $ post-> author_name = $ felt ['author_name']; $ post-> author_email = $ felt ['author_email']; $ post-> author_website = $ felt ['author_website'] ; $ post-> post_status = $ felt ['post_status']; hvis ($ post-> save ()) \ Response :: redirect ('innlegg / rediger /'.$ post-> id); annet $ this-> template-> messages = $ fieldset-> validering () -> feil (); $ this-> template-> sett ('content', $ form-> build (), false);
$ Fieldset-> validering ()
returnerer en valideringsklasse instans og ved å få tilgang til sin løpe()
Metode vi kan sjekke om validering er bestått. I så fall legger vi til et nytt innlegg i vår database. $ Fieldset-> validert ()
vil returnere en rekke validerte felt. Hvis validering er bestått og innlegget er lagret, blir brukeren omdirigert til redigeringssiden, ellers send godkjenningsfeilene til vår mal som meldingsvariabel.
Hvis du prøver å sende inn noen ugyldige data, får du en utgang som:
Alt virker bra, bortsett fra ett problem: Data vi sender inn, vises ikke etter at siden oppdateres. Ikke bekymre deg, en metode samtale og du er ferdig.
$ fieldset = Fieldset :: forge () -> add_model ('Model_Post') -> repopulate (); // repopulate metode vil fylle ut skjemaet ditt med opplastede data
Cool, va? Legg til noen gyldige data, og den vil omdirigere til action_edit ()
metode, som ikke er klar ennå.
Redigering av en seksjon er stort sett den samme som vår legg til innleggsavdeling. Unntatt vi trenger å fylle dataene med et eksisterende innlegg. Jeg skal duplisere action_add
kode.
funksjon action_edit ($ id) $ post = \ Model_Post :: finn ($ id); $ fieldset = Fieldset :: forge () -> add_model ('Model_Post') -> fylle ($ post); // modell postobjekt er sendt til populatemetoden $ form = $ fieldset-> form (); $ form-> add ('submit', ', array (' type '=>' send ',' verdi '=>' Lagre ',' klasse '=>' btn medium primær ')) > validering () -> run () == true) $ felt = $ fieldset-> validert (); // $ post = ny Model_Post; $ post-> post_title = $ felt ['post_title']; $ post- > post_content = $ felt ['post_content']; $ post-> author_name = $ felt ['author_name']; $ post-> author_email = $ felt ['author_email']; $ post-> author_website = $ felt ['author_website ']; $ post-> post_status = $ felt [' post_status ']; hvis ($ post-> lagre ()) \ Response :: redirect (' innlegg / rediger /'.$ id); annet $ this-> template-> messages = $ fieldset-> validering () -> feil (); $ this-> template-> sett ('content', $ form-> build (), false);
Med noen små modifikasjoner til vår action_add ()
metode, vi har vår redigeringsmetode. repopulere ()
Metoden har blitt erstattet av befolke ()
metode. Bruker befolke
Metode, vi kan fylle ut et skjema med et eksisterende innleggs data.
I dette tilfellet tar vi innlegget fra vår database ved hjelp av $ id
parameter, så send den til den nødvendige metoden. Vi trenger ikke $ post = ny Model_Post;
lenger fordi vi ikke legger til noe i databasen. De $ post
objekt vi lager i begynnelsen er vant til å tilordne de nye verdiene. Når den er redigert, vil den omdirigere tilbake til redigeringsskjermen. Vi er ferdige! Legg til noen innlegg, og prøv å redigere dem.
La oss bygge opp oppføringsdelen slik at brukerne kan se alle innleggene på ett sted.
Noteringen håndteres av action_index ()
metode
// liste innlegg funksjon action_index () $ posts = \ Model_Post :: finn ('alle'); $ view = \ View :: forge ('listing'); $ view-> set ('innlegg', $ innlegg, false); $ this-> template-> content = $ view; // I konfigurasjonsfil Vis objekter er hviteliste, så Fuelphp vil ikke unnslippe html.
Model_Post :: finne ( 'alle')
Vil returnere en rekke innleggsobjekter for alle innleggene våre. Ved hjelp av Vis :: forge ()
, et nytt visningsobjekt er instantiated. Parameteren for Vis :: forge ()
er navnet på vår spesifikke visning. Det ligger på app / visninger / listing.php
. Mengden innlegg innlegg ($ innlegg
) blir så sendt til vår visning. Listevisningen vil ta vare på oppføringen og til slutt tildeler vi visningen til $ Dette-> templat-> innhold
.
I utsikten vi gikk gjennom $ innlegg
og generer listen.
POST_TITLE; ?> id, '[Rediger]');?>
POST_CONTENT; ?>
Av AUTHOR_NAME; ?>
author_email; ?>
author_website; ?>
Hvis du har noen innlegg i databasen, vil det se slik ut.
Alt ser ut til å fungere riktig; Det er imidlertid noen mindre problemer. Den genererte skjemaet har et tekstfelt for innleggets innhold, noe som ville være bedre som tekstområde.
// Model_Post 'post_content' => array ('data_type' => 'streng', 'label' => 'Innholdsinnhold', 'validering' => array ('required'), 'form' => array '=>' textarea ') // vil gi oss en tekstarea),
Du kan passere alle felttyper tekst, tekstområde, velg, radio etc. For valg eller radioelementer, kan du angi alternativene. Det er også mulig å angi alternativer for et valg ved hjelp av et annet bord. Hvis du vil endre standardoppsettet, legger du inn en formkonfigurasjonsfil drivstoff / app / config / form.php
Hvis du ikke er sikker på hva du skal legge inn, kopier du ting fra brensel / kjerne / konfig / form.php
. Drivstoff bruker denne filen til å generere skjemaene.
Jeg håper du nå har en klar forståelse av feltettklassen. Hvis du har spørsmål, vennligst gi beskjed i kommentarene nedenfor. Takk så mye for å lese!