Forenkle formhåndtering på en stor måte

Spar tid, reduser vedlikeholdssmerter, forenkle koden, og gjør alt mens du føler deg som et freakin-geni! I denne opplæringen lærer du hvordan du bruker variable variabler, oppslagsarrayer og litt smart programmering for å forenkle formhåndtering på en stor måte.


Variabel variabler, metoder og egenskaper

Før vi kan bli for dypt inn i å bruke et oppslagssystem, er det viktig å først forstå konseptet bak variable variabler.

Hva er variabel variabler?

Variabel variabel er et begrep som beskriver bruken av en variabel for å erklære en annen variabel.

I den enkleste formen kan en variabel variabel se ut som:

 $ foo = 'En verdi!'; // Deklar en innledende verdi $ bar = 'foo'; // Vent, hva skjer? ekko $$ bar; // Steike! Den utdataen "En verdi!"

Hvorfor bør du bryr deg?

Når du ser på et bevis på konsept som det forrige eksempelet, ser det ut som om det er ganske dumt og komplisert å bruke variable variabler. Imidlertid er det virkelig solide, praktiske grunner til å bruke dem i noen tilfeller.

Praktiske eksempler

Den ansvarlige bruken av variable variabler kan drastisk redusere mengden kode som må gjentas, for eksempel ved å konvertere en associativ array til et objekt med sanitiserte verdier.

Eksempel uten variable variabler

$ comment = new stdClass (); // Opprett et objekt $ comment-> name = sanitize_value ($ array ['name']); $ comment-> email = sanitize_values ​​($ array ['email']); $ comment-> url = sanitize_values ​​($ array ['url']); $ comment-> comment_text = sanitize_values ​​($ array ['comment_text']);

Eksempel med variable variabler

$ comment = new stdClass (); // Opprett et nytt objekt foreach ($ array som $ key => $ val) $ comment -> $ key = sanitize_values ​​($ val); 

Se hvor mye enklere det var? Og du kan forestille seg hvilket eksempel uten variable variabler vil se ut hvis arrayet hadde noe som 50 eller 100 verdier.

MERK: Jeg er klar over at du også kan bruke array_map () og kaste eksplisitt arrayet som et objekt for å oppnå det samme. Det er ikke poenget. Vi illustrerer et konsept her. Spill med.


Problemet med formbehandling

Gjør skjemaet til en bris.

Nå som du vet hvordan du bruker variable variabler, kan vi gå videre til kjøtt og poteter i denne artikkelen, som er ideen om at å inkludere et oppslag i stedet for flere kontrollerfiler eller en bryteretning kan spare deg for mye ekstra vedlikehold, gjentatt kode og hodepine generelt.

For å illustrere vårt konsept skal vi bruke ideen om formbehandling. Dette er et viktig aspekt av webprogrammering, og kan også være et av de mest kjedelige områdene i et hvilket som helst prosjekt.

Etter at du har revurdert kodingsvanene dine, kan du potensielt gjøre skjemaet til å behandle en bris.

Ofte blir det laget en individuell fil for hver form som skal behandles, eller en bryteretning brukes. I denne delen går vi over hvordan begge løsningene kan implementeres, og vi undersøker en løsning ved hjelp av variable variabler, og hvordan det kan forbedre prosjektene dine.

Et arbeidseksempel med flere formbehandlingsfiler

En ofte brukt metode for håndtering av skjemainnlegg er å lage en helt ny fil for å håndtere hver enkelt forms data separat.

Ta for eksempel disse tre skjemaene som oppdaterer en brukerkonto med et nytt navn, ny e-post eller begge deler:

Skjema 1

Skjema 2

Skjema 3

Hver av disse skjemaene peker på en annen behandlingsfil. Så hvordan ser hver av disse filene ut??

Behandle skjema 1 (eiendeler / inc / ex1-form1.php)

save_name (); // For dette eksempelet, bare utdata noen data om skjemainnsendelsen ekko "
Behandlingsfil: ", $ _SERVER ['PHP_SELF']," \ n \ nMetodeutgang:\ n ", $ output"
\ n ","

Gå tilbake

'; else die ('Ugyldig form innsending');

Behandle skjema 2 (eiendeler / inc / ex1-form2.php)

save_email (); // For dette eksempelet, bare utdata noen data om skjemainnsendelsen ekko "
Behandlingsfil: ", $ _SERVER ['PHP_SELF']," \ n \ nMetodeutgang:\ n ", $ output"
\ n ","

Gå tilbake

'; else die ('Ugyldig form innsending');

Behandlingsskjema 3 (eiendeler / inc / ex1-form3.php)

save_both (); // For dette eksempelet, bare utdata noen data om skjemainnsendelsen ekko "
Behandlingsfil: ", $ _SERVER ['PHP_SELF']," \ n \ nMetodeutgang:\ n ", $ output"
\ n ","

Gå tilbake

'; else die ('Ugyldig form innsending');

Som du tydeligvis kan se, dupliserer eksempelfiler ovenfor et ton med kode. Utvid dette til 15 skjemaer på et nettsted, og du vil raskt oppdage at vedlikehold kan bli et mareritt.

Kontoklassen

Som du kan se, oppretter behandlingsfilene en forekomst av klassen CopterLabs_Account. Dette vil bli en veldig enkel klasse som gir informasjon om skjemainnlevering.

