Formarea ușoară a formelor utilizând FuelPHP

Datorită clasei de campuri FuelPHP, lucrul cu formularele nu ar putea fi mai ușor. Cu câteva linii de cod, puteți genera și valida cu ușurință un formular. Astăzi, vom învăța cum să facem asta!


FIELDSET clasa este folosită pentru a crea un formular și pentru a gestiona validarea acestuia într-un mod orientat pe obiecte. Utilizează Formă și Validare clase. Această clasă, ea însăși, este destinată doar modelării câmpului de câmp și a câmpurilor sale, în timp ce celelalte două clase realizează greutatea lucrării.


Reglați combustibilul

Avem nevoie de o instalare FuelPHP cu un pachet RM activat. Voi folosi o bază de date MySQL cu un tabel de probă. In timp ce FIELDSET clasa poate fi configurat să utilizeze un model normal, folosind un ORM ne va salva ceva timp.

Dacă nu ați revizuit primele două părți ale seriei FuelPHP aici pe Nettuts +, acum este momentul potrivit pentru a verifica partea a doua și a două, de Phil Sturgeon.

Configurați o conexiune la baza de date la combustibil / app / config / dezvoltare / db.php.

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

Activați pachetul ORM combustibil / app / config.php

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

Și, în sfârșit, iată SQL pentru masa pe care o folosesc pentru acest tutorial.

 CREATE TABLE 'blog'. 'Posturi' ('id' INT NULL AUTO_INCREMENT PRIMARY KEY, 'post_title' VARCHAR (100) NOT NULL, 'post_content' TEXT NOT NULL, VARCHAR (80) NU NULL, 'autor_website' VARCHAR (60) NULL, 'post_status' TINYINT NULL) ENGINE = INNODB;

Model

Avem nevoie de un model pentru controlorul nostru pentru a interacționa cu tabela de postări. Mergeți și creați o post.php interior app / clase / modelul /. Creeaza o Model_Post și asigurați-vă că se extinde \ Orm \ model. ORM va folosi automat posturi tabel în baza noastră de date, deoarece am folosit singularul "posturilor". Dacă doriți să setați o altă tabelă, configurați o proprietate statică numită $ _table_name.

 clasa Model_Post extinde \ Orm \ Model static protejat $ _table_name = 'posturi'; // setați manual numele mesei

Configurarea proprietăților

