Simplificați manipularea formularului într-o modalitate mare

Economisiți timp, reduceți durerile de întreținere, simplificați codul și faceți totul în timp ce vă simțiți ca un geniu ciudat! În acest tutorial, învățați cum să utilizați variabile variabile, matrice de căutare și un pic de programare inteligentă pentru a simplifica manipularea formelor într-un mod mare.


Variabile variabile, metode și proprietăți

Înainte de a ajunge prea adânc în utilizarea unei matrice de căutare, este important să înțelegem mai întâi conceptul din spatele variabilelor variabile.

Care sunt variabilele variabile??

Variabila variabilă este un termen care descrie utilizarea unei variabile pentru a declara o altă variabilă.

În forma cea mai simplă, o variabilă variabilă ar putea să arate ca:

 $ foo = 'O valoare!'; // Declarați o valoare inițială $ bar = 'foo'; / / Așteptați, ce se întâmplă? echo $$ bar; // Sfinte! Această ieșire "O valoare!"

De ce ar trebui să vă îngrijiți??

Când te uiți la o dovadă a conceptului ca exemplul precedent, folosirea variabilelor variabile probabil pare destul de prostească și prea complicată. Cu toate acestea, există într-adevăr motive serioase și practice pentru a le folosi în unele cazuri.

Exemple practice

Utilizarea responsabilă a variabilelor variabile poate reduce drastic cantitatea de cod care trebuie repetată, de exemplu, transformând o matrice asociativă într-un obiect cu valori dezinfectate.

Exemplu fără variabile variabile

$ comment = pentru noi stdClass (); // Creați un obiect $ 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']);

Exemplu cu variabile variabile

$ comment = pentru noi stdClass (); // Creați un foreach nou obiect ($ array ca $ key => $ val) $ comment -> $ key = sanitize_values ​​($ val); 

Vezi cât de simplu a fost asta? Și vă puteți imagina ce exemplu fără variabilele variabile ar arăta dacă matricea avea ceva de genul 50 sau 100 de valori.

NOTĂ: Sunt conștient de faptul că puteți folosi de asemenea array_map () și a exprimat în mod explicit matricea ca obiect pentru a realiza același lucru. Nu asta e ideea. Noi ilustrăm un concept, aici. Joacă de-a lungul.


Problema cu procesarea formularelor

Faceți o prelucrare a formei o briză.

Acum, că știți cum să utilizați variabilele variabile, putem trece la carnea și cartofii din acest articol, care este ideea că încorporarea unei arhive de căutare în loc de mai multe fișiere controler sau o declarație de comutare vă poate economisi o mulțime de întreținere suplimentară, cod repetat și dureri de cap în general.

Pentru a ilustra conceptul nostru, vom folosi ideea de procesare a formei. Acesta este un aspect esențial al programării web, și poate fi, de asemenea, una dintre cele mai plictisitoare domenii ale oricărui proiect.

Cu toate acestea, după reevaluarea obiceiurilor dvs. de codare, puteți face ca prelucrarea formelor să fie o briză.

În mod frecvent, este creat fie un fișier individual pentru fiecare formular care urmează să fie procesat, fie o declarație de comutare. În această secțiune, vom trece peste modul în care ambele soluții ar putea fi implementate, iar apoi vom examina o soluție care utilizează variabile variabile și cum poate îmbunătăți proiectele dvs..

Un exemplu de lucru cu mai multe fișiere de procesare a formelor

O metodă adesea folosită pentru a gestiona trimiterile de formulare este crearea unui fișier cu totul nou pentru a gestiona datele fiecărui form separat.

Luați, de exemplu, aceste trei formulare care actualizează un cont de utilizator cu un nume nou, noul e-mail sau ambele:

Formularul 1

Formularul 2

Formularul 3

Fiecare dintre aceste formulare indică un fișier de procesare diferit. Deci, ce arată fiecare dintre aceste fișiere?

Formularul de procesare 1 (active / inc / ex1-form1.php)

save_name (); // Pentru acest exemplu, ieșiți doar câteva date despre ecoul de trimitere a formularului "
Fișier de procesare: ", $ _SERVER ['PHP_SELF']," \ n \ nIeșirea metodei:\ n ", $ output,"
\ n ","

Întoarce-te

„; else die ("Trimitere nevalidă a formularului");

Formularul de procesare 2 (active / inc / ex1-form2.php)

save_email (); // Pentru acest exemplu, ieșiți doar câteva date despre ecoul de trimitere a formularului "
Fișier de procesare: ", $ _SERVER ['PHP_SELF']," \ n \ nIeșirea metodei:\ n ", $ output,"
\ n ","

Întoarce-te

„; else die ("Trimitere nevalidă a formularului");

Formularul de procesare 3 (active / inc / ex1-form3.php)

save_both (); // Pentru acest exemplu, ieșiți doar câteva date despre ecoul de trimitere a formularului "
Fișier de procesare: ", $ _SERVER ['PHP_SELF']," \ n \ nIeșirea metodei:\ n ", $ output,"
\ n ","

Întoarce-te

„; else die ("Trimitere nevalidă a formularului");

După cum puteți vedea clar, fișierele de mai sus exemplifică duplicarea unei tone de cod. Extindeți acest lucru la 15 formulare de pe un site și veți găsi rapid că întreținerea ar putea deveni un coșmar.

Clasa de cont

După cum puteți vedea, fișierele de procesare creează o instanță a clasei CopterLabs_Account. Aceasta va fi o clasă foarte simplă care transmite informații despre o trimitere a formularului.

