2010-11-18 24 views
5

Próbuję pracować na istniejącej stronie i znalazłem błąd, ale nie jestem pewien, dlaczego to błąd lub jak go obejść.Elementy pola wyboru HTML są przesyłane tylko, jeśli są zaznaczone?

Strona internetowa zawiera listę niektórych nieruchomości komercyjnych przeznaczonych do wynajęcia w jednym mieście. Istnieje klasa, która pobiera listy z bazy danych i tworzy obiekt z każdego z nich. W każdym obiekcie znajduje się tablica obrazów powiązanych z tą właściwością.

Gdy użytkownik edytuje aukcję, uzyskuje stronę edycji z listą obrazów oraz pole wyboru "usuń" obok nich. Pola wyboru mają tę samą nazwę, więc po ich przesłaniu z powrotem do serwera aplikacja otrzymuje tablicę obrazów do usunięcia.

Co powinno się zdarzyć, jest to, że aplikacja ma tę tablicę wartości włączania/wyłączania (gdzie on = delete), a indeks każdej wartości w tablicy odpowiada indeksowi obrazu w obiekcie aukcji - gdy jedna z wartości jest "włączona", nazwa pliku w tablicy obrazów odpowiadająca tej wartości "on" jest usuwana z systemu plików, a obraz ten jest usuwany z bazy danych.

Jednak po przesłaniu formularza aplikacja otrzymuje tablicę 0 indeksowanych tylko zaznaczonych pól wyboru. Więc jeśli mogę ustawić trzy dowolne obrazy do usunięcia, aplikacja dostanie

 
Array { 
    [0] => "on", 
    [1] => "on", 
    [2] => "on" 
} 

To oczywiście nie działa, pierwsze 3 zdjęć w aukcji zostaną usunięte niezależnie od pola wyboru są ustawione.

Jak mogę to naprawić? Chciałbym uniknąć nazwania każdego pola wyboru (delete_1, delete_2, delete_3, itp.), Ponieważ system jest już zbudowany, aby działał ze wszystkimi polami o tej samej nazwie. Czy istnieje sposób, w jaki mogę wymusić przesłanie wszystkich pól wyboru z włączonym lub wyłączonym?

Odpowiedz

5

Nie, nie można zmusić niezaznaczone pola wyboru, aby być złożone, ale można podaj im unikalne wartości (zamiast "włącz" dla wszystkich), aby określić, które z nich są sprawdzane bez zmiany nazw.

+0

Awesome, nie wiedziałem, że możesz zrobić że. Wielkie dzięki (zaakceptuje, gdy dozwolone) –

+0

omg, to jest straszne rozwiązanie i zdecydowanie nie jest odpowiedzią na pytanie. – zerkms

+2

@Steve Chciałem uniknąć nazywania ich w różny sposób, ponieważ musiałoby to zmienić zachowanie zaplecza. Nie wiedziałem, że możesz podać wartość inną niż "włączony" lub "wyłączony" - wymagałoby to minimalnych zmian. –

6

Nie ma sposobu, aby zmusić, ale można po prostu dodać ukrytą tuż przed polem wyboru z tej samej nazwie i potrzebna wartość:

<input type="hidden" name="delete[42]" value="off" /> 
<input type="checkbox" name="delete[42]" value="on" /> 
+2

Przepraszamy, próbowałem uniknąć różnych na mes dla każdego pola wyboru. Obecnie wszystkie są po prostu nazwane 'delete', a aplikacja otrzymuje je jako tablicę. Nie sądzę, aby ta technika działała z tymi wszystkimi o tej samej nazwie. –

+0

@Carson Myers: jak już powiedziałem, możesz podać ** tę samą nazwę ** do pola wyboru. Nie jest jasne, jakie nazwy masz ''. Czy lepiej? – zerkms

+0

@Karson Myers: "Nie sądzę, żeby ta technika działała" - dlaczego nie spróbujesz? ;-) – zerkms

1

Jeśli naprawdę chcesz zwrócić tablicę na ons i offs, musisz dołączyć funkcję do formularza submit, który wyszuka wszystkie pola z podaną nazwą i umieści ich wartości w tablicy .

w jQuery będzie to wyglądać mniej więcej tak ...

$('#yourForm').submit(function(){ 
    var array = new Array(); 
    $('input[name="nameOfCheckboxes"]').each(function(index){ 
     array[index] = $(this).value(); 
    } 
    var r = $.param(array); 
    $('#someHiddenFieldInForm').value(r); 
} 

(kod jest niesprawdzone, oczywiście)

+2

+1 dla prawidłowego rozwiązania, ale javascript wydaje się przesadny dla tego problemu –

+0

Javascript, naprawdę? – Stephen

+0

Czy naprawdę nie masz nic lepszego do narzekań? Carson poprosił o rozwiązanie, które nie wymagałoby zmiany istniejącej "funkcjonalności". Jego pytanie nie było jasne, na ile był skłonny do zmiany, a używanie JavaScript nie wymagało zmian w istniejącym kodzie. – Jeremy

1

Można rozwiązać ten problem poprzez dodanie następującej jQuery:

$(function() { 
    $("#myform").submit(function(){ 
    $("input[name='delete']:not(:checked)").attr("checked","checked").val("off"); 
    }); 
}); 

myform jest identyfikatorem twojego formularza, a delete jest nazwą pól wyboru.

+1

Przez krótki czas rozważałem używanie javascript, ale w tej sytuacji wydawało się, że to przesada. Przyjęta odpowiedź na to pytanie wymagała zmiany "foreach ($ listing ['delete'] jako $ index => $ state)' na 'foreach ($ listing ['delete'] jako $ index)', co moim zdaniem jest idealne rozwiązanie dla mnie. +1 dla poprawnego rozwiązania, ale –

+0

Gert, jak twój lepszy niż mój. +1 – Jeremy

+1

Javascript jest rozwiązaniem hack. – Stephen

1

Rozwiązanie Fred Nurk jest dobre i przegłosowałem to. Osobiście, kiedy miałem tę sytuację, zawsze nadawałem pola różne nazwy. Używam wspólnego przedrostka, a następnie podkreślenia, aby łatwo było go rozpoznać, a następnie podać identyfikator. Często utworzę zestaw pól z tym samym wzorem, na przykład "nazwa_1", "kwota_1", "foobar_1", "nazwa_2", "kwota_2" itd.Łatwo jest przechodzić przez pola i rozróżniać te nazwy. (W Javie, po prostu indexOf ("_").)

0

Innym sposobem obejścia tego problemu jest zaakceptowanie dziwności formularzy HTML i przechwycenie ich lokalną zmienną, która zatrudnia ternary operators podczas deklaracji.

Na przykład, biorąc pod uwagę pole

<input type="checkbox" name="notify_users" id="notify_cb"> 

można przetwarzać w słupek tak niezależnie od włączenia wartości checkbox:

// normal boolean value  
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on');  
// explicitly set a 1 or 0 
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on')? 1 : 0); 
// explicitly set 'yes' or 'no' 
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on')? 'yes' : 'no'); 

W mojej głowie to korzystne jest dodanie dodatkowej Javascript do klienta, choćby dlatego, że jest to odrobinę mniej do utrzymania (i prawdopodobnie bardziej zrozumiałe dla następcy/innego dev'a, który gubi to, co się dzieje)

Powiązane problemy