9

同様の質問が寄せられていることは知っていますが、解決策が見つかりません。

サンプルとして、既知の年、月、日の一部を使用したサンプル フィドルがあります。年ごとに選択オプションの div を手動で追加する代わりに、選択した年の値などに基づいて div id を動的に設定したいと思います。

データベース (php、mysql、cakephp 1.3) のすべてのドロップダウン オプション値があります。最初のドロップダウンには、レポートが入力された一意の年が含まれています。おそらく選択すると (onchange)、2 番目のドロップダウンは、選択した年にレポートが入力された一意の月のみを表示し、月が選択されると (onchange)、3 番目のドロップダウンには、レポートが入力された各日の日付が入力されます。レポートは 2011 年 8 月に開始されて以来、毎月も毎日も入力されていません。

私のajaxで助けが必要最初のドロップダウン リストから選択したオプションをコントローラーに投稿し、投稿された値に基づいて新しいクエリから db (モデル) に 2 番目のドロップダウン オプションを取得します。ユーザーが最初のドロップダウンから 2013 を選択すると、ajax が変数で "2013" をコントローラーに送信し、コントローラーが値をモデルに送信し、モデルがデータベースにクエリを実行して、レポートが入力された 2013 内の異なる月を取得するとします。そして、年はまだ終わっていないので、表示されるのは 1 月から 7 月までの月だけです。これらは私の月のドロップダウンに入力され、ユーザーは例で 5 月を選択します。Ajax は 5 月または "05" をコントローラー -> モデルに送信し、モデルは DB にクエリを実行して 2013 年 5 月の一意の日付を取得します。これにより、3 番目のドロップダウンが読み込まれます。MM/DD/YYYY の形式でドロップダウンから選択されたすべての値となる非表示の入力フィールドがあります。

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

    <select name="drop_1" id="drop_1">
        <option value="" selected="selected" disabled="disabled">Choose Year</option>
        <option value="">Select Year</option>
        <option value="2011">2011</option>
        <option value="2012">2012</option>
        <option value="2013">2013</option>
    </select>

    <select name="drop_2" id="drop_2">
        <option value="" selected="selected" disabled="disabled">Choose Month</option>
        <option value=""></option>
        <option value="01">January</option>
        <option value="02">February</option>
        <option value="03">March</option>
        <option value="04">April</option>
        <option value="05">May</option>
        <option value="06">June</option>
        <option value="07">July</option>
    </select>

     <select name="drop_3" id="drop_3">
        <option value="" selected="selected" disabled="disabled">Choose Day</option>
        <option value=""></option>
        <option value="05/11/2013">05/11/2013</option>
        <option value="05/12/2013">05/12/2013</option>
        <option value="05/13/2013">05/13/2013</option>
    </select>

-- これは私の jQuery ですが、機能していません... $.get はモデルから値を取得する必要があり、ページの新しいイテレーションを単に iframe にインデックス付けします。

    $(document).ready(function() {
    $('#wait_1').hide();
    $('#drop_1').change(function(){
      $('#wait_1').show();
      $('#result_1').hide();
      $.get("index", {  
        func: "drop_1",
        drop_var: $('#drop_1').val()
      }, function(response){
        $('#result_1').fadeOut();
        setTimeout("finishAjax('result_1', '"+escape(response)+"')", 400);
      });
        return false;
    });
});

function finishAjax(id, response) {
  $('#wait_1').hide();
  $('#'+id).html(unescape(response));
  $('#'+id).fadeIn();
}
function finishAjax_tier_three(id, response) {
  $('#wait_2').hide();
  $('#'+id).html(unescape(response));
  $('#'+id).fadeIn();
}

-- これは、cakephp 1.3 の "index" ビューからの実際のフォームの抜粋です。

