Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony] formularze w panelu admina
Forum PHP.pl > Forum > PHP > Frameworki
michalmichal
Cześć,

uczę się Symfony i mam pewien problem. Wygenerowałem sobie tabelkę do edycji/dodawania nowych/usuwania pozycji na modelu za pomocą 'doctrine:generate-admin'. Dodałem w pliku generator.yml swoje 'object_actions', pod które podpiąłem własny formularz. Jeśli wybiorę którąś pozycję z tabelki, to przechodzę pod adres 'localhost/backend_dev.php/application/3/listMojaAkcja' (numer 3 to ID). Do tej pory jest wszystko ok, mogę to ID odczytać za pomocą '$request->getParameter('id')'. Po wypełnieniu pól i wciśnięciu 'save' wykonuje mi się akcja 'executeUpdate', a w niej sprawdzanie formularza 'processForm'. Niestety nie potrafię już w tym miejscu odczytać id, żeby przypisać dane z formularza do konkretnego id w bazie. Czy może mnie ktoś naprowadzić co robię źle / czego mam poszukać / jak przekazać lub odczytać parametr? Będę ogromnie wdzięczny za każdą pomoc.

Pozdrawiam,
Michał
destroyerr
Na początek to powiem, że moim zdaniem nie ma lekko. Admin generator w symfony nie jest do tego przygotowany , ale można sobie z tym poradzić. Problem polega na tym, że wygenerowany szablon dla formularza zawsze jest wysyłany do akcji update. Musisz to zmienić, albo na poziomie szablonu, albo w akcji będziesz rozpoznawał jaki to formularz i zmienisz wtedy akcję.
Nie jestem pewny czy trafiłem w Twój problem, bo za bardzo nie rozumiem jaki masz problem z odczytaniem id. Trochę kodu z kontrolera pomogłoby w rozwiązywaniu problemu.
michalmichal
To może trochę wyjaśnień. Mam testy, do których tworzę żetony. Mógłbym utworzyć nowy moduł w panelu admina, ale do każdego testu będę potrzebował generować po kilkanaście/kilkadziesiąt żetonów. Byłoby to uciążliwe, dlatego chciałem dodać akcję w tabelce z testami, gdzie po wejściu w formularzu wpiszę liczbę i po kliknięciu save utworzy mi się taka liczba żetonów - będą się one wyświetlać pod tym formularzem. Żeby żetony przypisać do konkretnego testu, muszę przekazać gdzieś w formularzu jego id. Za pierwszym razem nie jest to problem - $request->getParameter('id') załatwia sprawę, przekazuję ten parametr do opcji formularza i ustawiam go jako input hidden. W akcji sprawdzania formularza odczytuję parametr z ukrytego pola. Niestety nie potrafię już niżej wyświetlić utworzonych dotychczas żetonów, bo nie potrafię odczytać w akcji executeZapiszZetony ani odczytajZetonyForm id testu, na którym obecnie operuję.

Po wejściu w konkretną pozycję mam formularz i wypisane żetony dla danego testu:
  1. public function executeListZetony(sfWebRequest $request) {
  2. $this->idTestu = $request->getParameter('id');
  3. $this->formularz = new GenerujZetonyForm(null, array('idTestu' => $this->idTestu));
  4. $this->zetony = Doctrine::getTable('Zetony')->pobierzZetony($this->idTestu);
  5. }


Po wpisaniu liczby i kliknięciu save już parametru id nie widzę:
  1. public function executeZapiszZetony(sfWebRequest $request) {
  2. $this->forward404Unless($request->isMethod(sfRequest::POST));
  3. $this->idTestu = $request->getParameter('id');
  4. $this->formularz = new GenerujZetonyForm(null, array('idTestu' => $this->idTestu));
  5.  
  6. $this->zetony = Doctrine::getTable('Zetony')->pobierzZetony($this->idTestu);
  7. $this->odczytajZetonyForm($request, $this->formularz);
  8. $this->setTemplate('listZetony');
  9. }


Sprawdzanie formularza:
  1. protected function odczytajZetonyForm(sfWebRequest $request, sfForm $form) {
  2. $form->bind($request->getParameter($form->getName()));
  3. if ($form->isValid()) {
  4. $wartosci = $form->getValues();
  5. $idTestu = $wartosci['idTestu'];
  6.  
  7. $this->redirect('testy');
  8. }
  9. }


Formularz:
  1. class GenerujZetonyForm extends sfForm {
  2.  
  3. public function configure() {
  4.  
  5. $idTestu = $this->getOptions();
  6.  
  7. $this->setWidgets(array(
  8. 'idTestu' => new sfWidgetFormInputHidden(array('default' => $idTestu['idTestu'])),
  9. 'liczbaZetonow' => new sfWidgetFormInput()
  10. ));
  11.  
  12. $this->setValidators(array(
  13. 'idTestu' => new sfValidatorInteger(array(
  14. 'min' => 1
  15. )),
  16. 'liczbaZetonow' => new sfValidatorInteger(array(
  17. 'min' => 1,
  18. 'max' => 100
  19. ))
  20. ));
  21.  
  22. $this->widgetSchema->setNameFormat('generujZetony[%s]');
  23.  
  24. $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
  25. }
  26.  
  27. }



I szablon:
  1. <form action="<?php echo url_for('@zapiszZetony?module=testy&action=zapiszZetonye&id=' . $idTestu); ?>" method="post">
  2. <table id="kategorie_form">
  3. <tfoot>
  4. <tr>
  5. <td colspan="2">
  6. <input type="submit" value="Utwórz żetony" />
  7. </td>
  8. </tr>
  9. </tfoot>
  10. <tbody>
  11. <?php echo $formularz; ?>
  12. </tbody>
  13. </table>
  14. </form>
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.