Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]sfWidgetFormInputFile()
Forum PHP.pl > Forum > PHP > Frameworki
Gribo
Witam mam formularz który działa dobrze ale jest jeden szczegół, który mnie irytuje.
Otóż gdy podczas wypełniana formularza zrobię jakiś błąd (zaznaczam że jedno z pól to sfWidgetFormInputFile()) to Formularz dobrze się zwaliduje jednak wczytana wcześniej ścieżka do pliku który wczytałem do pola sfWidgetFormInputFile(), nie powróciła mimo że błąd był w innym polu. Przez to muszę wyszukiwać pliku graficznego od nowa na dysku i go wczytywać. Czy to jest jakiś bug? czy coś źle robię oto kody:

  1. <?php
  2. class rejestracjaActions extends sfActions
  3. {
  4. /**
  5.   * Executes index action
  6.   *
  7.   * @param sfRequest $request A request object
  8.   */
  9.  public function executeIndex(sfWebRequest $request)
  10.  {
  11.      $this->form=new RejestracjaForm();
  12.      if ($request->isMethod('post')) {
  13.           $this->form->bind($request->getParameter('uzytkownicy'), $request->getFiles('uzytkownicy'));
  14.  
  15.           if ($this->form->isValid()) {
  16.               try {
  17.                  $file = $this->form->getValue('awatar');
  18.                  $filename = 'uploaded_'.sha1($file->getOriginalName());
  19.                  $extension = $file->getExtension($file->getOriginalExtension());
  20.                  $file->save(sfConfig::get('sf_upload_dir').'/'.$filename.$extension);
  21.                  $this->form->save();
  22.                  $this->redirect('rejestracja/dziekujemy');
  23.           } catch (PropelException $e) {
  24.               $this->redirect('rejestracja/blad');
  25.           }}
  26.          
  27.          }
  28.  }
  29. ?>


  1. <?php
  2. class RejestracjaForm extends BaseUzytkownicyForm {
  3.    public function configure() {
  4.      
  5.        unset($this['usuniety'],$this['miasto'],$this['osobie'],
  6.                $this['usid'],$this['created_at'],$this['updated_at']
  7.        );
  8.    
  9.      
  10.       $this->setWidget('powtorz',new sfWidgetFormInputPassword());
  11.       $this->setValidator('powtorz',new sfValidatorString(array('max_length' => 45, 'required' => true)));
  12.       $this->widgetSchema->moveField('powtorz',sfWidgetFormSchema::AFTER,'haslo');
  13.      
  14.      
  15.       $this->widgetSchema->setFormFormatterName('list');
  16.      
  17.  $this->validatorSchema->setPostValidator(new sfValidatorAnd(array(
  18.      new sfValidatorSchemaCompare('haslo', '==', 'powtorz',
  19.            array(),
  20.            array('invalid' => 'Hasło "%left_field%" Nie zgadza się z "%right_field%"')
  21.          ),
  22.      new sfValidatorPropelUnique(array('model' => 'Uzytkownicy', 'column' => array('login')),array('invalid' => 'Login %value% już istnieje')
  23.          ))
  24.        ));
  25.  
  26.  
  27.       }
  28. }
  29. ?>
melkorm
Jako że nie znam Symfony, ale widzę że nikt się nie wypowiada to powiem to co wiem:
- polu File nie można nadać value
- sposobem jest przesłanie tego w polu hidden i jeżeli później puste File to bierze się to z hidden, jest wiele sposobów zakładam że Symfony tak samo jak Zend nie ma tego oprogramowanego może i dobrze ale to już subiektywna opinia.

Poszukaj, może gdzieś na forum dot. Symfony jest to opisane i napisane smile.gif

P.S. prosze nie bić za wypowiadanie się o czymś o czym nie ma się pojęcia.
Gribo
szukałem czegoś podobnego na necie ale nic na razie nie znalazłem. z tymi polami ukrytymi to może być problem jeśli chcę zrobić upload np. 5 zdjęć albo więcej. To co mam wstawiać tyle ukrytych może zna ktoś jakiś sposób ?
Pr0100
  1. <?php
  2. $this->setValidator('img', new sfValidatorFile(array('path' => 'images/users/', 'required' => ($this->isNew()) ? true : false)));
  3. ?>


autorski pomysł, działa na sf 1.2 doctine, na propelu nie testowałem
Gribo
Sprawdziłem nie działa sad.gif
Pr0100
możesz rozwinąć swoją wypowiedz? Przechodzi przez Validator jeżeli zostawisz pole puste? Jest update pola na null? Zmieniłeś action.php tak aby nie robiło redirect'a na error jeżeli nie ma awatar'u?
krowal
Nie jestem pewien, ale miałem kiedyś podobny problem, pomogło coś takiego że zrobiłem assign zmiennej forma do widoku na końcu akcji. Spróbuj czegoś takiego:
  1. <?php
  2. class rejestracjaActions extends sfActions
  3. {
  4. /**
  5.  * Executes index action
  6.  *
  7.  * @param sfRequest $request A request object
  8.  */
  9. public function executeIndex(sfWebRequest $request)
  10. {
  11.     $form=new RejestracjaForm();
  12.     if ($request->isMethod('post')) {
  13.          $form->bind($request->getParameter('uzytkownicy'), $request->getFiles('uzytkownicy'));
  14.  
  15.          if ($form->isValid()) {
  16.              try {
  17.                 $file = $form->getValue('awatar');
  18.                 $filename = 'uploaded_'.sha1($file->getOriginalName());
  19.                 $extension = $file->getExtension($file->getOriginalExtension());
  20.                 $file->save(sfConfig::get('sf_upload_dir').'/'.$filename.$extension);
  21.                 $form->save();
  22.                 $this->redirect('rejestracja/dziekujemy');
  23.          } catch (PropelException $e) {
  24.              $this->redirect('rejestracja/blad');
  25.          }}
  26.        
  27.         }
  28.     $this->form = $form;
  29. }
  30. ?>
Gribo
Pr0100 ogólnie to tu nie chodzi o required tylko o to że jak jakies błedne pole w folmulazu załużmy na to że koleś źle wpisał maila to ta wartość, która była poprawna w sfWidgetFormInputFile() nie wraca tylko trzeba od nowa wybierać plik


krowal Spróbuję to zmienić jak wrócę do domu z pracy i dam znać
krowal
Aa <input type=file> nie da się nadać wartości smile.gif Jest tak zrobione ze względu na bezpieczeństwo. Wyobraź sobie sytuację gdzie w formularzu znajduje się pole typu file którego nie widać a ty nadasz mu automatycznie wartość np. ścieżkę do jakiegokolwiek pliku na dysku użytkownika oglądającego stronę. Jeśli użytkownik kliknie submit to plik automatycznie zostanie przesłany, może to być np lista użytkowników gg która znajduje się prawie zawsze w tym samym miejscu itp.

edit: Trochę nie chciało mi się czytać i poprzednio dałem taką odpowiedź, ale nic Ci to nie pomoże smile.gif
Pr0100
Cytat
sfWidgetFormInputFile() nie wraca tylko trzeba od nowa wybierać plik


tak, ale widzisz jeżeli sfWidgetFormInputFile() jest puste to Symfony nie robi ->setImg(NULL) tylko zostawia poprzednią wartość. Tak więc jeżeli pozbędziesz się required podczas edycji formularza oraz przed wrzucaniem pliku na serwer sprawdzisz czy pole zostało uzupełnione to otrzymasz rozwiązanie swojego problemu.
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.