Puncte:0

Crearea unui formular într-un câmp de vizualizare personalizat

drapel cn

Lucrez la un pic de funcționalitate care permite ca un „formular” să fie încorporat într-un câmp de vizualizări personalizate într-o vizualizare la care lucrez.

Vizualizarea este o listă de tabel cu entități „solicitate”. Ultima coloană din tabel pentru fiecare rând este un formular de „editare rapidă”, care are un formular personalizat cu câteva câmpuri pe el (în funcție de entitatea afișată în rândul curent). Încerc să îmi dau seama cum să construiesc un plugin/câmp de vizualizări personalizate care să mă permită să redau un formular de lucru. Știu cum să fac logica pentru a afișa câmpurile necesare în mod condiționat și știu cum să construiesc un formular normal, dar nu sunt sigur cum să construiesc unul într-un câmp de vizualizări.

Am folosit `drush generate plugin-views-field' și pot reda elemente de formular în metoda render(), dar de fapt nu fac nimic, deoarece un formular nu este de fapt generat.

Ar fi mai ușor/posibil să creez un formular în module/src/Form (care acceptă argumente suplimentare) și să redăm acel formular folosind formBuilder->getForm() sau există o modalitate prin care pot construi și reda formularul în interiorul unei vizualizări conecteaza?

Formularul trebuie să funcționeze prin ajax, astfel încât să puteți face editarea rapidă fără a reîncărca pagina.

Orice ajutor ar fi foarte apreciat.

Conform comentariilor de mai jos, se pare că pot face ceva de genul:

$form = \Drupal::formBuilder()->getForm('Drupal\resume\Form\WorkForm');
$form->sub_id = id;
returnează $form;

Pentru a reda formularul și apoi în interiorul formbuilderului, utilizați variabila sub_id pentru a o atașa la elementul de apelare și wrapper ajax.

Puncte:1
drapel cn

Da, pentru un formular Drupal aveți nevoie de o clasă de formular procesată de FormBuilder. Puteți plasa formularul rezultat oriunde pe pagină, câmpurile de vizualizare nu sunt diferite de alte elemente ale paginii, cum ar fi, de exemplu, blocurile. Este dificil în cazul dvs. să aveți mai multe instanțe ale aceluiași formular pe pagină. Apoi, aveți nevoie de ID-uri unice de formular, învelișuri ajax și elemente de trimitere. Vedea Folosind același formular de mai multe ori pe pagină cu apeluri AJAX

De asemenea, rețineți că Views Ajax și Form API Ajax au puncte finale diferite, iar utilizarea ambelor împreună aduce mai multă complexitate. Vedea Activarea AJAX în Views întrerupe butonul AJAX din API-ul formularului (Drupal 8)

Ex0r avatar
drapel cn
Da, planul meu a fost să permit constructorului de formulare să accepte argumente suplimentare care vor fi transmise în formular la nivel de câmp de vizualizări, ceea ce ar fi transmiterea ID-ului unic al entității (unul pe rând) în formular, astfel încât să pot construi ID-ul formularului ca #formă- și setați corect elementul wrapper pe baza parametrilor trecuți. Vizualizările ajax și form ajax sunt ceva ce nu m-am luat în considerare încă. Mă gândeam că formularul ajax va rula în culise ca în mod normal și ar declanșa/reconstruiește formularul atunci când va trebui.
4uk4 avatar
drapel cn
Acesta pare un plan bun. BTW, în acest caz, nu puteți trece parametrii formularului prin metoda de compilare. Pentru ID-ul formularului, trebuie să injectați parametrul înainte de a invoca generatorul de formulare, așa cum se arată în subiectul legat. Atâta timp cât nu activați Ajax în Views, puteți ignora a doua parte.
Ex0r avatar
drapel cn
Am actualizat întrebarea pentru a reflecta modificările dvs. Vi se pare corect? În plus, pe pagină există vizualizări ajax, dar folosește modulul views_expandable_table pentru a extinde/restrânge ultima coloană a fiecărui rând de tabel într-un rând suplimentar. Nu sunt sigur dacă va interfera cu forma ajax sau nu, dar o voi încerca. În plus, nu știu cum să actualizez rândul tabelului odată ce formularul este trimis efectiv (formularul este capabil să actualizeze câteva valori enumerate în rândul tabelului corespunzător ca o coloană).
4uk4 avatar
drapel cn
În apelarea ajax puteți actualiza orice parte a paginii, de asemenea, în afara formularului. - Apropo, în întrebarea dvs. editată nu ați folosit exemplul de cod corect din subiectul legat, trebuie să injectați parametrul înainte de a invoca FormBuilder.[FormBuilder::getForm()](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormBuilder.php/function/FormBuilder%3A%3AgetForm) acceptă ambele, un formular numele clasei sau un obiect formular deja instanțiat.
Ex0r avatar
drapel cn
Asta pare contraproductiv. FormBuilder->getForm() nu creează o clasă instanțiată a formularului? Bănuiesc că nu înțeleg de ce trebuie mai întâi să instanțiați o clasă printr-o altă metodă când formbuilder-ul creează deja un obiect instanțiat. O sa incerc totusi.
Ex0r avatar
drapel cn
Am ajuns să fac niște teste și ceea ce ai legat ai ajuns să funcționeze. Încă trebuie să îmi dau seama cum să re-declanșez interogarea vizualizărilor pentru a rula din nou pe apel invers Ajax pentru rândul specificat, dar pot lucra la asta după ce formularul funcționează. Mulțumesc!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.