Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Zend_Form_Element_File - błąd uploadu, ale plik wrzuca się
Forum PHP.pl > Forum > PHP > Frameworki
IceManSpy
Witam

Napotkałem się dzisiaj na kilka dziwnych problemów z powyższym komponentem.

Problemy:
1. Pokazuje błąd odbioru obrazka, a na serwer go wrzuca (pojawia się folder w docelowym folderze i jest przetwarzany dalej formularz).
2. Po walidacji formularza, jesli nie podam obrazka to zostaje wyświetlony ponownie formularz z wypełnionymi danymi (pole do pliku jest puste). Kiedy jednak zostanie wskazana ścieżka do obrazka (po wcześniejszym nie podaniu), który chcemy wrzucić to dostaję komunikat "Too many files, maximum '1' are allowed but '2' are given", chociaż jest tylko jeden wrzucany.

Jak rozwiązać powyższe problemy? Może robię coś w złej kolejności?

Fragment formularza:
  1. $image = new Zend_Form_Element_File('image');
  2. $image->setLabel('Dodaj zdjęcie główne: ');
  3. $path = realpath(APPLICATION_PATH.'/../public/images');
  4. $image->setDestination($path);
  5. $image->setRequired(true);
  6.  
  7. $image->addValidator('count',false,1);
  8. $image->addValidator('size',false,1024000);
  9. $image->addValidator('extension',false,array('jpg'));

Kod z kontrolera odpowiedzialnego za obsługę formularza:
  1. $form_offer = new Offer_Form_AddOffer();
  2. $form_offer->getElement('image')->addFilter('Rename',APPLICATION_PATH.'/../public/images/'.$image_name);
  3.  
  4. if($this->_request->isPost() && $form_offer->isValid($_POST) && $form_offer->getValue('image') != null)
  5. {
  6. if (!$form_offer->image->receive()) {
  7. $this->view->error = "Error receiving the file";
  8. }
  9.  
  10. //Pobranie danych za pomoca getValue i dalsze ich przetwarzanie
  11. // ale nie robię $form_offer->getValue('image')
  12.  
  13. $form_offer->reset();
  14.  
  15. $this->view->confirm = true;
  16. }
  17. if($form_offer->isErrors())
  18. {
  19. $form_offer->populate($_POST);
  20. }


==== EDYCJA ====
Problem rozwiązałem. Przyczyną tego było w złym miejscu postawienie warunku na odbiór pliku w kontrolerze. Tak wygląda poprawiony plik:
  1. if($this->_request->isPost() && $form_offer->isValid($_POST) && $form_offer->getValue('image') != null)
  2. {
  3. //Pobranie danych i operacje na nich
  4.  
  5. //resetowanie formularza
  6. $form_offer->reset();
  7.  
  8. $this->view->confirm = true;
  9. }
  10. else
  11. {
  12. if ($this->_request->isPost() && !$form_offer->getElement('image')->receive() && $form_offer->getValue('image') != null) {
  13. $this->view->error = "Error receiving the file";
  14. }
  15. }
  16. if($form_offer->isErrors())
  17. {
  18. $form_offer->populate($_POST);
  19. }
Pilsener
Jeśli mogę coś jeszcze zasugerować:
  1. $form_offer->isValid($_POST);
- żeby pobrać dane nieprzefiltrowane (przez formularz, które pobieramy przez $form->getValue) używajmy requesta i metod getParams:
  1. $form_offer->isValid($this->getRequest()->getParams());


Takie $_POST brzydko wygląda thumbsdownsmileyanim.gif
IceManSpy
A chodzi tylko o styl, czy jakiś bezpieczeństwo?
Pilsener
Bezpieczeństwo na pewno nie, bo dane z requesta nie są filtrowane, raczej o wygodę i dodatkowe możliwości, wszystko masz w jednym miejscu plus garść przydatnych metod, ma to znaczenie np. jeśli akcja ma obsługiwać żądania POST, GET, ajaxowe czy wykonywać pracę na rzecz innego kontrola. No i estetytka wink.gif
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.