Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony2][Symfony] dodawanie wielu rekordów
Forum PHP.pl > Forum > PHP > Frameworki
damianooo
Witam

Potrzebuję zrobić formularz dodający wiele rekordów do bazy na raz. Jak to zrobić w Symfony 2 ? Znalazłem taki oto tutorial ale to chyba nie to:

http://symfony.com/doc/2.0/reference/forms...collection.html


Aby otrzymać taki formularz muszę w TWIGu też coś zmieniać czy tylko w samym wyglądzie formulrza i w akcji kontrolera ?



Dzięki
pyro
To jest dokładnie to, czego potrzebujesz.
damianooo
ok, tylko że w FormBuilderze mam typ "entity" a nie "collection" ponieważ mam dzięki temu dostęp do listy wyboru z tabel join-owanych.

miałem tak:

  1. ->add('matchday', 'entity', array(
  2. 'class' => 'CosTamBundle:Matchday',
  3. 'property' => 'name'
  4. )
  5. )


i zmieniłem na tak:
  1. ->add('matchday', 'collection', array(
  2. 'type' => 'entity',
  3. 'options' => array(
  4. 'class' => 'CosTamBundle:Matchday',
  5. 'property' => 'name'
  6. ),
  7. ))


ale to nie działa (w sensie że znikło mi teraz pole wyboru)






pyro
Zamiast entity ustaw collection z flagą allow_add (+ allow_delete?) i ustawionym typem (EDIT: ) i w FormBuilderze załaduj odpowiednie encje (EntityManager przekaż jako opcję)
damianooo
zrobiłem tak:

  1. ->add('matchday', 'collection', array(
  2. 'allow_add' => 'true',
  3. 'type' => 'entity',
  4. 'options' => array(
  5. 'class' => 'CosTamBundle:Matchday',
  6. 'property' => 'name'
  7. ),
  8. ))



typ ma być "entity" ?


a kontroler mam następujący:


  1. /**
  2.   * Displays a form to create a new Meet entity.
  3.   *
  4.   * @Route("/new", name="meet_new")
  5.   * @Template()
  6.   */
  7. public function newAction()
  8. {
  9. $entity = new Meet();
  10. $form = $this->createForm(new MeetType(), $entity);
  11.  
  12. return array(
  13. 'entity' => $entity,
  14. 'form' => $form->createView(),
  15. );
  16. }

pyro
Nie. chcesz mieć zbiór formularzy, a nie zbiór list rozwijalnych:

  1. ->add('matchday', 'collection', array(
  2. 'allow_add' => true,
  3. 'type' => new MatchdayType(),
  4. ))
damianooo
Tzn. chcę mieć tak:

