[Symfony] Formularz z kolekcją ale trochę inaczej |
[Symfony] Formularz z kolekcją ale trochę inaczej |
9.12.2017, 23:04:27
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
Otóż mam taki problem. Z bazy pobieram informację o pewnej grupie użytkowników. Będę te informacje wyświetlać w tabeli. W jednym z pół tabeli ma się znaleźć niewielki TextArea za pomocą którego (via AJAX) zostanie do bazy dopisany komentarz dotyczący wybranego użytkownika.
I teraz tak. Wymyśliłam sobie, że cała tabelka powinna być formularzem a te pola TextArea powinny być kolekcją. Tylko jak zrobić, żeby indeksy odpowiadały ID usera. Czyli jesli w tabelce mam userów o id 5,12 i 17 to chcę miec tam pola A może to bez sensu robić to za pomocą FormBuildera skoro i tak będzie obsłużone AJAX-em? Ten post edytował JoShiMa 9.12.2017, 23:05:00 -------------------- |
|
|
10.12.2017, 01:36:21
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
Cytat Wymyśliłam sobie, że cała tabelka powinna być formularzem a te pola TextArea powinny być kolekcją - słabo, ponieważ formularze powinny jak najbardziej odpowiadać encjom. Im bardziej odejdziemy od struktury danych tym większe problemy w implementacji, formularze w symfony są zaprojektowane pod kątem współpracy z encjami.Najprostsze rozwiązanie to dodanie formularza "UserForm" do wysyłanej do widoku kolekcji, np. tak:
Potem wystarczy jedynie wyrenderować i jeśli mamy akcję do edycji usera via ajax to nie musimy już prawie nic robić poza podpięciem formularza do tej akcji. Oczywiście trzeba wziąć pod uwagę takie rzeczy jak: - csrf - walidacja - obsługa błędów - edycja? Jeśli dodanie formularza do każdego rekordu jest z jakiś powodów (np. wydajność) problematyczne, to można formularz wygenerować znów via ajax oddzielnie dla każdego rekordu. Kolejna opcja to wygenerowanie formularza w JS na onclick bez żadnego requestu, jednak to wiąże się z dość dużym nakładem pracy i powoduje liczne problemy (np. z różnicami w renderowaniu pomiędzy PHP a JS). I znów na ostatnim miejscu można to zrobić całkowicie ręcznie, jednak wtedy musimy implementować wszystko sami (np. walidację). Takie rozwiązanie polecałbym w ostateczności, bo często z jakiś powodów nie da się inaczej. |
|
|
10.12.2017, 11:18:59
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
Powinnam generować cały formularz nawet jeśli potrzebuję z mienić w locie jedno pole (dodać komentarz do usera a w innym miejscu tj na innej podstronie zmienić wartość jakiegoś pola z 0 n 1)?
-------------------- |
|
|
10.12.2017, 18:39:39
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
Generować w sensie, że renderować? Niezupełnie, nawet jeśli używamy formularza (np. UserForm), który zawiera wszystkie pola to definiujemy w nim opcję "mode", która może być np. "add", "edit", "comment" czy "changePassword", czyli parametryzujemy ten formularz. Formularz musi być zgodny z requestem, inaczej będą problemy z walidacją, nadmiarowymi polami czy też pozwolimy zmienić coś co nie powinno być zmienione.
Oczywiście jeśli logiki przybywa to formularz warto podzielić np. na oddzielne od edycji, dodawania czy komentowania - to już od nas zależy. |
|
|
10.12.2017, 23:13:44
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
Dopiero się uczę. Jak wyrenderować poprawnie w widoku taki formularz podpięty do poszczególnych elementów kolekcji w sposób jaki pokazałeś w pierwszym poście?
kiedy próbuję renderować poszczególne formularze w pętli w szablonie dostaję komunikat: Type error: Argument 1 passed to Symfony\Component\Form\FormRenderer::renderBlock() must be an instance of Symfony\Component\Form\FormView, null given, called in
Ten post edytował JoShiMa 11.12.2017, 01:35:36 -------------------- |
|
|
11.12.2017, 12:37:26
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
|
|
|
12.12.2017, 04:12:49
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
Rzeczywiście mój błąd. chciałabym Cię jeszcze poprosić o pomoc w jednej sprawie.
Mam dwie encje połączone taką relacją:
Próbuję zrobić do tego pewien formularz. Jeśli zrobię to tak:
to wtedy mam po wygenerowaniu formularza w tych polach mam w wartości 'username' zamiast 'id'. Jeśli taki formularz wyślę ajaxem to nijak nie umiem go zwalidować. -------------------- |
|
|
12.12.2017, 11:04:59
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
Jeśli w encji jest relacja to w formularzu pole powinno być np. EntityType. HiddenType można mapować string lub int. Jeśli potrzebujemy zamiast np. selecta wpisać id to trzeba skorzystać z data transformers:
https://symfony.com/doc/current/form/data_transformers.html ale tak szczerze to lepiej tego unikać, bo to prawie niczego nie rozwiązuje a stwarza kolejne problemy. Zresztą pisałem już chyba o tym, że im bardziej formularz przypomina encję (lub jej część) tym lepiej. I zawsze lepiej jest najpierw zrobić tradycyjnie, a dopiero gdy wszystko działa to podpinamy pod AJAX, modale etc. |
|
|
13.12.2017, 01:30:59
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
Sądziłam, że EntityType służy wyłącznie do tworzenia pola wyboru :/
Rozwiązałam problem, ale połowicznie v konstrukcji formularza użyłam. property_path
I to działa jeśli idzie o edycję encji. Jednak jesli chcę stworzyć encję i w tym celu wyprodukować pusty formularz:
To dostaję błąd: PropertyAccessor requires a graph of objects or arrays to operate on, but it found type "NULL" while trying to traverse path "patient.id" at property "id". Co jest zrozumiałe, bo ne ma żadnego obiektu patient z którego możnaby pobrać id. -------------------- |
|
|
13.12.2017, 09:23:31
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
Zacząć należało od tego, czy naprawdę potrzebny jest w formularzu ten "terapist" i "patient"?
Bo nie rozumiem, czemu to mają być pola typu hidden a nie np. selecty czy radia gdzie użytkownik może wybrać? I w tego typu problemach zazwyczaj trzeba albo sparametryzować formularz (by działał w trybie "add" lub "edit") albo stworzyć dwa oddzielne formularze. |
|
|
15.12.2017, 01:02:40
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
Rzeczywiście ostatecznie po przemyśleniu okazało się, że te pola nie są potrzebne. Bo id user to id zalogowanego a id terapeuty to można przekazać w linku.
-------------------- |
|
|
28.08.2019, 00:57:31
Post
#12
|
|
Grupa: Zarejestrowani Postów: 51 Pomógł: 0 Dołączył: 22.08.2019 Ostrzeżenie: (10%) |
Purchasing Viagra Online For Cheap Propecia Generic Drug Pharmacy Gel Kamagra Francia priligy in sri lanka How Can I Get Viagra
Bentyl Tab Saturday Delivery Nursing Dogs And Amoxicillin Macrobid Saturday Delivery buy viagra online Bentyl Mastercard Canada Mixing Amoxicillin Wine Together Difference Between Amoxicillin And Penicillin Walmart Propecia Price cheapest cialis Viagra Alle Donne Keflex And Stomach Bentyl Internet Hydrochlorothiazide Best Website Keflex Recovery Acheter Du Cialis En Suisse generic cialis Wirkung Viagra 100mg Dutasteride Vs Finasteride 2014 How To Last Longer During Why Discard Amoxil After Expire cialis overnight shipping from usa Photos De Pilules Amoxil |
|
|
Wersja Lo-Fi | Aktualny czas: 26.04.2024 - 15:08 |