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
<http://december.com/html/4/element/textarea.html id="form_comment_5" name="form[comment][5]" ></http://december.com/html/4/element/textarea.html> <http://december.com/html/4/element/textarea.html id="form_comment_12" name="form[comment][12]"></http://december.com/html/4/element/textarea.html> <http://december.com/html/4/element/textarea.html id="form_comment_17" name="form[comment][17]"></http://december.com/html/4/element/textarea.html>
foreach($users as $userEntity){ $userEntity->form = $this->createForm(UserForm::class, $userEntity); }
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)?
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.
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
{% for item in newcooperations %} jakiś kod {{ form_start(item.form) }} {{ form_end(item.form) }} {% endfor %}
Trzeba sprawdzić:
dump(item.form);
Rzeczywiście mój błąd. chciałabym Cię jeszcze poprosić o pomoc w jednej sprawie.
Mam dwie encje połączone taką relacją:
class User extends BaseUser { ... /** * @var Article[]|ArrayCollection * * @ORM\OneToMany(targetEntity="Cooperation", mappedBy="patient", cascade={"ALL"}) */ private $therapists; /** * @var Article[]|ArrayCollection * * @ORM\OneToMany(targetEntity="Cooperation", mappedBy="therapist", cascade={"ALL"}) */ private $patients; }
class Cooperation { /** * @ORM\Id * @ORM\ManyToOne(targetEntity="User", inversedBy="therapists") * @ORM\JoinColumn(name="patient", referencedColumnName="id") */ private $patient; /** @ORM\Id * @ORM\ManyToOne(targetEntity="User", inversedBy="patients") * @ORM\JoinColumn(name="therapist", referencedColumnName="id") */ private $therapist; ...
public function buildForm(FormBuilderInterface $builder, http://www.php.net/array $options) { $builder ->add('patient', HiddenType::class) ->add('therapist', HiddenType::class) ->add('comment', TextareaType::class, [ 'label' => false, 'attr' => [ 'class' => 'form-control add-comment', 'rows' => '4', 'cols' => '20', ], ]);
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.
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
public function buildForm(FormBuilderInterface $builder, http://www.php.net/array $options) { $builder ->add('patient', HiddenType::class,['property_path'=>'patient.id']) ->add('therapist', HiddenType::class,['property_path'=>'patient.id']) ->add('comment', TextareaType::class, [ 'label' => false, 'attr' => [ 'class' => 'form-control add-comment', 'rows' => '4', 'cols' => '20', ], ]);
$cooperation = new Cooperation(); $form = $this->createForm(CooperationType::class,$cooperation);
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.
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.
Purchasing Viagra Online For Cheap Propecia Generic Drug Pharmacy Gel Kamagra Francia http://prilipills.com How Can I Get Viagra
Bentyl Tab Saturday Delivery Nursing Dogs And Amoxicillin Macrobid Saturday Delivery http://cheapcheapvia.com Bentyl Mastercard Canada Mixing Amoxicillin Wine Together Difference Between Amoxicillin And Penicillin
Walmart Propecia Price http://etrobax.com Viagra Alle Donne Keflex And Stomach Bentyl Internet
Hydrochlorothiazide Best Website Keflex Recovery Acheter Du Cialis En Suisse http://cial20mgprice.com Wirkung Viagra 100mg
Dutasteride Vs Finasteride 2014 How To Last Longer During Why Discard Amoxil After Expire http://aaost.com Photos De Pilules Amoxil
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)