8

まず、アプリケーションの仕組みは次のとおりです: (注: ページには、患者 M、患者 E などの複数のユーザーがいます)

1) 患者 X の名前の横に、[チェックイン] というラベルの付いたボタンがあります。これはサーバー側に記録されます。

2) [チェックイン] ボタン をクリックすると、ユーザーが選択できる複数の場所を含むドロップダウン (最初のボタンを置き換える) がユーザーに表示されます。選択から場所を選択すると、サーバー側が再び更新されます。

3) 次に、ユーザーは、ステップ 2 を繰り返して、複数の場所を選択することを決定する場合があります。

4) 最後に、ユーザーが場所の選択を完了すると、ユーザーが手順 2 と 3 で場所をクリックしたのと同じ選択で、[チェックアウト] というタイトルの [チェックアウト] ボタンをクリックします。これをクリックすると、checkloc.php に送信され、ログに記録されます。

5) 最後に、ドロップダウンが消え、Checked Out という単語が表示されます。

残念ながら、問題は、私がコンピューター 1 で、[チェックイン] をクリックし、場所を選択して、チェックアウトするプロセスを実行すると、コンピューター 2 がこれを行うのとは完全に切り離されていることです。

ダイアグラムを次に示します。

私がしたいこと

したがって、基本的には、数秒ごとにサーバー コードを取得し、フォーム要素を現在の値で更新する方法が必要です。私はかなり新しいプログラマーなので、コードとチュートリアルは非常に役立ちます. また、先ほど述べたように、私は新しいプログラマーなので、コードを何らかの方法でクリーンアップできれば、それは素晴らしいことです。

助けてくれてありがとう!ご不明な点がございましたら、ご説明いただければ幸いです。

コードは次のとおりです。

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

<script type="text/javascript">
$(document).ready(function() {
$('.locationSelect').hide();  // Hide all Selects on screen
$('.finished').hide();        // Hide all checked Out divs on screen
$('.checkOut').hide();

$('.checkIn').click(function() {
    var $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    // gets the id  of button
    // You can map this to the corresponding button in database...
    $.ajax({
        type: "POST",
        url: "checkin.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...
            $('.locationSelect').show();
            $('.checkOut').show();
        }
    });
});

$('.locationSelect').change(function() {
    $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    // gets the id  of 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
        }
    });
});

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

});
</script>

およびhtml:

<button class="checkIn" data-param="button_9A6D43BE-D976-11D3-B046-00C04F49F230">Check In</button>

<form method='post' class='myForm' action=''>
  <select name='locationSelect' class='locationSelect' data-param="location_9A6D43BE-D976-11D3-B046-00C04F49F230">
    <option value="0">Select a location</option>
    <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>
  </select>
</form>
<button class="checkOut" data-param="cbutton_9A6D43BE-D976-11D3-B046-00C04F49F230">Check Out</button>

<div class='finished' style='color:#ff0000;'>Checked Out</div>

サーバー側のコードを次に示します (テスト用に 3 つのページに分割しました)。

checkin.php

<?php

date_default_timezone_set('America/Denver');

$apptid = $_REQUEST['buttonId'];
$currentlocationstart = date("Y-m-d H:i:s"); 

if(isset($_REQUEST['checkIn'])){
    $checkin = 0;
}


$hostname = 'localhost';

$username = '*******';

$password = '******';


$conn = new PDO("mysql:host=$hostname;dbname=sv", $username, $password);

$sql = "UPDATE schedule SET currentlocation = ?, currentlocationstart = ? WHERE apptid= ? ";
$q = $conn->prepare($sql);
$q->execute(array($checkin,$currentlocationstart, $apptid));


?>

locationchange.php

<?php

date_default_timezone_set('America/Denver');

$apptid = $_REQUEST['selectId'];
$currentlocationstart = date("Y-m-d H:i:s"); 

if(isset($_REQUEST['locationSelect'])){
    $currentLocation = $_REQUEST['locationSelect'];
}


$hostname = 'localhost';
$username = '*****';
$password = '*******';


$conn = new PDO("mysql:host=$hostname;dbname=sv", $username, $password);

$sql = "UPDATE schedule SET currentlocation = ?, currentlocationstart = ? WHERE apptid= ? ";
$q = $conn->prepare($sql);
$q->execute(array($currentlocation,$currentlocationstart, $apptid));

?>

およびcheckout.php

<?php

date_default_timezone_set('America/Denver');

$apptid = $_REQUEST['buttonId'];
$currentlocationstart = date("Y-m-d H:i:s"); 

if(isset($_REQUEST['checkOut'])){
    $checkin = 1000;
}


$hostname = 'localhost';

$username = '*********';

$password = '********';


$conn = new PDO("mysql:host=$hostname;dbname=sv", $username, $password);

$sql = "UPDATE schedule SET currentlocation = ?, currentlocationstart = ? WHERE apptid= ? ";
$q = $conn->prepare($sql);
$q->execute(array($checkin,$currentlocationstart, $apptid));