<div>
    <!-- Begin Date Selection -->
    <form name="udate" action="/reports/daily/" method="post">
    <?php
    echo "<select id='drop_1' name='drop_1' title='Use the drop list'>";
    echo '<option value="" disabled="disabled" selected="selected">'."Choose Year".'</option>';
        foreach ($years as $select_year) 
        {
        echo '<option value="', $select_year[0]["Year(dated)"], '">', $select_year[0]["Year(dated)"], '</option>';
        }
    echo "</select>";?>

    <?php
    echo "<select name='drop_2' id='drop_2' title='Use the drop list'>";
    echo '<option value="" disabled="disabled" selected="selected">'."Choose Month".'</option>';
        foreach ($months as $select_month) 
        {
        echo '<option value="', $select_month[0]["Month(dated)"], '">', $select_month[0]["Month(dated)"], '</option>';
        }
    echo "</select>";
    echo "<script type=\"text/javascript\">
    $('#wait_2').hide();
        $('#drop_2').change(function(){
          $('#wait_2').show();
          $('#result_2').hide();
          $.get(\"index\", {
            func: \"drop_2\",
            drop_var: $('#drop_2').val()
          }, function(response){
            $('#result_2').fadeOut();
            setTimeout(\"finishAjax_tier_three('result_2', '\"+escape(response)+\"')\", 400);
          });
            return false;
        });
    </script>";?>

    <?php
    echo "<select id='drop_3' name='drop_3' title='Use the drop list'>";
    echo '<option value="" disabled="disabled" selected="selected">'."Choose Day".'</option>';
        foreach ($days as $select_item) 
        {
        echo '<option value="', $select_item[0]["Days(dated)], '">', $select_item[0]["Days(dated)], '</option>';
        }
    echo "</select>";?>
  <span id="wait_1" style="display: none;">
    <img alt="Please Wait" src="http://dev.asi.calpoly.edu/img/ajax-loader.gif"/>
</span>
<span id="result_1" style="display: none;"></span>
<span id="wait_2" style="display: none;">
<img alt="Please Wait" src="http://dev.asi.calpoly.edu/img/ajax-loader.gif"/>
</span>
<span id="result_2" style="display: none;"></span> 
            <?php echo $form->submit('Submit') ?>
        </form>
    </div><!-- End Date Selection -->
4

6 に答える 6

0
<form name="myform">
    <div align="center">


<select name="optone" size="1"
onchange="functionOne(this[this.selectedIndex].value)">
    <option value=" " selected="selected"> </option>
    <option value="Parameter1Value1">Parameter1 First Choice</option>
    <option value="Parameter1Value2">Parameter1 Second Choice</option>
    <option value="Parameter1Value3">Parameter1 Third Choice</option>
</select>

<br><br>
<select name="opttwo" size="1" onchange="functionTwo(this[this.selectedIndex].value)">
    <option value=" " selected="selected"> </option>
    <option value="Parameter2Value1">Parameter2 First Choice</option>
    <option value="Parameter2Value2">Parameter2 Second Choice</option>
    <option value="Parameter2Value3">Parameter2 Third Choice</option>
</select>

<br><br>


<select name="optthree" size="1">
    <option value=" " selected="selected">Final Data for Third List</option>
</select><br><br>


</div></form>

<script>

var $DropDownOneSelected=null;
var $DropDownTwoSelected=null;


function functionOne($value1)
{
    $DropDownOneSelected=$value1;
    // Retrive Data for Second DropDown based on First DrowDown value

}
function functionTwo($value2)
{
    $DropDownTwoSelected=$value2;
    // Retrive Data for Third DropDown based on First and Second DrowDown value

}

</script>
于 2013-07-15T11:31:20.490 に答える
0

私は多くの同様のソリューションを作成しました。非常に良いアイデアは、選択された日付を変数に保存することです。そのため、フィールドの 1 つを変更すると、対応する変数が選択した値で更新されます。選択ボックスのいずれかを変更すると、他のすべてが ajax を介して個別に更新され、すべての変数がハッシュとして送信されます。これにより、別々の選択で何が更新されるかに関する多くの問題が解決されます。

ユーザーが「正しい」方向に進む場合は問題ありませんが、「戻る」場合は問題が発生します... 上記はこれを解決します。

于 2013-07-15T10:41:21.493 に答える
0

複数の ajax 呼び出しは必要ありません。レポートのすべての日付を取得できます。そして、クライアント側でドロップダウンを処理します。

コードを提供するつもりはありません。体系化するのは簡単ですが、状況に合わせてデータを操作する必要があり、それには時間がかかります。

さらに優れたソリューション

  • ドロップダウンの代わりにカレンダー。
    • jQueryUIs カレンダー ウィジェットを使用する場合は、次の投稿が役立ちます: jQuery の datepicker を使用して特定の範囲の日付を強調表示します。つまり、beforeShowDay オプションを使用して、選択可能かどうか、使用する css クラス、および表示するツールヒント テキストを渡します。
    • それ以外の場合は、数年前にこのウィジェットを使用していて、当時は便利であることがわかりました: http://arshaw.com/fullcalendar/。Google カレンダーによく似ています。
于 2013-07-10T00:16:58.023 に答える
0

同様の状況がありました。データベースからの値に基づいて月と日の選択を作成する必要があると思います。dateたとえば、php関数を使用できます<option> echo date(d,Var)-varがデータベースからの日付であると仮定しましょう = 01/05/2013 、その場合、オプションは '01' になり、月の使用の場合<option> echo date(F,Var)、この場合のオプションは 'May' となり、年はそうなります。

すべてのレポート日付を一覧表示するクエリを準備し、クエリからそれらを選択して、select に入力します。

PHPの日付関数を確認してください。

これは現在のJSFiddle です

于 2013-07-12T10:13:10.513 に答える
0

ボリスラフの答えを少し拡張して、あなたを支援する概念を提供します。

ボリスラフが説明する方法はまさに正しく、私見は賞金に値する良い答えです. 私はこれを使用して成功しましたが、ユーザーにとって直感的ではなく、新しいアプリケーションが本当に必要とするタッチスクリーンフレンドリーではありません.

避けるべき 1 つの落とし穴: フォーム ポストを使用する場合 (JS でドロップを読み取るのではなく)、ページの読み込み時に空の s を含める必要があります。そうしないと、認識されるのが非常に難しくなります。それらを同じ名前の他のものに置き換えることは問題ありませんが、新しいフォーム要素を確実に追加することは、必要のない手間です。

<SELECT id='1st' name='1st' onChange='myajax(this.value)'><OPTIONS></SELECT><SPAN id='2span'><SELECT id='2nd' name='2nd' style='display: none;'>.... etc</SPAN>

次のように、うまく機能します。

...年から選ぶ

myajax 関数は、php が送信したものを 2span.innerHTML= に置き換えるだけです...

ただし、代わりにグラフィカル UI を使用するようにソリューションを拡張することをお勧めします。これの最も単純なバージョンは、年、月、日のボタンです。HTML5 には、それらを動的に描画する機能さえあります。ajax を使用して、特定の年の選択に対して無効なボタンをグレー表示または非表示にすることができます。ボタンの大量のコードを返すのは、select ステートメントと同じくらい簡単です。ボタンを生成するときに onClick='myajax(\"whatever\")' を設定するだけです。

于 2013-07-12T09:18:17.750 に答える