を使用して<cfinput type="datefield">
おり、選択できる日付を制限する必要があります。過去の日付を選択することはできません。ここで何か助けはありますか?
ありがとう!
を使用して<cfinput type="datefield">
おり、選択できる日付を制限する必要があります。過去の日付を選択することはできません。ここで何か助けはありますか?
ありがとう!
サーバー側で厳密に検証するか、クライアント側のjavascriptチェックを追加する2つのオプションがあります。
サーバーサイドの場合、cfm処理ページは次のようにDateCompare関数を使用できます。
<cfif DateCompare(Date1,Date2) EQUAL -1>
<!--- Date 1 < Date 2 --->
<cfelseif DateCompare(Date1,Date2) EQUAL 0>
<!--- Date 1 = Date 2 --->
<cfelseif DateCompare(Date1,Date2) EQUAL 1>
<!--- Date 1 > Date 2 --->
</cfif>
この関数のドキュメントとサンプルコードは、http: //livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content= functions_m-r_11.htmlで入手できます。
別の投稿では、範囲機能の使用が提案されていましたが、Adobeのドキュメントには、数値タイプでのみサポートされていると記載されていたため、これを機能させることができませんでした。
または、JavaScriptを使用して、日付がページに表示されている範囲内にあるかどうかを確認できます。
<html>
<head>
<script type="text/javascript">
function withinRange(submittedDate) {
var start = Date.parse("08/10/2009");
var end = Date.parse("09/11/2009");
var userDate = Date.parse(document.getElementById('leaveDate').value);
var previousDate = document.getElementById('calendarWorkaround').value;
if (!isNaN(userDate) && ( previousDate != userDate)) {
document.getElementById('calendarWorkaround').value = userDate;
if (start <= userDate && end >= userDate) {
alert("Your date is correct!");
} else {
alert("Date is incorrect.");
}
}
}
</script>
</head>
<body>
<cfform name="testing" id="vacationForm"action="testprocess">
<cfinput name="date" type="datefield" id="leaveDate">
<input type="hidden" name="workaround" id="calendarWorkaround" value="-1">
</cfform>
<!--- To get around onChange bug with cfinput type datefield --->
<cfajaxproxy bind="javaScript:withinRange({leaveDate})">
</body>
</html>
ここで、日付フィールドのcfinputにonChange属性を使用しますが、オンラインの他のいくつかのページに記載されているように見えるjavascript関数を呼び出さないというバグがあります。私が使用した回避策は、bind属性を使用したcfajaxproxy呼び出しでした。cfeclipseを使用している場合、構文が正しくないというエラーが表示されますが、私にとっては正常に機能しました。
cfajaxproxyタグを使用すると、カレンダーアイコンをクリックするたびに、必要なものではないjavascript関数が呼び出されるため、非表示の入力タイプが必要です。そのため、ユーザーが最後に選択した値(またはページの読み込み時に-1)を保存して、値が変更された場合にのみ範囲内にあるかどうかを確認するjavascriptが実行されるようにします。これはちょっとしたハックですが、の実装は<cfinput type="datefield">
文書化されているようには機能しません。
この例を変更して、ColdFusionが動的に開始日と終了日を生成し、ハードコーディングされないようにすることもできます。
どちらの方法を選択した場合でも、ユーザーがjavascriptを無効にしている場合に備えて、常にバリューサーバー側を確認する必要があることを覚えておいてください。
これを試して:
3 つの日付フィールド。
1 つは高さ = 0 で隠されています。これが出発点です。ユーザーが [要求日] フィールドで今日を選択できるように、今日プラス 1 を使用しました。
<cfformgroup type="horizontal" height="0">
<cfinput type="datefield" name="firstAvailableDate" value="#dateAdd('d', +1,now())#"
</cfformgroup>
希望日は本日以前のみとなります。
<cfformgroup type="horizontal">
<cfinput type="datefield" name="request_date" id="request_date" mask="mm/dd/yyyy" width="100" label=”Date Requested” onFocus="request_date.disabledRanges=[{rangeStart:firstAvailableDate.selectedDate}];" />
期日は、選択した要求日より後にのみ設定できます。
<cfinput type="datefield" name="datedue" id="datedue" mask="mm/dd/yyyy" width="100" label=”Due Date” onFocus="datedue.disabledRanges=[{rangeEnd:request_date.selectedDate}];" />
</cfformgroup type="horizontal" >
<cfcalendar>
最初は役立つと思ったのですがstartrage
、endrange
無効範囲のようです。
本当に範囲を制限したい場合は、jQuery UI Datepickerのようなものを使用すると思います
実験を通じて、サポートする JavaScript ファイルをカスタマイズして、選択可能な日付を制限することができました。ただし、jQuery オプションも良さそうです。
cfcalendar コンポーネントの endrange 属性に 100 年を追加したところです。そこまで座ってクリックして、あなたの検証に勝るものは誰もいないと思います。
<cfset startRange = #dateformat(now(), 'dd/mm/yyyy')# >
<cfset endRange = dateadd("yyyy", 100, #Now()#)>
<cfset selectedDate = dateadd("d", -1, #Now()#)>
<cfcalendar name="start_period" mask="dd/mm/yyyy" selecteddate="#selectedDate#" startRange="#startRange#" endrange="#endRange#">
サイモン。
私の知る限り、クライアントが過去の日を選択するのを防ぐ簡単な方法はありません。ただし、いくつかのフォームにはそのようなフィールドがあり、サーバー側で現在の日付と照合されます。比較のために時刻なしで日付を生成することを忘れないでください。そうしないと、[今日の日付] < now() になってしまいます。
サーバー側の検証も使用する必要がありますが、cfinput の「範囲」属性を使用して有効な日付を制限できると思います。