10

クリックするとデータベースが更新されて消えるフォーム要素がいくつかあります。

最初に、「チェックイン」というボタンがあります。クリックすると、データベースが更新され、ボタンの代わりにドロップダウンが表示されます。ドロップダウンには、ユーザーが選択できる場所があり、対応する場所番号の値があり、クリックするとデータベースが更新されます。最後のオプションには [チェックアウト] というラベルが付けられており、クリックすると、データベースが最後にもう一度更新され、チェックアウトされたことを示す赤いテキストが表示されます。

問題は、上記のプロセスのセットが複数あることです (つまり、選択に変わり、Checked Outを読み取る多くの Check In ボタンがあり、すべて個別に機能します)。したがって、データベースを更新すると同時に、各セットの ID をデータベースに渡す方法が必要です。各ボタンの下にある隠しフィールドのようなものを考えていました。そこにはIDが入力されており、 [チェックイン]ボタンがクリックされると、ajaxは隠しフィールドを送信しますか?

これが私のhtmlです:

<button class="checkIn">Check In</button>

<form method='post' class='myForm' action=''>
  <select name='locationSelect' class='locationSelect'>
     <option value='1'>Exam Room 1</option>
     <option value='2'>Exam Room 2</option>
     <option value='3'>Exam Room 3</option>
     <option value='4'>Exam Room 4</option>
     <option value='CheckOut'>Check Out</option>
  </select>
</form>

そしてここにjqueryがあります

<script src="http://code.jquery.com/jquery-1.8.2.js"></script>

<script type="text/javascript">
$(document).ready(function() {    
    $('.locationSelect').hide();
    $('.finished').hide();
});

$('.checkIn').click(function(){
    $e = $(this);
    $.ajax({
    type: "POST",
    url: "changeloc.php",
    data: "checkIn="+$(this).val(),
    success: function(){
      $('.checkIn').css("display","none");
              $('.locationSelect').show();        
         }
    });
});

$('.locationSelect').change(function(){
    $e = $(this);
    $.ajax({
       type: "POST",
       url: "changeloc.php",
       data: "locationSelect="+$(this).val(),
       success: function(){

       }
    });
});
$('.locationSelect option[value="CheckOut"]').click(function(){
    $e = $(this);
    $.ajax({
       type: "POST",
       url: "changeloc.php",
       data: "checkOut="+$(this).val(),
       success: function(){
       $('.locationSelect').css("display","none");
       $('.finished').show();
       alert('done');
       },
       error: function(request){
       alert(request.responseText);
       }
    });
});

</script>

私の解決策が実行可能かどうかはわかりませんので、他の解決策を提案してください。他の詳細が必要な場合は、お問い合わせください。

助けてくれてありがとう!

4

5 に答える 5

9

サーバーに送信するときにデータをmap..ペアとして送信する方がクリーンです。(Key : value )

これの代わりに

data: "checkIn="+$(this).val(),

このまま送ってみる

data: { "checkIn" :  $(this).val() } ,

編集

このロジックを実行するには、最初に非表示の入力フィールドを使用する必要はありません..作業を完了するためにHTML5 data-* 属性を使用することをお勧めします..これは HTML 検証にも合格します...

ボタンとフォームが上下にあると仮定しましょう。次に、ボタンにbutton-1 と呼ばれるデータ属性と 、対応するselectのselect-1を与えることができます。

HTML は次のようになります。

<button class="checkIn" data-param="button-1">Check In</button>

<form method='post' class='myForm' action=''>
  <select name='locationSelect' class='locationSelect' data-param="location-1">
     <option value='1'>Exam Room 1</option>
     <option value='2'>Exam Room 2</option>
     <option value='3'>Exam Room 3</option>
     <option value='4'>Exam Room 4</option>
     <option value='CheckOut'>Check Out</option>
  </select>
</form>
<div class="finished" >
    Checked Out
</div>

<button class="checkIn" data-param="location-2">Check In</button>

<form method='post' class='myForm' action=''>
  <select name='locationSelect' class='locationSelect' data-param="location-2">
     <option value='1'>Exam Room 1</option>
     <option value='2'>Exam Room 2</option>
     <option value='3'>Exam Room 3</option>
     <option value='4'>Exam Room 4</option>
     <option value='CheckOut'>Check Out</option>
  </select>
</form>
<div class="finished" >
    Checked Out
</div>
.....

Javascript

$(document).ready(function() {
    $('.locationSelect').hide();  // Hide all Selects on screen
    $('.finished').hide();        // Hide all checked Out divs on screen

    $('.checkIn').click(function() {
        var $e = $(this);
        var data = $e.data("param").split('-')[1] ;
        // gets the id  of button  (1 for the first button)
        // You can map this to the corresponding button in database...
        $.ajax({
            type: "POST",
            url: "changeloc.php",
            // Data used to set the values in Database
            data: { "checkIn" : $(this).val(), "buttonid" : data},
            success: function() {
                // Hide the current Button clicked
                $e.hide();
                // Get the immediate form for the button
                // find the select inside it and show...
                $e.nextAll('form').first().find('.location').show();
            }
        });
    });

    $('.locationSelect').change(function() {
        $e = $(this);
        var data = $e.data("param").split('-')[1] ;
        // gets the id  of select (1 for the first select)
        // You can map this to the corresponding select in database...
        $.ajax({
            type: "POST",
            url: "changeloc.php",
            data: { "locationSelect" : $(this).val(), "selectid" : data},
            success: function() {
                // Do something here
            }
        });
    });
    $('.locationSelect option[value="CheckOut"]').click(function() {
        var $e = $(this);
        var data = $e.closest('select').data("param").split('-')[1] ;
        // gets the id  of select (1 for the first select)
        // You can map this to the corresponding select in database...
        // from which checkout was processed
        $.ajax({
            type: "POST",
            url: "changeloc.php",
            data: { "checkOut" : $(this).val(), "selectid" : data},
            success: function() {
                // Get the immediate form for the option
                // find the first finished div sibling of form
                // and then show it..
                $e.closest('form').nextAll('.finished').first().show();
                // Hide the current select in which the option was selected
                $e.closest('.locationSelect').hide();
                alert('done');
            },
            error: function(request) {
                alert(request.responseText);
            }
        });
    });
});​

