2012-03-07 7 views
1

したがって、私は基本的にこのフォームに追加する必要があります - http://jsfiddle.net/tSsvb/自動的に価格計算。たとえば、これらのパラメータは - (3つの自転車はテストのみ、100や200のようにもあります)。 だから、基本的には -自動的にフォームの価格jquery/javascript関数を計算

Bike 1 - 
Price for 1 - 2 days in Season 1 - 5$ per day. 
Price for 1 - 2 days in Season 2 - 10$ per day. 
Price for 1 - 2 days in Season 3 - 20$ per day. 
Price for 3 - 7 days in Season 1 - 4$ per day. 
Price for 3 - 7 days in Season 2 - 7$ per day. 
Price for 3 - 7 days in Season 3 - 15$ per day. 
Price for 8+ days in Season 1 - 3$ per day. 
Price for 8+ days in Season 2 - 5$ per day. 
Price for 8+ days in Season 3 - 12$ per day. 

Bike 2 - 
Price for 1 - 2 days in Season 1 - 10$ per day. 
Price for 1 - 2 days in Season 2 - 20$ per day. 
Price for 1 - 2 days in Season 3 - 30$ per day. 
Price for 3 - 7 days in Season 1 - 7$ per day. 
Price for 3 - 7 days in Season 2 - 15$ per day. 
Price for 3 - 7 days in Season 3 - 25$ per day. 
Price for 8+ days in Season 1 - 5$ per day. 
Price for 8+ days in Season 2 - 12$ per day. 
Price for 8+ days in Season 3 - 22$ per day. 

Bike 3 - 
Price for 1 - 2 days in Season 1 - 3$ per day. 
Price for 1 - 2 days in Season 2 - 5$ per day. 
Price for 1 - 2 days in Season 3 - 10$ per day. 
Price for 3 - 7 days in Season 1 - 2$ per day. 
Price for 3 - 7 days in Season 2 - 3$ per day. 
Price for 3 - 7 days in Season 3 - 7$ per day. 
Price for 8+ days in Season 1 - 1$ per day. 
Price for 8+ days in Season 2 - 2$ per day. 
Price for 8+ days in Season 3 - 5$ per day. 

や季節の日付がある -

Season 1: 1 January to 10 June and 21 September to 31 December 
Season 2: 11 June to 30 June and 1 September to 20 September 
Season 3: 1 July to 31 August 

それでは、テスト計算を行うことができます。私は9月25日から7月1日までの日付を選択した場合 計算は次のように自転車3のためになります -

62 * 5 + 20 * 2 + 5 * 1 = 310 + 40 + 5 = 355 $

そして、この合計はテキストフィールド "Price"に自動的に追加されます。日付を変更すると、価格も自動的に変更されるはずです。そのようなものを作成する簡単な方法はありますか?ご質問がある場合は、私はそれらにお答えできますので、私はこの質問をより簡単に解決するのを手助けすることができます。

+0

編集:これはハードコードされたバージョンがありますが、あまりうまく動作せず、約2000行のコード、だから私はそれを短くし、後でそれを使う他のプログラマーにとってより快適にしたいと思っています。 – user1223540

+0

ああ、価格はPHPで引き渡されます。 – user1223540

+0

PhPで適切な価格を計算する場合は、Ajaxコールを使用して入力価格で入力するだけです。 Jquery ajaxコールの例をお探しですか? http://api.jquery.com/jQuery.ajax/ – phemios

答えて

4

ライブ例:http://jsfiddle.net/tSsvb/1/

Iは

  • 様々な季節の配列を表す2つの変数を開始
  • 価格行列を表すオブジェクト

var seasonLookup = [ 
    {startDay: 1, startMonth:1, endDay: 10, endMonth: 6, season:1}, 
    {startDay: 21, startMonth:9, endDay: 31, endMonth: 12, season:1}, 
    {startDay: 11, startMonth:6, endDay: 30, endMonth: 6, season:2}, 
    {startDay: 1, startMonth:9, endDay: 20, endMonth: 9, season:2}, 
    {startDay: 1, startMonth:7, endDay: 31, endMonth: 8, season:3},  
    ]; 

var priceMatrix = { 
    bike3: { 
     1: { t1: 2, t2: 2, t3: 1}, 
     2: { t1: 5, t2: 3, t3: 2}, 
     3: { t1: 10, t2: 3, t3: 5} 
    }   
}; 

