Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]Zamiast listy użytkowników w polu powinno być id zalogowanego uzytkownika
Forum PHP.pl > Forum > PHP > Frameworki
nieraczek
Mam tabelę w bazie danych:
id PK
id_uzytkownika FK
samochod

Relacja jest z tabelą sf_guard_user - jeden użytkownik może mieć wiele samochodów.
Wygenerowałem moduł i przy dodawaniu nowego elementu na stronie w polu 'id uzytkownika' jest lista wszystkich użytkowników do wyboru, bo symfony zrobił mi widget:
id_uzytkownika' => new sfWidgetFormDoctrineSelect(array('model' => 'sfGuardUser', 'add_empty' => false))
i walidator:
'id_uzytkownika' => new sfValidatorDoctrineChoice(array('model' => 'sfGuardUser'))

a to pole powinno być niewidoczne i powinno w nim być id zalogowanego użytkownika, a nie że użytkownik może sobie wybierać użytkowników z listy.

Jak temu zaradzić ? Mam usunąć $this['id_uzytkownika'], po czym utworzyć niewidoczny widget typu input i wpisać do niego id zalogowanego użytkownika wysyłane do formularza z actions.class.php questionmark.gif
Cysiaczek
Hm, nie wiem jak w Doctrine, ale w Propelu ja bym użył opcji peer_method przekazanej do konstruktora formularza innej iż domyślne doSelect(). np. doSelectCurrentUser(). W walidatorze też bym to sprawdzał (osobny, Twój własny walidator). Inną metodą, chyba nawet bezpieczniejszą jest po prostu usunięcie tego pola i pobranie id usera bezpośrednio w kodzie akcji, bo zakładam, że jest to funkcja dla zalogowanych użytkowników.

Pozdrawiam
nieraczek
O tym drugim sposobie co go wspomniałeś myslałem wcześniej - w actions.class.php symfony mi stworzył
  1. <?php
  2. public function executeCreate(sfWebRequest $request)
  3.  {
  4.    $this->forward404Unless($request->isMethod('post'));
  5.  
  6.    $this->form = new SamochodyForm();
  7.  
  8.    $this->processForm($request, $this->form);
  9.  
  10.    $this->setTemplate('new');
  11.  }
  12.  
  13.  
  14. protected function processForm(sfWebRequest $request, sfForm $form)
  15.  {
  16.    $form->bind($request->getParameter($form->getName()));
  17.    if ($form->isValid())
  18.    {      
  19.      $samochody = $form->save();
  20.  
  21.      $this->redirect('/profil/edit?id='.$samochody['id']);
  22.    }
  23.  }
  24. ?>



Usunąłem to pole:
  1. <?php
  2.    (
  3.      $this['id_uzytkownika']
  4.    );
  5. ?>



Kombinowałem tak - na razie na sztywno ustawianie id_uzytkownika:
  1. <?php
  2. $form->setIdUzytkownika(2);
  3. $samochody = $form->save();
  4. ?>


Czyli:
  1. <?php
  2. public function executeCreate(sfWebRequest $request)
  3.  {
  4.    $this->forward404Unless($request->isMethod('post'));
  5.  
  6.    $this->form = new SamochodyForm();
  7.  
  8.    $this->processForm($request, $this->form);
  9.  
  10.    $this->setTemplate('new');
  11.  }
  12.  
  13.  
  14. protected function processForm(sfWebRequest $request, sfForm $form)
  15.  {
  16.    $form->bind($request->getParameter($form->getName()));
  17.    if ($form->isValid())
  18.    {      
  19.      $form->setIdUzytkownika(2);
  20.      $samochody = $form->save();
  21.  
  22.      $this->redirect('/profil/edit?id='.$samochody['id']);
  23.    }
  24.  }
  25. ?>


Ale dostaję błąd: This request has been forwarded to a 404 error page by the action "profil/create". sad.gif
Cysiaczek
Oczywiście, bo akcja create może być wywołana getem , co prawdpodobnie się dzieje
nieraczek
Nie, to akurat:
  1. <?php
  2. $this->forward404Unless($request->isMethod('post'));
  3. ?>


jest ok. smile.gif

W tym miejscu się wywala:
  1. <?php
  2. $form->setIdUzytkownika(2);
  3. $samochody = $form->save();
  4. ?>
michalg
Dam Ci przykład, jak ja u siebie zrobiłem.

Metody klasy formularza:
  1. <?php
  2. public function configure()
  3.    {
  4. [...]
  5.            unset($this['added_by']);
  6. [...]
  7.    }
  8.  
  9.  
  10.    // TODO: In symfony 1.3 change this function into doUpdateObject
  11.    public function updateObject($values = null)
  12.    {
  13.        $object = parent::updateObject($values);
  14.  
  15.        $user = sfContext::getInstance()->getUser();
  16. [...]
  17.                $object->setIdUserAddedBy($user->getId());
  18. [...]
  19.  
  20.        return $object;
  21.    }
  22. ?>



Czyli formularz jest odpowiedzialny za wpisanie użytkownika.
nieraczek
Dziękuję, jednak znalazłem znacznie prostszy sposób - wystarczy użyć $this->form->getObject() czyli np.:
Kod
protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()));
    if ($form->isValid())
    {          

      $this->form->getObject()->setIdUzytkownika( $this->getUser()->getGuardUser()->getId() );

      $samochody = $form->save();

      $this->redirect('/profil/edit?id='.$samochody['id']);
    }
  }


smile.gif
michalg
Cytat(nieraczek @ 14.04.2009, 20:13:11 ) *
Dziękuję, jednak znalazłem znacznie prostszy sposób - wystarczy użyć $this->form->getObject() czyli np.:
smile.gif


Też tak można, ale ja wolałem to robić w formularzu, żeby mieć spójność - za utworzenie obiektu odpowiedzialny jest formularz. I może on sam utworzyć pełny obiekt. A w Twoim rozwiązaniu obiekt jest częsciowo tworzony przez formularz, a częściowo przez akcję. Jeżeli będziesz chciał użyć tego formularza w innym module, to będziesz musiał duplikować kod.

Inna sprawa, że w moim przykładzie uzależniam formularz od klasy użytkownika, co też może nie jest idealnym rozwiązaniem.
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.