Cum de a face prieteni cu vizualizările tip de date, drupalsn - o rețea socială pentru drupal-developers

La solicitarea lucrătorilor am publicat aici vechiul meu articol despre integrarea tipurilor de date din modulul Vederi (Drupal 6).

La dezvoltarea de module pentru Drupal, vom crea adesea noi tipuri de materiale moi (de exemplu, noduri). In timp ce, uneori, este tentant să programeze rapid producția de orice colecție sortată a acestor materiale. De exemplu, nodul de ieșire-orașe, sortate în ordine alfabetică, sau antichitate, sau grupate în funcție de țară. Astfel de colecții utile pot forma suficient pentru a crea programatic și fiecare dintre ele - nu foarte eficient. Mai ales dacă după aceea vrem să schimbăm ceva, să fuzioneze, sau converti. Mult mai ordonat - folosiți modulul Vederi.

Cu toate acestea, imediat ce dezvoltatorul vrea să obțină cu colecția Vizualizare ajutorul datelor create de ele - de exemplu, dintr-un tabel improvizat făcut pentru un nou tip de material - detectează că nu a avut încă Views conștient de masa lui. Deci, spune-ne despre masa ta modulul Vederi pentru totdeauna - în opinia mea, este mult mai precise decât o soluție programată manual toate reprezentările necesare. În continuare - cum să o facă.

Presupun că cititorul știe deja cum să creeze în mod programatic propriile tipuri de materiale. Voi vorbi cu modulul un exemplu în care a fost creat un nou tip. Și să nu publice codul modulului cu un nou tip de descriere, sugerăm doar să descărcați-l:
Descărcați mytest modul.
Modulul este deja pus în aplicare toate în continuare vor fi discutate în articol.

Deci, avem un tip de material testnode. la care am adăugat două câmpuri întregi - int_count și int_total. stocate în tabelul bazei de date # 123; testnode # 125;. Vizualizări preda descărca aceste câmpuri din baza de date, să le imprimați, precum și un fel și să le filtrați de colectare.

Mai întâi de toate, eu asigur opinii cu privire la ce versiune a API folosim (și vom folosi versiunea 2.8 Views cu Drupal 6.x). Pentru a face acest lucru, vom adăuga la dosarul nostru mytest.module provocare cârlig hook_views_api:


Mytest.views.inc apoi creați un fișier în care modulul Vederi pot găsi în mod independent, apelul la cârligele corecte. Este timpul să spunem opinii despre masa noastră. În acest scop, hook_views_data cârlig # 40; # 41;. returnează un tablou cu informații despre următoarele tabele și câmpurile lor. Punerea în aplicare a cârlig ar trebui să returneze un format de date $ array asociativ # 91; 'TABLE_NAME' # 93; # 91; 'Imena_poley' # 93;. De asemenea, în matrice pentru fiecare tabel poate conține date $ subarray # 91; 'TABLE_NAME' # 93; # 91; „Tabelul“ # 93; tabel de informații generale. Luați în considerare cârlig, în ordine:


subarray # 91; „Tabelul“ # 93; Acesta conține informații de bază despre tabel. element # 91; „Grup“ # 93; - un nume pentru grup, în care domeniu le-am promovat vor apărea în listele derulante de opinii. În principiu, puteți specifica numele grupului pentru fiecare dintre domeniile descrise, dar dacă acest lucru nu se face - nume de grup este moștenit de la secțiunea # 91; „Tabelul“ # 93;.

Înainte de a enumera câmpurile de masă # 123; testnode # 125;. un mic digresiune în Views. Ce anume face modulul Vederi, atunci când utilizatorul specifică în user-friendly, deși confuz la prima vedere, argumentele coloana de interfață, filtre, câmpuri, relații și moduri de a sorta? Așa e, punct specific Views modul este SQL-interogare, scos din baza de date a datelor pe care utilizatorul a specificat, și le sortează după cum este necesar pentru utilizator. Astfel încât utilizatorul poate specifica în câmp tabel Vizualizări # 123; testnode # 125;. aveți nevoie pentru a spune modulul Vederi, acesta trebuie să fie introdus în SQL-interogare.

Pentru fiecare dintre domeniile noastre din tabel, putem indica următoarele informații:
# 91; „Titlu“ # 93; - câmp de antet, astfel încât acesta va fi afișat în interfața de utilizator vede;
# 91; „Grup“ # 93; - dacă doriți, putem specifica pentru un grup de alt domeniu decât cel menționat în # 91; „Tabelul“ # 93; ;
# 91; „Ajutor“ # 93; - aici puteți seta textul de ajutor pe acest domeniu, utilizatorul va vedea mici de imprimare de lângă titlul;
# 91; „Câmpul real“ # 93; - în cazul în care datele matrice $, am identificat ca fiind cheia pentru acest domeniu sinonim, în # 91; „Câmpul real“ # 93; În prezent, numele câmpului din tabelul bazei de date trebuie să fie introdusă.