ほとんどのロジックをコード内のコメントとして記述しました。

于 2012-10-25T19:55:20.133 に答える
5

それで、あなたがここで何を求めているかについての私の理解から、あなたは異なる試験室のためにそのHTMLの複数のインスタンスを持っていますか?この場合は、ボタンまたは親ラッパーのいずれかに、更新しようとしているデータベースの行に何らかの方法で関連付けるIDを指定します。非表示のフィールドは必要ありません。必要なIDキーを持つデータ属性をボタンに指定するだけです。この例では、それをと呼びましょうgroup_1

したがって、グループをHTMLでラップします。

<div class='group' id='group_1'>
    <button class="checkIn">Check In</button>

    <form method='post' class='myForm' action=''>
      <select name='locationSelect' class='locationSelect'>
         <option value='1'>Exam Room 1</option>
         <option value='2'>Exam Room 2</option>
         <option value='3'>Exam Room 3</option>
         <option value='4'>Exam Room 4</option>
         <option value='CheckOut'>Check Out</option>
      </select>
    </form>
</div>

ボタンをクリックして、親ラッパーIDを取得します。

$('.checkIn').click(function(){
    var id = $(this).parent('.group').attr('id');
    $.ajax({
    type: "POST",
    url: "changeloc.php",
    data: "checkIn="+$(this).val()+"&group="+id,
    success: function(){
      $('.checkIn').css("display","none");
      $('.locationSelect').show();

    }
    });
});

次に、サーバー側で、AJAXで送信した2番目のデータ値を使用して更新するグループを決定する何らかのロジックでDBを更新します。

于 2012-10-29T21:18:33.127 に答える
4

私はそれを次のように書きます:

post_data = $(this).val();

$.ajax({
    type: "POST",
    url: "changeloc.php",
    data: "checkIn=" + post_data,
    success: function(){
      $('.checkIn').css("display","none");
      $('.locationSelect').show();
    }
});
于 2012-10-29T18:07:16.453 に答える
3

私は常に動的フォームを扱っており、HTML 要素のデータ属性を利用することを強くお勧めします。

PHP のループから生成されたサンプル HTML:

<button class="checkIn" data-group-id='{$group->id}'>Check In</button>

<select name='locationSelect' data-group-id='{$group->id}' class='locationSelect'>
   <option value='1'>Exam Room 1</option>
   <option value='2'>Exam Room 2</option>
   <option value='3'>Exam Room 3</option>
   <option value='4'>Exam Room 4</option>
   <option value='CheckOut'>Check Out</option>
</select>

Javascript:

<script type="text/javascript">
$(function() {    
    $('.locationSelect').hide();
    $('.finished').hide();
});

$('.checkIn').click(function(){
    var group_id = $(this).data('group-id'),

    $.post('changeloc.php', {checkIn: group_id}, function(){
        $(this).hide();
        $('.locationSelect[data-group-id="' + group_id + '"').show();
    }
});

$('.locationSelect').change(function(){
    $.post('changeloc.php', {locationSelect: $(this).val()}, function(){
        // Do something here
    }
});

$('.locationSelect').change(function(){
    if ($(this).val() == 'CheckOut') {
        var group_id = $(this).data('group-id');

        $.post('changeloc.php', {checkOut: group_id}, function(data){
            // If you're getting unexpected behavior do console.log(data);
            $('.locationSelect[data-group-id="' + group_id + '"').hide();
            $('.finished').show();
            alert('done');
        }
    }
});
</script>

お役に立てれば!生の PHP を書いているような気がします。もしそうなら、いくつかの OOP フレームワークをチェックすることをお勧めします。(個人的なお気に入り: laravel)

于 2012-11-02T16:16:02.110 に答える
0

フォーム要素の各セットに単純に配列名を付けないのはなぜですか?

<button name="btn_checkin[1]" class="checkIn">Check In</button>

<form method='post' name="myForm[1]" class='myForm' action=''>
<select name='locationSelect[1]' class='locationSelect'>
    <option value='1'>Exam Room 1</option>
     <option value='2'>Exam Room 2</option>
     <option value='3'>Exam Room 3</option>
     <option value='4'>Exam Room 4</option>
     <option value='CheckOut'>Check Out</option>
</select>
</form>

サーバー側には、配列があります。たとえば、次のようになります。

$valueOfLocationSelect1 = $_POST['locationSelect'][1];

おそらくそれが役立ちます

于 2012-11-03T21:51:42.277 に答える