?>
4

4 に答える 4

6

「ハートビート」と呼ばれる方法論について言及しています。ここに例を投稿しますが、最初にいくつかの指針を示したいと思います。あなたが言ったように、あなたは新しい開発者です:)。

1) JQuery では、クラス セレクターの使用を避けるようにしてください。遅いことで有名です。可能であれば ID セレクターを使用するか、それが不可能な場合は検索範囲を狭めたノード名セレクターを使用します。ブラウザは ID を一種の「インデックス」または「キー」として dom 要素に使用するため、最も高速な検索になります。

2) プリロード!クラス セレクターを使用する場合でも、使用しないでください。

    $('.locationSelect')

何度も。同じ DOM 要素を複数回参照する場合は、次のようにします。

    var locationSelect = $('.locationSelect'); //this creates a reference
    $(locationSelect).whatever() //this uses the reference

これにより、DOM を 1 回だけ検索します。小さなアプリでは大したことではないように思えますが、アプリがますます複雑になるにつれて、要素を DOM で検索するのにますます時間がかかります。参照を使用すると、一度だけ検索できます。

3) (オプション) AngularJS (Google によって作成された) のような MVC プラットフォームを使用することをお勧めします。MVC (モデル ビュー コントローラー) を使用すると、"モデル" (基本的には JavaScript オブジェクト) を更新でき、"ビュー" (HTML) は UI バインディングと呼ばれるものを使用してその値を自動的に調整します。これは、最初からアプリを開発するのに最適な方法ですが、プレーン ジェーン コードにすでに精通している場合は、実用的ではない可能性があります。私はまだ彼らのチュートリアルを見て、それがあなたに何を提供できるかを見ていきます: http://docs.angularjs.org/tutorial/

それでは、元の質問に進みましょう。はい、これは、ハートビートと呼ばれる方法論を使用することにより、jQuery で完全に可能です。ハートビートを使用すると、サーバーとクライアント間のデータの永続性をエミュレートできます。ハートビートの頻度が高いほど、クライアントはより同期されますが、Web サーバーの負荷も大きくなります。バランスをとる行為です。
一言で言えば、次のように機能します。

    setInterval(function(){
        $.ajax({
           url: 'heartbeatscript.php',
           method: 'post'
           //whatever data you want to send
        }).done(function(data){
           //do whatever with the returned result
        });
    },heartbeatInterval); //heartbeatInterval will be however many MS you want    

クライアントとサーバー間の通信に JSON を使用することもお勧めします。JSON はどちらの側でも簡単に解析でき、クライアント側では大量のデータを解析するための最速のメカニズムです。JSON は JavaScript オブジェクトに直接解析されます。これは、JS がブラウザ内にオブジェクト Data を保存するために文字どおり使用するものであるためです。XML も良い選択です。どちらも非常に簡単に開始できます。

クライアント側: jQuery を使用して基本的な XML を解析できます。

    $('nodeName',xml);

次のように、JSON を JSO に解析できます。

    var JSO = JSON.parse(JSONString);                           
于 2012-11-13T16:18:24.747 に答える
5

サイトが言うように、 Socket.IOを見てください:

Socket.IO とは何ですか?

Socket.IO は、すべてのブラウザーとモバイル デバイスでリアルタイム アプリを実現することを目指しています。

Socket.IO は NodeJS/Javascript にありますが、Socket.IO で PHP を使用することについてかなりの議論があります。

于 2012-11-12T23:23:15.723 に答える
2

すべてのアクションがクライアントで開始されることは、Web アプリケーションの基本原則の 1 つです。つまり、いずれかのコンピューターで表示を変更したい場合、誰かがそのコンピューターで何かをクリックする必要があります。元々、サーバーで何かが発生した場合に 2 台目のコンピューターの表示を更新する可能性はなく、簡単な解決策はまだありません。

しかし、最近のブラウザではいくつかの技術が開発されており、Web メール クライアントやレスポンシブな「Web 2.0」アプリケーションで広く使用されています。それらのいずれかを決定して自分で実装する必要があり、それぞれに長所と短所があります。

(単純な「更新」ボタンを除いて) 最も簡単に実装できるのは、おそらく数秒ごとに AJAX 要求を実行し、サーバーが報告する現在のユーザー状態に従って画面を更新することです。

于 2012-11-10T00:58:09.183 に答える
2

Basically it seems what you are looking to do is to update data from one machine on another machine without the need to do a page reload.

It is good that you already have some familiarity with AJAX, as that will probably be one of the ways you can implement your solution. What you are needing, in essence, is to poll the server from the webpages at some specified interval (maybe every second or every few seconds depending on your need). You can do this using AJAX.

When you poll this server, you can pull down data (HTML fragments, JSON data, whatever makes sense in your application) and use this data to update the page. So when a user makes an update on Computer 1, Computer 2 will be able to poll the server and pull in updates related to the data changes on Computer 1.

于 2012-11-10T00:59:11.763 に答える