2010-11-18 3 views
5

기존 웹 사이트에서 작업하고 있지만 버그를 발견했지만 버그 또는 그 문제를 해결하는 방법이 확실하지 않습니다.HTML 체크 박스 요소는 체크 된 경우에만 제출됩니까?

웹 사이트는 기본적으로 한 도시의 임대용 상업 부동산을 나열합니다. 데이터베이스에서 목록을 가져 와서 각각의 개체를 만드는 클래스가 있습니다. 각 개체에는 해당 속성과 연결된 이미지 배열이 있습니다.

사용자가 목록을 편집하면 이미지 목록이있는 편집 페이지와 그 옆에있는 "삭제"확인란이 표시됩니다. 체크 박스는 모두 같은 이름을 가지므로 체크 박스는 서버로 다시 제출 될 때 삭제할 이미지의 배열을 가져옵니다.

이 앱에는이 on/off 값 배열 (on = delete)이 있으며 배열의 각 값 색인은 목록 객체의 이미지 색인에 해당합니다. 값 중 하나가 "on"이면 해당 "on"값에 해당하는 이미지 배열의 파일 이름이 파일 시스템에서 삭제되고 해당 이미지가 데이터베이스에서 제거됩니다.

그러나 양식이 제출되면 앱은 체크 표시된 체크 박스만으로 색인 된 0 배열을 가져옵니다. 내가 삭제 세 가지 임의의 이미지를 설정하면 앱이 작동하지 않습니다 분명히

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

이를 얻을 것입니다 그래서 목록에서 첫 번째 3 이미지에 관계없이 확인란이 설정되어있는 삭제됩니다.

어떻게 해결할 수 있습니까? 시스템이 이미 같은 이름을 가진 모든 확인란을 사용할 수 있도록 구축되어 있으므로 각 확인란 (delete_1, delete_2, delete_3 등)의 이름을 지정하지 않는 것이 좋습니다. 모든 확인란을 강제로 "on"또는 "off"로 제출할 수있는 방법이 있습니까?

답변

5

아니, 당신은 체크되지 않은 체크 박스를 강요 할 수 제출해야하지만, 당신이 할 수있는 그들에게 이름을 바꾸지 않고 어떤 것이 체크되어 졌는지를 결정하기 위해 그들에게 ("모두"대신에 ") 고유 한 값을 부여하십시오.

+0

굉장하고, 당신이 할 수 있다는 것을 몰랐습니다. 그. 고마워요 (허용 될 때 받아 들일 것입니다) –

+0

mg, 그것은 끔찍한 해결책이며 질문에 대한 답변이 아닙니다. – zerkms

+2

@ 스티브 백엔드의 동작을 변경해야하기 때문에 다르게 이름을 지정하는 것을 피하고 싶었습니다. 나는 당신이 "on"또는 "off"이외의 다른 값을 제출할 수 있다는 것을 깨닫지 못했습니다 - 최소한의 변경 만 필요합니다 –

6

강제 할 방법은 없습니다,하지만 당신은 단지 동일한 이름을 가진 체크 박스 전에 숨겨진 권리를 추가하고 필요한 값 수 :

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

죄송합니다, 다른 NA를 피하려고했습니다. 각 확인란에 대한 mes. 현재 그들은 모두 단지'delete'라고 이름 지어졌고 app은 그것들을 배열로받습니다. 나는이 기술이 모두 같은 이름을 가진 사람들과 함께 작동 할 것이라고 생각하지 않는다. –

+0

@Carson Myers : 나는 ** 같은 이름을 ** 체크 박스에 줄 수 있다고 말했다. 어떤 이름을''인지 명확하지 않습니다. 더 낫니? – zerkms

+0

@Carson Myers : "이 기술이 효과가 없을 것이라고 생각합니다."- 왜 시도하지 않습니까? ;-) – zerkms

1

배열을 on 및 off로 반환하려면 폼 제출에 함수를 연결해야합니다.이 함수는 지정된 이름의 모든 확인란을 검색하여 해당 값을 배열에 넣습니다 . 이 같이 보일 것입니다 jQuery를에

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

+2

+1은 유효한 해결책이지만 자바 스크립트는이 문제에 대해 과도한 것으로 보입니다 –

+0

자바 스크립트, 정말요? – Stephen

+0

불평을하기 위해 그보다 더 좋은 점이 있습니까? Carson은 기존의 "기능성"을 변경할 필요가없는 솔루션을 요구했습니다. 그의 질문은 그가 얼마나 기꺼이 바꿀 지에 대해 명확하지 않았으며, JavaScript를 사용하면 기존 코드를 변경하지 않아도됩니다. – Jeremy

1

는 다음과 같은 jQuery를 추가하여이 문제를 해결할 수 (코드는 물론, 안된) :

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

양식의 ID는 myform이고 확인란의 이름은 delete입니다.

+1

나는 자바 스크립트를 사용하는 것을 간략하게 생각했지만 상황에서는 과도한 것처럼 보였다. 이 질문에 대한 대답은 'foreach ($ listing ['delete '] as $ index => $ state)'를 foreach ($ index ['delete '] $ index)'로 변경하는 것과 관련이 있습니다. 나를위한 해결책. 유효한 해결책을위한 +1 +1 –

+0

Gert, 내 것보다 너의 것 같아. +1 – Jeremy

+1

자바 스크립트는 해킹 솔루션입니다. – Stephen

1

프레드 누룩의 솔루션이 좋고 나는 그것을 upvoted. 개인적으로 내가 이런 상황에 처했을 때 나는 항상 필드에 다른 이름을 부여했습니다. 공통 접두사를 사용하고 밑줄을 뒤따라 인식하기 쉽고 이드의 일종입니다. 'name_1', 'amount_1', 'foobar_1', 'name_2', 'amount_2'등과 같이 동일한 패턴을 사용하여 일련의 필드를 만드는 경우가 많습니다.필드를 반복하고이 이름들을 분리하는 것은 상당히 쉽습니다. (Java에서는 단지 indexOf ('_').

0

이 문제를 해결하는 또 다른 방법은 기이 한 HTML 양식을 받아들이고 선언 중에 ternary operators을 사용하는 로컬 변수로 잡는 것입니다. 추가 자바 스크립트를 추가로 내 마음에

// 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'); 

이있다 바람직 : 당신은 체크 박스 값의 포함 관계없이이 같은 게시물을 처리 할 수 ​​

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

체크 박스 주어진 예를 들어

, 클라이언트에게, 단지 조금 덜 유지하기 때문에 (그리고 틀림없이 후계자/다른 개발자가 무슨 일이 일어나고 있는지 명확히 알 수 있습니다)