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:
$image = new Zend_Form_Element_File('image'); $image->setLabel('Dodaj zdjęcie główne: '); $image->setDestination($path); $image->setRequired(true); $image->addValidator('count',false,1); $image->addValidator('size',false,1024000);
Kod z kontrolera odpowiedzialnego za obsługę formularza:
$form_offer = new Offer_Form_AddOffer(); $form_offer->getElement('image')->addFilter('Rename',APPLICATION_PATH.'/../public/images/'.$image_name); if($this->_request->isPost() && $form_offer->isValid($_POST) && $form_offer->getValue('image') != null) { if (!$form_offer->image->receive()) { $this->view->error = "Error receiving the file"; } //Pobranie danych za pomoca getValue i dalsze ich przetwarzanie // ale nie robię $form_offer->getValue('image') $form_offer->reset(); $this->view->confirm = true; } if($form_offer->isErrors()) { $form_offer->populate($_POST); }
==== 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:
if($this->_request->isPost() && $form_offer->isValid($_POST) && $form_offer->getValue('image') != null) { //Pobranie danych i operacje na nich //resetowanie formularza $form_offer->reset(); $this->view->confirm = true; } else { if ($this->_request->isPost() && !$form_offer->getElement('image')->receive() && $form_offer->getValue('image') != null) { $this->view->error = "Error receiving the file"; } } if($form_offer->isErrors()) { $form_offer->populate($_POST); }