2010-11-18 10 views
5

私は既存のウェブサイトで作業しようとしていますが、バグを見つけましたが、なぜバグなのか、それを回避する方法がわかりません。HTMLチェックボックスの要素は、チェックされている場合にのみ送信されますか?

ウェブサイトは基本的に、ある都市のリース用の商業用不動産のリストです。データベースからリストを取得し、それぞれからオブジェクトを作成するクラスがあります。各オブジェクトには、そのプロパティに関連付けられたイメージの配列があります。

ユーザーがリスティングを編集すると、編集ページに画像のリストが表示され、その横に「削除」チェックボックスが表示されます。チェックボックスの名前はすべて同じです。したがって、チェックボックスはサーバーに送信されると、削除されるイメージの配列を取得します。

このオン/オフ値の配列(on = delete)がアプリにあり、配列内の各値のインデックスがリスティングオブジェクト内の画像のインデックスに対応しているとします。いずれかの値が "on"の場合、その "on"値に対応するイメージ配列内のファイル名はファイルシステムから削除され、そのイメージはデータベースから削除されます。

ただし、フォームが送信されると、チェックされたチェックボックスのみの0インデックス付きの配列が取得されます。私は削除のための3枚の任意の画像を設定するのであれば、アプリはこれは明らかに動作しません

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

になるだろう、リストの最初の3枚の画像は関係なく、チェックボックスが設定されているのに削除されます。

どうすればこの問題を解決できますか?私はシステムがすでに同じ名前を持つすべてのチェックボックスで動作するように構築されているので、各チェックボックス(delete_1delete_2delete_3、など)の命名を避けたいと思います。すべてのチェックボックスを強制的に "オン"または "オフ"で送信する方法はありますか?

答えて

5

名前を変更せずにチェックされるものを特定するために、それらに( "すべて"の代わりに)ユニークな値を与えます。

+0

あなたができることは分かりませんでしたそれ。ありがとうございます(許可されている場合は受け入れます) –

+0

omg、それはひどい解決策であり、質問に対する答えではありません。 – zerkms

+2

@ Steveバックエンドの振る舞いを変えなければならないので、私はそれらをすべて異なった名前にすることを避けたかったのです。私はあなたが "オン"または "オフ"以外の値を提出できることを認識しませんでした - これは最小限の変更を必要とします –

6

あり強制する方法はありませんが、あなただけの同じ名前と必要な値で、チェックボックスの前に隠された権利を追加することができます:いいえ、あなたが提出する未チェックのチェックボックスを強制することはできませんが、あなたのことが可能

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

申し訳ありませんが、私は別のNAチェックボックスごとに現在、それらはすべて単に「delete」と呼ばれ、アプリケーションはそれらを配列として受け取ります。私はこの技術が同じ名前を持つそれらすべてで動作するとは思わない。 –

+0

@カーソン・マイヤーズ:あなたが**同じ名前**をチェックボックスに付けることができると言った。あなたが 'を持つ名前は明確ではありません。それは良いですか? – zerkms

+0

@Carson Myers: "私はこの技術がうまくいくとは思わない" ---なぜあなたは試してみませんか? ;-) – zerkms

1

オンとオフで配列を返す場合は、指定した名前のすべてのチェックボックスをスキャンしてその値を配列に格納する関数をフォーム送信に添付する必要があります。これは次のようになります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は有効な解決策ですが、javascriptはこの問題の残虐行為です –

+0

Javascript、本当ですか? – 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

私は簡単にjavascriptを使用すると考えましたが、状況には過剰なように思えました。この質問に対する回答は、 'foreach($ listing ['delete'] as $ index => $ state)'をforeach($ indexとして$ list ['delete']) 'に変更することを含んでいました。私のための解決策。有効な解決策は+1ですが、 –

+0

Gert、あなたのものよりも私のほうが優れています。 +1 – Jeremy

+1

Javascriptはハックの解決策です。 – Stephen

1

フレッド・ヌークの解答は良いですが、私はそれを賞賛しました。個人的に私がこのような状況に陥ったとき、私はいつもフィールドに異なる名前を与えました。私は一般的な接頭辞を使用し、その後にアンダースコアを付けることで、認識しやすくなります。 "name_1"、 "amount_1"、 "foobar_1"、 "name_2"、 "amount_2"などのように、すべて同じパターンのフィールドを作成することがよくあります。フィールドをループしてこれらの名前を区別するのはかなり簡単です。

0

この問題を回避するもう1つの方法は、奇妙なHTMLフォームを受け入れ、宣言時にternary operatorsを使用するローカル変数でキャッチすることです(Javaでは、indexOf( '_')のみ)。例えば、チェックボックス

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

与えられたあなたは関係なく、チェックボックスの値を含めることをこのようなポストを処理することができ

:私の心の中で

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

これは、追加のJavascriptを追加することが好ましいですクライアントには、維持するために少し小さい(そして、後継者/他の開発者が何が起こっているのかは間違いなく明確です)

関連する問題