2017-08-06 26 views
0

このトピックに関する記事はたくさんありますが、私のニーズにそれらを使用することはできませんでした。目的はdatepickerに変数seconddivvalを使用し、利用可能な日付を表示することです。別の関数の関数のJavascript変数を使用する

私は隠された入力とPHPのforeachループを持っている

<td class='myArray'> 
<input type="hidden" class="activedates" value="<?php echo "['".implode("','",$newactivedate)."'];"; ?>"> 
myarrayのをクリックすると、このJavaScript関数は

$('.myArray').click(function() { 
    seconddivval = $(this).find('input.activedates').val(); 
}); 

上記のすべての作業罰金が、私が上記の入力の値を返します

変数を使用する必要がありますseconddivvalこの関数では

function available(date) { 

    dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' + 
date.getFullYear(); 
    if ($.inArray(dmy, seconddivval) != -1) { 
return [true, ""]; 
    } else { 
return [false,""]; 
    } 
} 

$(".datefromavailable").datepicker({ 
    minDate: 0, 
    dateFormat: 'M dd, yy', 
    changeMonth: true, 
    changeYear: true, 
    numberOfMonths: 2, 
    beforeShowDay: available, 
    onClose: function (selectedDate) { 

     $(".datetoavailable").datepicker("option", "minDate", selectedDate); 
     var days_to_add = 365, // SET DAYS HERE 
     parsed_date = new Date($.datepicker.parseDate('M dd, yy', selectedDate)), 
     add_year = new Date(parsed_date.setDate(parsed_date.getDate() + days_to_add)), 
     formatted_date = $.datepicker.formatDate('M dd, yy', add_year); 

     $(".datetoavailable").datepicker('option', 'maxDate', formatted_date); 
     $(this).parent().next().children().focus(); 
     setTimeout(function() { 
      $(this).next().datepicker('show') 
     },0); 
    } 
}); 

$(".datetoavailable").datepicker({ 
    minDate: 0, 
    dateFormat: 'M dd, yy', 
    changeMonth: true, 
    changeYear: true, 
    numberOfMonths: 2, 
    beforeShowDay: available, 
    maxDate: '+1y' 
}); 
}); 

私はそれが簡単だと確信していますが、私はそれを実現させる方法を見つけることができません。

私は考えることができるすべてを試しました。私は関数の外で変数を宣言し、私はvarを削除した、私はを追加しましたwindow.seconddivval;をクリックすると、関数の最後に戻り値が追加されました。

私は正しい方法であると思っていました。私は唯一の配列を持っている場合は正常に動作しますが、私は複数のアレイを持っている場合、それが唯一の最初の配列を返します。

var seconddivval = <?php echo '["' . implode('", "', $newactivedate) . '"]'; ?>; 

このforeachループも動作しますが、第一の配列を返します。

var seconddivval = new Array(); 
<?php foreach($newactivedate as $key => $val){ ?> 
    seconddivval.push('<?php echo $val; ?>'); 
<?php } ?> 

私は間違って何をしていますか?


EDITここ
$newactivedateが形成されている方法です。