Her er koden for klassen (eiendeler / inc / class.coperlabs_account.inc.php):

 * @copyright 2011 Copter Labs * @license http://www.opensource.org/licenses/mit-license.html * @license http://www.gnu.org/licenses/gpl-3.0.txt * / class CopterLabs_Account public $ name = NULL, $ email = NULL; offentlig funksjon save_name () $ this-> name = htmlentities ($ _ POST ['navn'], ENT_QUOTES); returnere "Metode:". __METHOD__. "\ nName:". $ dette-> navn. "\ N";  offentlig funksjon save_email () $ this-> email = htmlentities ($ _ POST ['email'], ENT_QUOTES); returnere "Metode:". __METHOD__. "\ nEmail:". $ this-> email. "\ N";  offentlig funksjon save_both () $ this-> name = htmlentities ($ _ POST ['navn'], ENT_QUOTES); $ this-> email = htmlentities ($ _ POST ['email'], ENT_QUOTES); returnere "Metode:". __METHOD__. "\ nName:". $ dette-> navn. "\ nEmail:". $ this-> email. "\ N"; 

Du kan prøve denne koden på eksempel 1 på demosiden.

Et arbeidseksempel med en enkelt behandlingsfil og en brytererklæring

En annen populær løsning for formbehandling er å konsolidere alle behandlingsskriptene i en fil og avgjøre hva de skal gjøre med dataene ved hjelp av en brytererklæring.

Bryter tilnærming bruker ofte et triks der en skjult inngang legges til skjemaet som inneholder en handling som skal tas ved innsending. Dette
Handlingen brukes da til å bestemme hva man skal gjøre med skjemaet.

Her er de samme tre skjemaene, ovenfra, med tilførte handlinger, som alle peker på en enkelt behandlingsfil:

Skjema 1

Skjema 2

Skjema 3

Og den nye behandlingsfilen ser ut som: (eiendeler / inc / ex2-switch.php)

save_name (); gå i stykker; // Form 2-håndteringscase 'oppdaterings-e-post': $ output = $ account_obj-> save_email (); gå i stykker; // Form 3 håndtering sak 'oppdatering-begge': $ output = $ account_obj-> save_both (); gå i stykker; // Hvis ingen gyldig handling er funnet, er noe ikke riktig standard: die ('Unsupported action.');  // For dette eksempelet, skriv bare ut noen data om skjemainnsendelsen ekko "
Behandlingsfil: ", $ _SERVER ['PHP_SELF']," \ nAction: ", htmlentities ($ _ POST ['action'], ENT_QUOTES)," \ n \ nMetodeutgang:\ n ", $ output"
\ n ","

Gå tilbake til eksempel 2

'; else die ('Ugyldig form innsending');

Du kan se dette i aksjon ved å gå til eksempel 2 på demosiden. Dette er en markert forbedring i forhold til bruk av flere skjemaer, men du kan se at vi fortsatt dupliserer noen kode.

På toppen av det er det en personlig preferanse for meg å unngå bytte om uttalelser når jeg kan. Dette skyldes det faktum at bytte om bruker løse sammenligninger ('en streng' vil utløse tilfelle 0 fordi en streng evaluerer til 0 hvis du konverterer det til et heltall) og er ekstremt Lett å bli spaghetti kode.


Løsning av problemet: Lookup Arrays og Variable Variables

Som vi har sett så langt, har begge de ovennevnte løsningene sine ulemper, og krever duplikatkode. Tenk deg om det var et dusin eller flere former på nettstedet - ikke pen.

For å løse dette problemet kan vi bruke et konsept kalt a lookup array, som kartlegger handlingene som sendes fra skjemaet til en metode som kalles på objektet.

Ja, du kan sette handlingen som metodenavn, men det gjør at en falsk form innsending kan ringe til en offentlig metode. Å gjøre matrisen til et nøkkelverdi-par er et lite skritt for å legge til litt mer kontroll uten mye ekstra arbeid.

Et arbeidseksempel med en enkelt behandlingsfil og et oppslagssystem

Bruk vår kunnskap om variable variabler fra begynnelsen av denne opplæringen, la oss endre vår demo for å bruke et oppslagssystem.

Endre de tre skjemaene for å peke på en ny kontrollerfil:

Skjema 1

Skjema 2

Skjema 3

Deretter legger du sammen behandlingsfilen som håndterer skjemainnlegg (eiendeler / inc / EX3-lookup-array.php):

 'save_name', 'update-email' => 'save_email', 'update-both' => 'save_both'); // Sørg for at array-nøkkelen eksisterer hvis (array_key_exists ($ action, $ lookup_array)) // Bruk variable variabler, ring riktig metode og lagre utdata $ output = $ account_obj -> $ lookup_array [$ action] ();  else die ('Unsupported action.');  // For dette eksempelet, skriv bare ut noen data om skjemainnsendelsen ekko "
Behandlingsfil: ", $ _SERVER ['PHP_SELF']," \ nAction: ", htmlentities ($ _ POST ['action'], ENT_QUOTES)," \ n \ nMetodeutgang:\ n ", $ output"
\ n ","

Gå tilbake til eksempel 3

'; else die ('Ugyldig form innsending');

Sjekk ut dette på demonstrasiden ved å prøve ut skjemaene i eksempel 3.

Siden vi setter handlingen som nøkkel i matrisen, bruker vi array_key_exists () for å sikre at handlingen er gyldig. Deretter bruker vi verdien som tilsvarer handlingen som metodenavnet. Legg merke til at vi har lagt til parentes etter verdien for å sikre at den utføres som en metode.

Tillegget av oppslagsfeltet holder koden konsis, enkel og klar (når du får tak i variabelvariabler).


Sammendrag

Brukes ansvarlig, kan oppslagssammensetninger gjøre skriptene dine lettere å oppdatere og vedlikeholde når du kombinerer dem med variable variabler.

Hvordan tror du at du kan integrere oppslagssammensetninger og variable variabler i prosjektene dine for å gjøre vedlikeholdet enklere? Gi meg beskjed i kommentarene!