rząd1 (pole: team1(typ:text) ; pole team2(typ:text) ; pole: matchday(typ:pole_rozwijalne)
rząd2 (pole: team1(typ:text) ; pole team2(typ:text) ; pole: matchday(typ:pole_rozwijalne)
rząd3 (pole: team1(typ:text) ; pole team2(typ:text) ; pole: matchday(typ:pole_rozwijalne)
...
rząd20 (pole: team1(typ:text) ; pole team2(typ:text) ; pole: matchday(typ:pole_rozwijalne)


button: submit
pyro
No to właśnie Ci dokładnie podałem jak taki zbiór zainicjować ;p
damianooo
ok, ale nie wiem czemu znikło mi teraz pole rozwijalne. Rozumiem że pozostałem pola formularza też muszę ustawić na typ "collection" ?

Nie zrozumiałem tego:

Cytat
i ustawionym typem (EDIT: ) i w FormBuilderze załaduj odpowiednie encje (EntityManager przekaż jako opcję)
pyro
Czy to jest formularz edycji (która w tej kolekcji ma już jakieś dane) czy formularz tworzenia nowej encji?
damianooo
formularz tworzenia (new). potrzebuję na stronie wyświetlić takich 20 , następnie wypełnić je danymi i klikając przycisk button ma mi zapisać to jako 20 nowych rekordów do bazy danych.
pyro
No to wystarczy tylko zrobić to:

Cytat(pyro @ 11.03.2014, 12:03:48 ) *
  1. ->add('matchday', 'collection', array(
  2. 'allow_add' => true,
  3. 'type' => new MatchdayType(),
  4. ))

damianooo
ok a co teraz z kontrolerem i widokiem ?
Próbowałem to zrobić tak:


  1. /**
  2.   * Displays a form to create a new Meet entity.
  3.   *
  4.   * @Route("/new", name="meet_new")
  5.   * @Template()
  6.   */
  7. public function newAction()
  8. {
  9. $meets = array();
  10. for ($i = 0; $i < 20; $i++) {
  11. $meets[] = new Meet();
  12. }
  13.  
  14. $entity = new Meet();
  15. $form = $this->createForm(new MeetType(), $meets);
  16.  
  17. return array(
  18. 'entity' => $meets,
  19. 'form' => $form->createView(),
  20. );
  21. }



ale to tak nie działa
pyro
W kontrolerze nie tworzysz nowych formularzy. To w widoku tworzysz nowe formularze z pomocą prototypu i JS:

Kod
{{ form_widget(form.something.vars.prototype) }}
damianooo
właśniei chciałbym uniknąć js-a . W tym przykładzie z linka jest opisany ten właśnie sposób z zastosowaniem js. Nie da się tego zrobić inaczej ?
pyro
No to przecież masz prototyp. Wyświetl go 20 razy.
damianooo
tak ?


  1. <form action="{{ path('meet_create') }}" method="post" {{ form_enctype(form) }}>
  2.  
  3. {% for i in 0..20 %}
  4. {{ form_widget(form.matchday[i].vars.prototype) }}
  5. {{ form_widget(form.season[i].vars.prototype) }}
  6. {{ form_widget(form.position[i].vars.prototype) }}
  7. {% endfor %}
  8. <p>
  9. <button type="submit">Create</button>
  10. </p>
  11. </form>



nie działa sad.gif
pyro
Matko bosko! Czy Ty czytasz w ogóle o czym piszę? Nawet gotowy fragment kodu Ci podałem.

// EDIT

Poza tym te "prototype" jest tutaj źle użyte. Dokumentacja nie boli.

// EDIT 2

a od 0 do 20 jest 21 liczb a nie 20 jak na mój gust wink.gif
damianooo
21 smile.gif .... zgadza się , ale to bym zauważył wcześniej czy później.

Wg przykładu z dokumentacji u mnie musiałoby to być tak:

  1. <form action="{{ path('meet_create') }}" method="post" {{ form_enctype(form) }}>
  2.  
  3. <ul data-prototype="{{ form_widget(form.matchday.vars.prototype) | e }}"
  4. {% for matchdayField in form.matchday %}
  5. <li>
  6. {{ form_errors(matchdayField) }}
  7. {{ form_widget(matchdayField) }}
  8. </li>
  9. {% endfor %}
  10. </ul>
  11.  
  12. <p>
  13. <button type="submit">Create</button>
  14. </p>
  15. </form>



ale to też nie tak sad.gif
pyro
Sam powiedziałeś, że w dokumentacji jest przykład z JS, a Ty nie chcesz używać JS.

Kurde. Po prostu wyświetl prototyp 20 razy. Gdzie tutaj widzisz jakąś filozofię biggrin.gif ?
damianooo
chyba nie umiem tej iteracji zaimplementować w TWIGu wink.gif

  1. {% for i in 1..20 %}
  2. {{ form_widget(form.matchday.vars.prototype[i]) }}
  3. {% endfor %}


też nie tak sad.gif
pyro
Widzę, że się nie dogadamy. Dokumentacja dalej boli. Ale w prezencie pół gotowca

Kod
{{ form_start(form) }}

{{ form_row(form.blup) }}
{{ form_row(form.blip) }}

{# Kolekcja formularzy #}
{% for i in 0..19 %}
{{ form_widget(form.someMatches.vars.prototype) }} {# Tutaj trzeba zrobić odpowiedni replace, masz pole do popisu #}
{% endfor %}

{{ form_row(form.submit) }}

{{ form_end(form) }}
damianooo
ok zajarzyłem że chodziło Ci o to że w TWIGach można zrobić coś takiego jak "replace" wink.gif

udało mi się zrobić coś takiego:

  1. {% for i in 1..20 %}
  2. {{ form_widget(form.position.vars.prototype)|replace({__name__:i}) }}
  3. {% endfor %}


(celowo zamiast pola "matchday" użyłem innego pola "position")

Tylko że nie wyświetla mi się INPUT a następujący html:

  1. <input type="text" id="my_costambundle_meettype_position_1" name="my_costambundle_meettype[position][1]" required="required" />




gdzie mam błąd ? ...
pyro
"Nie pojawia mi się input tylko input". Ok....
redeemer
Spróbój użyć filtra raw. Czyli
Kod
...
{{ form_widget(form.position.vars.prototype)|replace({__name__:i})|raw }}
...
damianooo
ok teraz wyświetla się dobrze ... jednak nie wyświetla się 20 razy, tak jak tego chciałem w pętli sad.gif

Mam coś źle z tą pętlą w TWIGu czy mogę taki efekt uzyskać tylko za pomocą jQuery ?

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.