最初はかなり簡単です。 2番目は、自分の例で使用したバイクのように、私は自転車3をモディファイしただけです。 12 & 3は、季節を表し、t1 - t3はティアの支払いの1-2日、3-7としてt2と8+などt3としてハードt1とを表しています。

次に、2つの関数を作成しました。一つは、指定した日付のシーズンを取得します。

function getSeason(date){ 
    var day = date.getDate(); 
    var month = date.getMonth()+1; 
    var year = date.getFullYear(); 
    for(var i=0;i<seasonLookup.length;i++){ 
     var s = seasonLookup[i]; 
     var startDate = new Date(year, s.startMonth-1,s.startDay); 
     var endDate = new Date(year, s.endMonth-1,s.endDay); 
     if(date >= startDate && date <= endDate) 
      return s.season; 
    } 
    return null; 
} 

他は指定した日数の間に指定シーズンに指定された自転車の合計価格を取得します。

function getPrice(bike, season, days){ 
    var tier = ""; 
    if(days <=2) 
    tier = "t1"; 
    else if(days <=7)  
     tier = "t2"; 
    else 
     tier = "t3" 
    return priceMatrix[bike][season][tier] * days; 
} 

次のステップであります開始日、終了日、自転車に基づいて実際の計算を行う方法:

function calculatePrice(startDate, endDate, bike) 
{ 
    var currentSeason = getSeason(startDate); 
    var totalPrice = 0; 
    var daysInSeason = 0; 
    var currentDate = startDate; 
    while(currentDate<=endDate){ 
     var season = getSeason(currentDate); 
     if(season != currentSeason){ 
       totalPrice += getPrice(bike,currentSeason,daysInSeason); 
       currentSeason = season; 
       daysInSeason = 0; 
     } 
     daysInSeason++; 
     currentDate.setDate(currentDate.getDate()+1);   
    } 
    totalPrice += getPrice(bike,currentSeason,daysInSeason); 
    return totalPrice; 
} 

最後の部分はhooですドロップダウンの変更があればそれを再計算するようにkアップします。 jQueryはあなたの友人です。私が参照しやすいようにすべてにidを、再計算を起こす必要があるすべての要素にクラスrecalcをhadded、およびパラメータを構築し、メソッドを呼び出すためにchangeイベントにフック:

$('.recalc').change(function(){ 
    var startDate = new Date(parseInt($('#yd').val(),10),parseInt($('#md').val(),10)-1,parseInt($('#dd').val(),10)); 
    var endDate = new Date(parseInt($('#yr').val(),10),parseInt($('#mr').val(),10)-1,parseInt($('#dr').val(),10)); 
    var bike = $('#bike').val(); 

    var price = calculatePrice(startDate,endDate,bike); 
    $('#price').val(price); 

}); 

役に立てば幸い、あなたはPHPから価格マトリクスを生成する必要があるかもしれませんが、あなたのためのエクササイズです:)

+0

こんにちは、ありがとう、私はそれをチェックし、私の側からも何かを追加しようとするとありがとう。基本的に、私がチェックしたのは、あなたが配列で価格を渡したということですが、PHPで渡されたので、それについての提案があれば(私は200以上のバイクを持っていれば)、自動的に追加されます。各ティエムをファイルに書き込む。最初の関数については、わかっている限り、現在の日付をとりますが、私が言いたいのは、フォームフィールド "From"から日付を取らなければならないということです。さて、それは何も深刻ではない、それは簡単に変更することができます。あまりにも何かを把握しようとします。もう一度ありがとう! – user1223540

+0

さて、私は最初の機能についてあなたの考えを理解しました。しかし、今質問は、私はPHP経由で価格を渡す場合、どのように簡単に彼らはJavaScriptの配列PriceMatrixに追加できますか?何か提案はありますか? – user1223540

+0

うーん、それは少し間違って理解していない:)!合計日数が7未満で2より大きい場合は価格がかかりますが、合計日数が8を超える場合は、すべての日に1つの価格(8以上の価格)が適用されます。したがって、基本的に1日か2日かかっている場合は、1日から2日の価格で価格を取得します.2ドル以上7ドル以下であれば、価格は3〜7日間かかります。合計日数が8日以上(この場合は87日)になると、8日以上のすべての計算で価格がかかります。また、時間があるときは、あなたの答えに私の返信をチェックしてください;)!助けてくれてありがとう :)! – user1223540

関連する問題