Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] walidacja plików z osobna
Forum PHP.pl > Forum > PHP > Frameworki
nmts
Poniższa metoda ma za zadanie zapisać nowe zdjęcia do kategorii lub utworzyć nową kategorię i dodać od razu zdjęcia, poniższy kod dotyczy tego drugiego tylko.
Gdyby było jedno zdjęcie to bym Validate:factory przekazał $_FILES i metodzie rules ustawił 'photo' jak poniżej. Ale zdjęć może być wiele, więc jak sprawdzić każde osobno aby w przypadku gdy któreś będzie nieprawidłowe resztę uploadowało? snitch.gif

Próbowałem jakoś z foreach'ować $_files ale i tak trzeba wtedy podać nazwę inputa, więc poniższa walidacja jest oczywiście zła. snitch.gif
  1.  
  2. function action_save($gallery_id = null) {
  3. if($_POST){
  4. if(!$gallery_id){
  5. $gallery = ORM::factory('gallery');
  6. $gallery->name = $_POST['name'];
  7. $gallery->date = time();
  8.  
  9. foreach($_FILES as $one_photo){
  10. echo '<pre>';
  11. var_dump($one_photo);
  12. echo '</pre>';
  13. $photo = Validate::factory($one_photo)
  14. -> rules('photo', array('Upload::valid' => NULL,
  15. 'Upload::type' => array(array('jpg', 'png', 'gif')),
  16. 'Upload::size' => array('3M'),
  17. 'Upload::not_empty' => NULL));
  18.  
  19. if($photo->check())
  20. {
  21. $filename = upload::save($one_photo);
  22. $save_as = basename($filename);
  23.  
  24. Image::factory($filename)
  25. ->resize(200, 200, Image::AUTO)
  26. ->save(DOCROOT.'/photos/thumb_'.$save_as);
  27.  
  28. // zapis zdjec do bazy
  29.  
  30. unlink($filename);
  31. }
  32. }
  33. $gallery->save();
  34. } else {
  35. // update
  36. }
  37. }
  38. // $this->redirect("admin/galleries/edit/".$gallery_id);
  39. }


Pytanie dodatkowe, czy ORM ma metodę zwracającą id nowo powstałego elementu w bazie?
phpion
Kod pochodzi chyba z KO3, a z nią nie miałem styczności, więc odpowiem Ci tylko na drugie pytanie. ID wstawionego rekordu uzyskasz po metodzie save() jako $obj->id, czyli u Ciebie powinno zadziałać:
  1. $gallery->save();
  2. $id = $gallery->id;

Jeśli to nie zadziała to wywołaj jeszcze po save() metodę reload().
nmts
@phpion, masz oczywiście racje

Ponawiam pytanie główne, już bez udziału walidacji:

Jak zuploadować więcej plików? Mam:

  1. foreach($_FILES as $photo){
  2.  
  3. $filename = upload::save($photo);
  4. $save_as = basename($filename);
  5.  
  6. Image::factory($filename)
  7. ->resize(200, 200, Image::AUTO)
  8. ->save(DOCROOT.'/photos/thumb_'.$save_as);
  9.  
  10. $photo_to_add = new Model_Photo(array('filename' => $save_as));
  11. $gallery->add('photos', $photo_to_add);
  12. unlink($filename);
  13.  
  14.  
  15. }


A nazwy inputów to: photo[]

Oczywiście błąd:
ErrorException [ Warning ]: is_uploaded_file() expects parameter 1 to be string, array given

Jak powinienem poprawnie przelecieć po tej tablicy? sad.gif
phpion
Cytat(nmts @ 5.07.2010, 14:58:10 ) *
Oczywiście błąd:
ErrorException [ Warning ]: is_uploaded_file() expects parameter 1 to be string, array given

Jak powinienem poprawnie przelecieć po tej tablicy? sad.gif

Wewnątrz Twojego foreach'a musisz zrobić kolejnego. Albo zastosuj zwykłą pętlę for(). Podejrzyj sobie zawartość tablicy (print_r($_FILES)), a pewnie zajarzysz jak jest skonstruowana (nie tak jakbyś przypuszczał, kolejny plik nie jest nowym elementem tablicy).
nmts
Ok..
  1. $photos= array();
  2. $photos_count = count($_FILES['photo']['name']);
  3. for($x=0; $x < $photos_count; $x++){
  4. $photo['name'] = $_FILES['photo']['name'][$x];
  5. $photo['type'] = $_FILES['photo']['type'][$x];
  6. $photo['tmp_name'] = $_FILES['photo']['tmp_name'][$x];
  7. $photo['error'] = $_FILES['photo']['error'][$x];
  8. $photo['size'] = $_FILES['photo']['size'][$x];
  9. $photos[] = $photo;
  10. }
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.