Iată codul pentru clasă (active / 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 * / clasa CopterLabs_Account public $ nume = NULL, $ email = NULL; funcția publică save_name () $ this-> name = htmlentities ($ _ POST ['name'], ENT_QUOTES); retur "Metoda:". __METHOD__. "\ nNumele:". $ this-> name. "\ N";  funcția publică save_email () $ this-> email = htmlentities ($ _ POST ['email'], ENT_QUOTES); retur "Metoda:". __METHOD__. "\ nEmail:". $ this-> email. "\ N";  funcția publică save_both () $ this-> name = htmlentities ($ _ POST ['name'], ENT_QUOTES); $ this-> email = htmlentities ($ _ POST ['e-mail'], ENT_QUOTES); retur "Metoda:". __METHOD__. "\ nNumele:". $ this-> name. "\ nEmail:". $ this-> email. "\ N"; 

Puteți încerca acest cod la exemplul 1 de pe pagina demo.

Un exemplu de lucru cu un singur fișier de procesare și o declarație de comutare

O altă soluție populară pentru procesarea formelor este de a consolida toate scripturile de procesare într-un singur fișier și de a determina ce să facă cu datele utilizând o comutare de comutare.

Abordarea de comutare utilizează în mod obișnuit un truc în care se adaugă o intrare ascunsă la formularul care conține o acțiune care trebuie luată la depunere. Acest
acțiunea este apoi utilizată pentru a determina ce trebuie făcut cu formularul.

Aici sunt aceleași trei forme, de sus, cu acțiuni adăugate, toate indicând un singur fișier de procesare:

Formularul 1

Formularul 2

Formularul 3

Iar noul fișier de procesare arată astfel: (active / inc / EX2-switch.php)

save_name (); pauză; // Formul 2 de manipulare 'update-email': $ output = $ account_obj-> save_email (); pauză; // Formularul 3 de manipulare 'update-both': $ output = $ account_obj-> save_both (); pauză; // Dacă nu se găsește nicio acțiune validă, ceva nu este implicit în mod corect: die ("Acțiune neacceptată");  // Pentru acest exemplu, ieșiți doar câteva date despre ecoul de trimitere a formularului "
Fișier de procesare: ", $ _SERVER ['PHP_SELF']," \ nAcțiune: ", htmlentities ($ _ POST ['action'], ENT_QUOTES)Ieșirea metodei:\ n ", $ output,"
\ n ","

Reveniți la exemplul 2

„; else die ("Trimitere nevalidă a formularului");

Puteți vedea acest lucru în acțiune vizitând Exemplul 2 de pe pagina demo. Aceasta este o îmbunătățire semnificativă față de utilizarea mai multor formulare, dar puteți observa că în continuare reproducem un anumit cod.

În plus, este o preferință personală a mea să evit intrerupator declarații ori de câte ori pot. Acest lucru se datorează faptului că intrerupator utilizează comparații libere ('o sfoară' va declanșa cazul 0 deoarece un șir evaluează 0 dacă îl convertiți la un număr întreg) și este extrem ușor de transformat în cod spaghete.


Remedierea problemei: Rețelele de căutare și variabilele variabile

După cum am văzut până acum, ambele soluții de mai sus au dezavantajele lor și necesită un cod duplicat. Imaginați-vă dacă au existat o duzină sau mai multe forme pe site-ul - nu frumos.

Pentru a rezolva această problemă, putem folosi un concept numit a lookup matrix, care hărți acțiunile trecute de la formular la o metodă chemată pe obiect.

Da, puteți seta acțiunea ca nume de metodă, dar care permite trimiterea unei forme false pentru a apela orice metodă publică. Făcând matricea o pereche cheie-valoare este un pas mic pentru a adăuga un pic mai mult control fără prea multă muncă suplimentară.

Un exemplu de lucru cu un singur fișier de procesare și o matrice de căutare

Folosind cunoștințele noastre despre variabilele variabile de la începutul acestui tutorial, să ne modificăm demo-ul pentru a utiliza o matrice de căutare.

Modificați cele trei formulare pentru a indica un nou fișier de controler:

Formularul 1

Formularul 2

Formularul 3

Apoi, puneți împreună fișierul de procesare care se va ocupa de depunerea formularului (active / inc / ex3-lookup-array.php):

 'save_name', 'update-email' => 'save_email', 'update-both' => 'save_both'); // Asigurați-vă că există cheia matricei dacă (array_key_exists ($ action, $ lookup_array)) // Folosind variabilele variabile, apelați metoda corespunzătoare și stocați outputul $ output = $ account_obj -> $ lookup_array [$ action] ();  else die ("Acțiune neacceptată.");  // Pentru acest exemplu, ieșiți doar câteva date despre ecoul de trimitere a formularului "
Fișier de procesare: ", $ _SERVER ['PHP_SELF']," \ nAcțiune: ", htmlentities ($ _ POST ['action'], ENT_QUOTES)Ieșirea metodei:\ n ", $ output,"
\ n ","

Reveniți la exemplul 3

„; else die ("Trimitere nevalidă a formularului");

Verificați acest lucru pe pagina demo, încercând formularele din Exemplul 3.

Deoarece am setat acțiunea ca cheie în matrice, folosim array_key_exists () pentru a vă asigura că acțiunea este validă. Apoi, folosim valoarea care corespunde acțiunii ca nume de metodă. Observați că am adăugat parantezele după valoare pentru a ne asigura că este executată ca metodă.

Adăugarea matricei de căutare păstrează codul concis, simplu și clar (odată ce obțineți blocarea variabilelor variabile).


rezumat

Folosite în mod responsabil, matricele de căutare pot face scripturile dvs. mult mai ușor de actualizat și de menținut atunci când le combinați cu variabilele variabile.

Cum credeți că puteți integra matricea de căutare și variabilele variabile în proiectele dvs. pentru a ușura întreținerea? Anunță-mă în comentariile!

Cod