Aceste elemente - titlu, ajutor, grup - au scop mai mult decorativ. În plus față de acestea, avem nevoie pentru a umple o serie de elemente care sunt relevante pentru munca logica Views. Acestea sunt elementele # 91; „Câmp“ # 93;. # 91; „Filtru“ # 93;. # 91; „Sortare“ # 93;. # 91; „Argumentul“ # 93; și # 91; „Raportul“ # 93;. corespunzătoare, respectiv pentru citirea câmpurile din baza de date, câmpurile de filtrare (folosind UNDE), câmpul de sortare (ORDER BY), utilizarea câmpului ca argument (URL) și relația (adică, care unește o altă masă printr-un anumit domeniu). Toate cele cinci elemente trebuie să fie matrice asociative. În ele este necesar pentru a aduce valoarea articolului # 91; 'Handler' # 93;. și, de asemenea, dacă este necesar, elemente suplimentare care pot varia în funcție de # 91; 'Handler' # 93; .

Rădăcina modelului este clasa views_object. și deja din ea moștenit clasa views_handler. clase de fire derivate din views_handler controlează comportamentul elementelor specificate de utilizator reprezentarea (argument, domeniul, filtre și așa mai departe). stivuitoare Ie - o clasă gestionat, a cărui sarcină principală pentru a se asigura că tot ceea ce a trebuit să fie adăugate la o interogare din baza de date la rezultatul dorit a fost obținut care a fost generat de câmpurile de text corecte și așa mai departe. Astfel, utilizatorul poate folosi câmpurile din tabel # 123; testnode # 125; pentru a genera propriile lor idei, trebuie să specificați pentru fiecare domeniu în dreapta handler clase.

Manipulatorii sunt foarte diferite în funcție de tipul de date necesare pentru efectul lor la cerere, complexitatea filtrului, dorim să folosim și altele asemenea. Pentru unitatea noastră de test, avem nevoie de manipulare views_handler_field (pentru introducerea într-o cerere de câmp convențional), views_handler_filter_numeric (la filtru ar putea folosi valoarea câmpului ca număr) și views_handler_sort (handler normale pentru a sorta ASC / DESC fara pervertită). Ca urmare, masa de câmp # 123; testnode # 125; vom descrie după cum urmează:


Acum trebuie să ne întoarcem la secțiunea # 91; „Tabelul“ # 93; $ Date matrice # 91; 'Testnode' # 93;. În plus față de numele grupului, acesta conține informații importante despre dacă acesta este masa de bază, sau trebuie să fie atașat la altul prin generarea de puncte de vedere. tabelul de bază - un tabel care este esențială pentru vizualizări, cum ar fi masa nod pentru vizualizare nod sau tabel de utilizator - pentru vizualizare de utilizare. Fie că baza noastră de masă, ne-ar cere-o în $ date matrice # 91; 'TABLE_NAME' # 93; # 91; „Tabelul“ # 93; # 91; „Baza“ # 93; element # 91; „Câmp“ # 93; (Titlul câmpul cheii primare), # 91; „Titlu“ # 93; (Tabelul antet) # 91; „Ajutor“ # 93; (Text de ajutor) și # 91; „Baza de date“ # 93; (Baza de date de informații în cazul în care tabelul nu este în baza de date Drupal).

Dar, în acest exemplu, tabelul de bază nu, prin urmare, ia în considerare o altă matrice - $ date # 91; 'TABLE_NAME' # 93; # 91; „Tabelul“ # 93; # 91; „Alăturați-vă“ # 93;. În ea, trebuie să furnizeze informații cu privire la modul și la care vizualizările de masă de bază ar trebui să atașeze tabelul de date # 123; testnode # 125; :

După cum arată tabelul nostru câmpurile pentru noul tip de nod testnode, este evident că ne-ar dori să le atașați la masa # 123; nod # 125;. astfel încât câmpul și int_total int_count ar putea fi afișat în nodul View. Pentru această secțiune # 91; „Alăturați-vă“ # 93; vom crea o matrice # 91; „Nod“ # 93; (Baza de nume de tabel) și specificați domeniul, în baza de date care pot fi combinate: „left_field“ - câmp din tabel # 123; nod # 125; și „câmpul“ - câmp din tabel # 123; testnode # 125;. Foi văzute din codul format pe NID câmpul de bază.

În acest tabel de integrare # 123; testnode # 125; terminat. Modulul poate fi instalat imediat și Afișările vă permit să adăugați la punctul de vedere al câmpului și int_total int_count. Puteți sorta și filtru de valorile lor sunt reprezentări tipărite.

Acum, cu toate acestea, rezolva problema prin adaugarea unei „Vyuha“ virtuale, care este inexistentă în tabel # 123; testnode # 125; câmp. Să fie numit un procent și se calculează din valorile curente și int_count int_total conform formulei # 40; int_count * 100 / int_total # 41;. adică reprezintă un anumit procent din numărul de din total. În acest exemplu, să vedem cum se adaugă un câmp virtual în vizualizări, modul de a utiliza un handler cu formula sufixul și cum să scrie moștenirea lor handler existente.

