Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][JS, jQuery?] spr. czy wpisano nazwę dla uploadowanego pliku i czy wybrano go w input file
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
rasten
Witam,
mam taki formularz, w którym mogę dodać więcej niż jeden plik:
  1. <input name="attachmentNames[]" type="text" value="nazwa pliku" />
  2. <input name="attachments[]" type="file" />
  3. itd..


Czy da się po stronie klienta sprawdzić, czy wybrano w input file plik? Bo np. jeśli mam 5 takich podwójnych inputów jak wyżej i klient np. wybierze plik w 1 i 4 to chcę sprawdzić czy dla nich wpisał też nazwę pliku. Jak to zrobić? Ewentualnie, jak to rozwiązać po stronie php, gdy sprawdzę że brakuje jakiejś nazwy. Czy da się po ponownym wyświetleniu formularza i tekstu z błędami automatycznie uzupełnić input file tym co wybrał wcześniej klient?
wewior
Wg mnie najlepiej przy takich nazwach pól skorzystać z funkcji getElementsByName lub getElementsByTagName (a potem porównujesz wg nazw) i wtedy listujesz sobie pola i sprawdzasz co chcesz. Bo bezpośrednie odwołanie wymagałoby generowania dla pól id i ich listy w jakiejś zmiennej js.
mortus
Można to zrobić np. tak:
  1. <form id="myform" action="" method="post">
  2. <input name="attachmentNames[]" type="text" value="nazwa pliku" />
  3. <input name="attachments[]" type="file" />
  4. <input name="attachmentNames[]" type="text" value="nazwa pliku" />
  5. <input name="attachments[]" type="file" />
  6. <input name="attachmentNames[]" type="text" value="nazwa pliku" />
  7. <input name="attachments[]" type="file" />
  8. <!-- more inputs -->
  9. </form>
  10. <script type="text/javascript">
  11. <!--
  12. var myform = getElementById("myform");
  13. var aNames = myform["attachmentNames[]"];
  14. var a = myform["attachments[]"];
  15. // i w pętli sprawdzamy, czy podano wartość w polach
  16. for(var i = 0; i < aNames.length; i++) {
  17. if(aNames[i].value == '') {
  18. // nie podano nazwy załącznika
  19. zrobCos();
  20. }
  21. if(a[i].value == '') {
  22. // brak załącznika
  23. zrobCos();
  24. }
  25. }
  26. -->
rasten
Dzięki za odp ale mi chodzi o coś troszeczkę innego. Jak rozpoznać czy wpisano nazwę dla danego inputa wyboru pliku. U mnie liczbę tych inputów wybiera sobie użytkownik, klikając na 'dodaj' i pojawiają się kolejne dwa inputy: attachments i attachmentNames.
I teraz tak: wybierze np. że chce załadować 4 pliki. Ale ostatecznie wybierze plik w 1 i 3 inpucie a 2 i 4 zostawi pusty. Czyli chciałbym sprawdzić czy wpisał nazwę właśnie dla 1 i 3. Da się to wogóle zrobić?
Albo ostatecznie po stronie serwera w PHP jak sprawdzę, że nie wpisał tych nazw dla plików, czy jest możliwość ponownego wyświetlenia formularza z już wypełnionymi wybranymi przez klienta plikami w input type="file" ?

EDIT: czyli tak naprawdę co by mnie urządziło to możliwość sprawdzenia czy w input file został wybrany jakiś plik przez użytkownika. Nie mogę nigdzie o tym znaleźć info. Da się czy nie bardzo?
mortus
No ale przecież jak wybierzesz jakiś plik w polu file, to zmieniasz wartość atrybutu value tego pola. Wystarczy drobna modyfikacja przedstawionego skryptu i będzie on spełniał Twoje oczekiwania. Oczywiście skrypt należy podpiąć pod jakieś zdarzenie, bo powyżej zaprezentowany kod działać nie będzie, a gotowca niestety nie dostaniesz.
  1. <script type="text/javascript">
  2. <!--
  3. var myform = getElementById("myform");
  4. var aNames = myform["attachmentNames[]"];
  5. var a = myform["attachments[]"];
  6. // i w pętli sprawdzamy, czy podano wartość w polach
  7. for(var i = 0; i < aNames.length; i++) {
  8. if(a[i].value != '') {
  9. // wybrano jakiś załącznik
  10. // sprawdzamy, czy podano dla niego nazwę
  11. if(aNames[i] == '') {
  12. // nie podano nazwy, możemy okrzyczeć użytkownika
  13. var emptyName = true;
  14. }
  15. }
  16. if(emptyName) {
  17. // tu go okrzyczymy
  18. // i zatrzymamy przetwarzanie formularza, coby nie został wysłany
  19. return false;
  20. }
  21. -->

Niestety po przesłaniu formularza pól typu file nie można ponownie wypełnić.

Właściwie rozwiązanie masz podane jak na dłoni. Jeśli nie zamierzasz wykazać się inicjatywą, to umieść ogłoszenie w odpowiednim dziale.
Fifi209
Mordus a wiesz że na forum jest tag [ javascript ] ?

@topic
Musisz sprawdzić, które pliki wybrał i zapisać sobie indeksy i po indeksach sprawdzać drugie pole.
mortus
@Fifi209 Ta uwaga to do mnie, bo chyba przekręciłeś nazwę użytkownika. <script> to tag HTML-owy. Wracając do tematu: w jednym przebiegu pętli nie można tego zrobić, bo... co? Skrypt wyżej nie zapisuje żadnych indeksów, a sprawdza odpowiednie pole. W jQuery będzie to jeszcze łatwiej obsłużyć.
rasten
Trochę przerobiłem i napisałem w jQuery, może się komuś przyda:
  1. $('input[type=file][name^=attachments]').each(function(index) {
  2. if($(this).val() != '')
  3. {
  4. // IMPORTANT get() zwraca element DOM a nie obiekt jQuery dlatego jest 'value'
  5. var nazwa = $('input[name^=attachmentNames]').get(index).value;
  6. if( trim(nazwa) == '' || trim(nazwa) == 'nazwa pliku')
  7. {
  8. is_valid = false;
  9. errorsMsg.push('* Proszę podać nazwy wszystkich plików.');
  10. return false;
  11. }
  12. }
  13. });
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.