$sqlactivedate = $bddp->prepare("SELECT (nullif(Adate1,'')),(nullif(Adate2,'')),(nullif(Adate3,'')),‌​(nullif(Adate4,'')),‌​(nullif(Adate5,'')),‌​(nullif(Adate6,'')),‌​(nullif(Adate7,'')),‌​(nullif(Adate8,'')),‌​(nullif(Adate9,'')),‌​(nullif(Adate10,'')) 
FROM prices WHERE id_prices = '$id_prices'"); 

$sqlactivedate->execute(); 
$rowactivedate = array(); 

while ($rowactivedate = $sqlactivedate -> fetch(PDO::FETCH_ASSOC)) { 
    $newactivedate = array(); 
    $newactivedate = array_filter($rowactivedate); 

これらは、データベースからフェッチ2行です:

Room1 → {"(nullif(Adate1,''))":"15-8-2017","(nullif(Adate2,''))":"16-8-2017","(nullif(Adate3,''))":"17-8-2017","(nullif(Adate4,''))":"18-8-2017","(nullif(Adate5,''))":"20-8-2017","(nullif(Adate6,''))":"21-8-2017","(nullif(Adate7,''))":"22-8-2017","(nullif(Adate8,''))":"25-8-2017","(nullif(Adate9,''))":"26-8-2017","(nullif(Adate10,''))":"28-8-2017"} 

Room2 → {"(nullif(Adate1,''))":"1-8-2017","(nullif(Adate2,''))":"2-8-2017","(nullif(Adate3,''))":"4-8-2017","(nullif(Adate4,''))":"5-8-2017","(nullif(Adate5,''))":"28-8-2017","(nullif(Adate6,''))":"29-8-2017","(nullif(Adate7,''))":"4-9-2017","(nullif(Adate8,''))":"5-9-2017","(nullif(Adate9,''))":"6-9-2017","(nullif(Adate10,''))":"7-9-2017"} 
+1

ここで、あなたは関数 'available'を呼び出していますか? – Spectarion

+0

datepicker:$("。datefromavailable ")。datepicker({ minDate:0、 DATEFORMAT: 'M ddと、Y-Y'、 changeMonth:真、 changeYear:真、 NUMBEROFMONTHS:2、 beforeShowDay:利用可能、 – Daniela

+0

なぜ 'IF($ .inArray(DMY、$(この).find( '入力.activedates ').val())!= -1){'?ユーザーが 'myArray'をクリックする必要があるのはなぜですか? – Spectarion

答えて

0

で:あなたがいる

if ($.inArray(dmy, seconddivval) != -1) { 

値が配列...
しかし、seconddivvalは、配列がではありません。

それはあなたがそれの配列にする必要があり"['2017-07-04','2017-07-05','2017-07-06']"

のような文字列です。
ですから、テキスト入力中に持っているフォーマットから...それは次のようになります。

var seconddivval_asArray = seconddivval.substr(1,seconddivval.length-2).replace(/'/g,"").split(","); 

CodePen

素晴らしいアイデアは、直接JS変数にechoにあなたの配列になります...それをテキスト入力でエコーするのではなく...


EDIT

わかりました...私たちはあなたのPHPからこれを始めましょう。

$newactivedateは、whileループの前に定義する必要があります。
そして、データを内部にプッシュします。それを完全に上書きしないようにします。私たちは、JS変数にまっすぐにそれをエコーすることができるようにするために「それを文字列化」だろう

$newactivedate = []; 
while ($rowactivedate = $sqlactivedate -> fetch(PDO::FETCH_ASSOC)) { 

    array_push($newactivedate, array_filter($rowactivedate)); 
    //... 
} 

あなたは今の配列を含む配列を持っている...

$newactivedate_string = json_encode($newactivedate); 

はその後JS変数にそれをエコー:

var seconddivval = <?php echo $newactivedate_string; ?>; 

今、あなたはJSで、同じ "配列の配列は、" あなたはPHPでした。
したがって、available(date)関数を少し変更して、それぞれの "内部配列"を調べる必要があります。

function available(date) { 

    dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' + 
    date.getFullYear(); 

    for(i=0;i<seconddivval.length;i++){ 

    if ($.inArray(dmy, seconddivval[i]) != -1) { 
     return [true, ""]; 
    } else { 
     return [false,""]; 
    } 
    } 
} 


そして、関数の外で変数を宣言移動するための方法です。
;)

+0

'' ['2017-07-04'、 '2017-07-05'、 '2017-07-06'] ''は無効です 'JSON' – guest271314

+0

JSON.parseを追加しましたが、コンソールログに以下が表示されます:Uncaught SyntaxError :JSON.parseの位置1 でJSONで予期しないトークン '() – Daniela

+0

@Daniela使用 'json_encode()' 'でphp' – guest271314

0

することはできecho.ready()別名$()$.getJSON()

$(function() { 
    var seconddivval; 
    $.getJSON("/path/to/server") 
    .then(function(json) { 
    seconddivval = json; // global though we will use the variable with `.then()` 
    $(".myArray.input.activedates").data() 
    function available(date) { 
     dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' + 
     date.getFullYear(); 
     if ($.inArray(dmy, seconddivval) != -1) { 
     return [true, ""]; 
     } else { 
     return [false,""]; 
     } 
    } 
    $(".datefromavailable").datepicker(
     {minDate: 0, dateFormat: 'M dd, yy', changeMonth: true 
     , changeYear: true, numberOfMonths: 2, beforeShowDay: available 
    }); 
     }, function err(jqxhr, textStatus, errorThrown) { 
     console.error(errorThrown) 
    }) 
}) 
+0

@Louys私はJSで配列をエコーするのと同じアイデアを持っていましたが、PHP foreachループの最初の配列しか返しません。 – Daniela

+0

また、これは役立ちます:私は配列がJSで一重引用符と二重引用符で正しく宣言されていないことを知っています。私は正しいと信じています var secondivval = <?php echo '["'。implode( '"、 "、$ newactivedate)。'"] '; ?>; しかし、何らかの理由で私がこのコードを隠し入力から直接使用する場合→コンソールログはこれを返します→ "var secondivval = [" – Daniela

+0

'json_encode()'の結果を '$ .getJSON() '電話? HTMLの属性で設定されている場合、 'String'の代わりに' Array'を得るために渡された要素の '.value'を使って' JSON.parse() 'を呼び出す必要があります。 – guest271314

0

との応答を得るにjson_encode()を使用してphpから有効なJSON文字列私は私の間違いを見つけたと思うし、私はそれのためにそれらをここに掲載しています他の人を助けることができる:

1-宣言seconddivval関数内に利用可能な(日)は:外部宣言場合

var seconddivval = <?php echo '["' . implode('", "', $newactivedate) . '"]'; ?>;

不思議だけアレイの最後の行を返します。

2.-私はちょうどwhileループPHPの終了前に、JSのスクリプトを書かれているはずです。その方法を** $(ドキュメント).ready(関数()**

3.-を削除それは正しい行を取ります(間違ってクリック機能を使用するのが間違っていると思っていましたが、間違いを覚えています...)

この問題を解決するのを手伝ってくれてありがとう!

関連する問題