În primul rând, trebuie să adăugați câmpul procentual. pentru care, după cum știm deja, este elementul # 91; „Câmp“ # 93; :


Evident, nu putem folosi standard de câmp handler, deoarece va adăuga la câmpul SQL-interogare „procent“. și Tabelul # 123; testnode # 125; acest domeniu nu este prezent. În schimb, ne-ar dori să nu adăugați la interogare, și de ieșire pentru a obține rezultatul ca număr. Pentru a face acest lucru, vom avea nevoie de propriul handler, pe care o numim mytest_handler_field_percentage. O practică comună în programarea sub vizualizările recomandă ca primul cuvânt în numele handler a fost numele modulului, apoi handler și cuvântul este opțiunea Vizualizări este că gestionează (adică câmpul), iar la sfârșitul numelui câmpului din tabelul bazei de date. Punerea în aplicare a handler localizat în fișierul mytest_handler_field_percentage.inc:


Ca părinte, vom lua views_handler_field_numeric handler. din moment ce această clasă știe deja cum să se ocupe cu câmpurile numerice, și câmpul nostru virtual - acest număr. În primul rând, vom trece peste metoda de interogare # 40; # 41;. care este responsabil pentru modificarea SQL-interogare. În cazul nostru, noi nu vrem să adăugați nimic la cerere, astfel încât metoda de interogare # 40; # 41; - gol.

Apoi deranjează la rezultat, care vor fi înregistrate în domeniu, după punctul de vedere al cererii. Este responsabil pentru această metodă face # 40; valorile $ # 41;. în cazul în care valorile $ object sunt toate citite din valorile de bază de date. Metoda supracomandată face # 40; # 41; vom calcula și a reveni rezultatul citit de pe câmpurile bazei de date și int_total int_count. Rețineți că numele tabelului # 123; testnode # 125; Este un prefix pentru ambele domenii. Dacă int_count int_total sau nu au fost citite din baza de date atunci când interogarea este executată, face metoda # 40; # 41; va reveni 0. Cu toate acestea, această abordare implică faptul că utilizatorul trebuie să adăugați manual câmpurile int_count și int_total prezentare. Dacă vrem să automatizeze procesul și pentru a adăuga aceste domenii ori de câte ori avem nevoie de un procentaj câmp. este necesar să se pună în aplicare metoda add_additional_fields # 40; # 41;. sau adăuga câmpuri int_count și int_total în handler additional_field proprietate în constructor, sau să le adăugați la interogarea direct la metoda de interogare # 40; # 41; .

Acum, atunci când un nou domeniu virtual de descris, ne-ar dori să fie în măsură să rezolve prin aceasta de colectare a datelor. Pentru a face acest lucru, se potrivesc unui views_handler_sort_formula handler existent. Acest lucru necesită o formulă suplimentară de tratare a parametrului de valoare calculată care vor fi sortate de colectare. Formula dorită este inserată în porțiunea Vizualizari anchetă ORDER BY.

De asemenea, dorim să învețe lucruri mostre filtrate din baza de date a procentului câmpului virtual. Pentru aceasta, de asemenea, va crea un nou handler:


Handler mytest_handler_filter_percentage situat în eponimă .inc-fișier. Acesta va moșteni din numeric-filtru:

Aici vom suprascrie metoda de interogare # 40; # 41; cu formula noastră s-a adăugat în locul numelui câmpului în cererea where-o parte. Pentru a face acest lucru, noi numim prima $ acest lucru -> ensure_my_table # 40; # 41; vom vedea că cererea va fi adăugat la numele tabelului, care conține câmpul și int_total int_count. determină apoi o operație conform căreia există o filtrare și indică funcționarea formulei noastre. Sense moștenire numeric-filtru care deja definit numerele de operare comparație (mai mare sau egală cu, mai puțin, etc) pentru ea. De fapt, punerea în aplicare a unei metode de copiat punerea în aplicare a părintelui necesar pentru a schimba numai valoarea câmpului $.

În cele din urmă, înainte de vizualizările vor vedea noile noastre stivuitoare, trebuie să adăugați hook_views_handlers cârlig fișier de implementare mytest.views.inc:


Huck returnează doar o serie de stivuitoare noi cu informațiile despre care clasele moștenesc stivuitoare și ce fișiere să le caute.
Asta e tot. Am învățat Views pentru a citi, de afișare și de a folosi pentru a sorta și filtra rezultatele interogării câmp procentual virtual. Rămâne doar pentru a goli cache-ul de la „admin / build / opinii / unelte“ pagina Vederile și modulul este gata de funcționare. Problema este rezolvată.

Acest SOM, mai degrabă decât prin satelit, cred că motoarele de căutare inteligente înțeleg