Ar trebui să specificăm coloanele tabelului nostru de posturi în cadrul modelului nostru. În același timp, putem, de asemenea, să creăm etichete, să formăm reguli de validare pentru a fi utilizate cu clasa de câmpuri pentru a genera formularul. Toate acestea merg într-o matrice asociată, numită $ _properies. Cu totul în loc, modelul nostru final ar trebui să arate așa:

 clasa Model_Post extinde \ Orm \ Model static protejat $ _table_name = 'posturi'; protejat static $ _properties = array ('id', 'post_title' => array (// numele coloanei 'data_type' => 'string', 'label' => '=> array (' obligatoriu ',' max_length '=> array (100),' min_length '=> array (10)) // reguli de validare,' post_content '=> , 'label' => 'Conținutul postului', 'validarea' => array ('obligatoriu')),'name_name '=> array (' data_type '=> 'validation' => array ('required', 'max_length' => array (65), 'min_length' => array (2))), 'author_email' etichetă '=>' Autor e-mail ',' validare '=> array (' obligatoriu ',' valid_email ')),' autor_website '=> array (' data_type '=> ',' validare '=> array (' cerut ',' valid_url ',' max_length '=> array (60))),' post_status ' 'Post', 'validare' => array ('obligatoriu'), 'form' => array ('type' => ished ', 2 =>' Draft ')),)); 

Să examinăm ce opțiuni putem folosi. data_type pur și simplu deține tipul câmpului. Ar putea fi string, integer sau mysql_date. Valoarea pentru eticheta proprietatea va fi afișată ca etichetă de câmp de îndată ce formularul va fi generat. validare acceptă o serie de reguli de validare. În mod implicit, aceste câmpuri vor fi câmpuri de introducere a textului. Utilizarea formă, puteți face o selectare sau texarea.

ORM tratează coloana numită id ca primar și nu va fi afișat la generarea unui formular. Dacă coloana cheii primare a mesei este diferită, utilizați $ _primary_key proprietate pentru ao specifica.

 / ** * Post Model * / clasa Model_Post extinde \ Orm \ Model static protejat $ _table_name = 'posturi'; protejat static $ _primary_key = array ('id'); // puteți seta mai multe coloane, ... $ _primary_key => array ('id', 'user_id')

Controlor

Acum că modelul este gata, să creăm controlerul. Controlorii ar trebui plasați în interiorul combustibil / app / clase / controler /. Am creat un controler, numit Controller_Posts (posts.php) și l-au extins Controller_Template.

 / ** * Controlerul postului combustibil / app / classes / controller / posts.php * / clasa Controller_Posts se extinde \ Controller_Template // lista posturilor functie action_index ()  // adauga o noua functie action_add ()  action_edit ($ id) 

Utilizatorii vor putea să vadă o listă de postări, să adauge altele noi sau să editeze una deja existentă. Pentru că folosesc controlerul șablonului, pot folosi un fișier de șablon de bază pentru a lucra cu. Șabloanele intră combustibil / app / opinii / template.php

        

0): a>
    ', mesaj $,'„; ?>

Acesta este doar un marcaj HTML standard cu bootstrap-ul Twitter. conținut $ variabilă va avea conținutul. Putem seta o serie de mesaje și dacă o vom face, va fi tipărită ca o listă neordonată.


Adăugarea de postări noi

Aici începe distracția. Vom genera formularul pentru adăugarea de postări noi. Așa cum ați fi ghicit, vom lucra cu action_add () metodă. Să generăm formularul și să îl transmitem șablonului nostru.

 // adăugați o nouă funcție action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ this-> template-> set ('conținut', $ form-> build (), false); // false va spune combustibilului să nu convertească etichetele html la șirul de siguranță. 

FIELDSET :: forja () va returna o nouă instanță a clasei de câmpuri. E același lucru cu a face new Fieldset. Cu toate acestea, folosind forja aici, putem numi instanțele noastre. Dacă apelăm o instanță de două ori cu același nume, o instanță existentă va fi returnată dacă este disponibilă [modelul fabricii]. Pentru a numi instanța dvs., treceți numele la forja metodă. FIELDSET :: forja ( 'new_post')

Utilizarea add_model , trecem modelul pe care dorim să îl formăm. Setul de câmpuri va lua datele de la $ _properties pentru a genera formularul. Apelarea formă() metoda de la obiectul set de câmpuri va returna o instanță de la Formă clasa, și prin apelarea construi() , putem obține o ieșire html (șir) a formularului.

 $ this-> template-> set ('conținut', $ form, false);

În cele din urmă, noi trecem forma $ la șablon ca conținut. O altă metodă de trecere a variabilelor la un șablon este $ this-> template-> content = $ form.

Porniți browserul dvs. și navigați la http: //path_to_site/index.php/posts/add. Ar trebui să vedeți un formular identic cu acesta.

Niciun buton de trimitere? Să rezolvăm asta. Trebuie să adăugăm un câmp nou obiectului nostru de formă.

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

Utilizarea adăuga metodă putem adăuga câmpuri suplimentare la formularul nostru. Primul parametru este numele noilor câmpuri, al doilea este pentru etichetă, pentru al treilea parametru trecem un șir de atribute.

După ce adăugăm acest lucru, action_add () va arata asa.

 funcția action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ form-> add ('submit', ', array (' type '=>' submit ',' value '=>' add ',' class '=> -> set ('conținut', $ form-> build (), false);

Și forma noastră ...


Validarea și salvarea

Acum, că avem o formă frumoasă, să o validăm și să o salvăm în baza de date. Obiectul set de câmp include o instanță din clasa de validare a FuelPHP. Toate regulile au fost aplicate și sunt gata de plecare.

 funcția action_add () $ fieldset = Fieldset :: forge () -> add_model ('Model_Post'); $ form = $ fieldset-> form (); $ form-> add ('submit', ', array (' type '=>' submit ',' value ' > validare () -> run () == true) $ fields = $ fieldset-> validated (); $ post- = post_content; $ post-> post_title = $ fields; = $ fields ['post_content']; $ post-> author_website = $ fields ['author_website']; $ post-> author_website = $ fields; ; $ post-> post_status = $ fields ['post_status']; dacă ($ post-> save ()) \ Response :: redirect ('posts / edit /'.$ post-> id) $ this-> template-> messages = $ fieldset-> validarea () -> erori (); $ this-> template-> set ('content', $ form-> build ();

$ Fieldset-> validare () returnează o instanță de clasă de validare și accesând-o alerga() metodă putem verifica dacă validarea este trecută. Dacă da, adăugăm o nouă postare în baza noastră de date. $ Fieldset-> validate () va returna o serie de câmpuri validate. În cazul în care validarea este trecută și postarea este salvată, utilizatorul va fi redirecționat către pagina de editare, în caz contrar va transmite erorile de validare șablonului nostru ca variabilă de mesaj.

Dacă încercați să trimiteți unele date nevalide, veți obține o ieșire cum ar fi:

Totul pare bine, cu excepția unei singure probleme: datele pe care le trimitem nu apar după reîmprospătarea paginii. Nu vă faceți griji, sunați la o metodă și ați terminat.

 $ fieldset = Fieldset :: forge () -> add_model ('Model_Post') -> repopulați (); // repopulate va umple formularul cu datele postate

Tare nu? Adăugați unele date valide și se va redirecționa la action_edit () care nu este încă pregătită.


Editarea unei postări

Editarea unei secțiuni este aproape aceeași cu cea a secțiunii noastre de postare. Cu excepția cazului în care trebuie să populam datele cu un post existent. Voi duplica action_add cod.

 funcția action_edit ($ id) $ post = \ Model_Post :: find ($ id); $ fieldset = Fieldset :: forge () -> add_model ('Model_Post') -> populate ($ post); // modelul de obiect post este transferat metodei populate $ form = $ fieldset-> form (); $ form-> add ('trimite', ', array (' type '=>' submit ',' value '=>' save ',' class '=>' btn medium primary ' > validare () -> executați () == true) $ fields = $ fieldset-> validated (); // post = new Model_Post; $ post-> post_title = $ fields ['post_title' > post_content = $ fields ['post_content']; $ post-> author_name = $ fields ['autor_name']; $ post-> author_email = $ fields ['author_email']; $ post-> author_website = $ fields ['author_website '$ post-> post_status = $ fields [' post_status ']; dacă ($ post-> save ()) \ Response :: redirect (' posts / edit /'.$ id) ($) -> ($) -> ($) -> ()

Cu unele modificări minore ale noastre action_add () metodă, avem metoda noastră de editare. repopula() metoda a fost înlocuită cu popula() metodă. Utilizarea popula , putem să inserăm un formular cu datele postului existent.

În acest caz, luăm postul din baza noastră de date folosind $ id parametru, apoi treceți-l la metoda necesară. Nu avem nevoie $ post = nou model_post; mai mult pentru că nu adăugăm nimic la baza de date. $ postare Obiectul pe care îl creăm la început este folosit pentru a atribui noile valori. Odată editat, acesta va redirecționa înapoi la ecranul său de editare. Au fost efectuate! Adăugați unele postări și încercați să le editați.


Pagini de înscriere

Să construim secțiunea de listare, astfel încât utilizatorii să poată vedea toate postările într-un singur loc.

Lista este gestionată de către action_index () metodă

 // lista posturilor funcția action_index () $ posts = \ Model_Post :: find ('toate'); $ view = \ View :: forge ("listă"); $ view-> set ('posts', $ posts, false); $ this-> template-> content = $ vizualizare; // În fișierul de configurare Vizualizarea obiectelor este listată pe listă, astfel încât Fuelphp nu va scăpa de html. 

Model_Post :: gasi ( 'toate') va returna o serie de postări pentru toate postările noastre. Utilizarea Vezi :: forja (), un nou obiect de vizualizare este instanțiat. Parametrul pentru Vezi :: forja () este numele pentru viziunea noastră specifică. Se află la app / views / listing.php. Cadrul de obiecte de posturi (posturi $) este apoi trecut la punctul nostru de vedere. Vizualizarea listei va avea grijă de înregistrare și, în final, îi vom asocia vizualizarea $ This-> templat-> conținut.

În punctul de vedere, ne străbatem posturi $ și să genereze lista.

  

POST_TITLE; ?> id, '[Editare]');?>

POST_CONTENT; ?>

De numele autorului; ?>
author_email; ?>
author_website; ?>

Dacă aveți orice postări în baza de date, acesta va arăta cam așa.


Unele modificări finale

Totul pare să funcționeze corect; cu toate acestea, există câteva probleme minore. Formularul generat are un câmp de text pentru conținutul mesajului, care ar fi mai bine ca o textare.

 // Model_Post 'post_content' => array ('data_type' => 'string', 'label' => 'Post Content', 'validation' => '=>' textarea ') // ne va da textarea),

Puteți transmite toate tipurile de câmp text, textarea, selectați, radio etc. Pentru elemente selectate sau radio, puteți seta opțiunile. Este posibilă și opțiunile de setare pentru un alt tabel selectat. Dacă doriți să modificați aspectul implicit, plasați un fișier de configurare a formularului combustibil / app / config / form.php Dacă nu sunteți sigur de ce să puneți acolo, copiați lucrurile combustibil / core / config / form.php. Combustibilul folosește acest fișier pentru a genera formularele.


rezumat

Sper că aveți acum o înțelegere clară a clasei de campuri. Dacă aveți întrebări, anunțați-ne în comentariile de mai jos. Vă mulțumesc foarte mult pentru lectură!

Cod