在ColdFusion </cfinput>中的<cfinput type =“datefield”>上使用startdate

时间:2009-08-05 13:52:30

标签: coldfusion validation cfinput

我正在使用<cfinput type="datefield">,我需要限制可以选择的日期。我不能允许过去可以选择的日期。这里有什么帮助吗?

谢谢!

8 个答案:

答案 0 :(得分:2)

您有两个选项可以严格验证服务器端或另外添加客户端javascript检查。

对于服务器端,您的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文档说只支持 numeric 类型。

或者,您可以使用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>

现在我将在 datefield 上使用 cincput onChange 属性,但是有一个错误,它不会调用javascript函数这似乎是在网上的其他几个页面上记录的。我使用的解决方法是使用bind属性调用cfajaxproxy。如果你正在使用cfeclipse,它会给你一个错误,语法不正确,但它对我来说很好。

隐藏输入类型是必要的,因为使用cfajaxproxy标记,每次单击日历图标时,它将调用javascript函数,这不是我们想要的。所以我存储了用户选择的最后一个值(或者在页面加载时为-1),这样只有在值发生变化时才会执行检查它是否在范围内的javascript。这有点像黑客攻击,但是<cfinput type="datefield">的实现并没有按照文档记录的那样工作。

您也可以修改此示例,以便coldfusion动态生成开始日期和结束日期,以便它不会被硬编码。

请记住,无论您选择哪种方式,都应该检查值服务器端,以防用户禁用javascript。

答案 1 :(得分:1)

试试这个:

三个日期字段。

一个被hieght = 0隐藏。这是你的出发点。我今天使用加一,所以用户今天可以在Date Requested字段中选择。

<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" >

答案 2 :(得分:0)

AFAIK,没有简单的方法可以防止客户过去挑选一天。我们在一些表单上有这样的字段,我们检查服务器端的当前日期。只记得在没有时间进行比较的情况下生成日期,或者最终得到[今天的日期]&lt;现在()。

答案 3 :(得分:0)

首先,我认为<cfcalendar>会有所帮助,但似乎startrageendrange适用于禁用范围。

我想如果您真的想限制范围,请使用其他内容,例如jQuery UI Datepicker

答案 4 :(得分:0)

通过实验,我能够将支持的javascript文件自定义为restrict the selectable dates。然而,jQuery选项听起来也不错。

答案 5 :(得分:0)

我刚刚在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#">

西蒙。

答案 6 :(得分:0)

您无法将日期字段限制为可以选择的日期。 CFINPUT没有任何属性来定义此类规则。你必须去Jquery datepicker。如果你想使用cfinput,你可以解决这个问题。

<script language="JavaScript">
 $(function() {
    $( "#date" ).datepicker({
      changeMonth: true,
      changeYear: true,
       minDate: new Date(1939, 10 - 1, 25),
       maxDate: '-1D'
    });
  });
</script>
<cfinput name="date" type="text" size="30"  id="date" >

答案 7 :(得分:-1)

您也应该使用服务器端验证,但我相信您可以使用cfinput的“range”属性来限制有效日期。