Использовать начальную дату для <cfinput type = "datefield"> в ColdFusion
Я использую <cfinput type="datefield">
и мне нужно ограничить даты, которые можно выбрать. Я не могу позволить дату, которая может быть выбрана в прошлом. Любая помощь здесь?
Спасибо!
8 ответов
Ну, у вас есть два варианта: проверять его строго на стороне сервера или дополнительно добавлять проверку 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 сказано, что она поддерживается только для числовых типов.
В качестве альтернативы вы можете использовать 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>
Теперь я бы использовал атрибут onChange для cfinput в поле даты, однако есть ошибка, заключающаяся в том, что он не вызывает функцию javascript, которая, как представляется, документирована на нескольких других страницах в Интернете. Обходной путь, который я использовал, был вызов cfajaxproxy с атрибутом bind. Если вы используете cfeclipse, он выдаст ошибку, что синтаксис неправильный, однако он работал нормально для меня.
Скрытый тип ввода необходим, потому что с тегом cfajaxproxy каждый раз, когда вы нажимаете значок календаря, он вызывает функцию javascript, а это не то, что нам нужно. Поэтому я сохраняю последнее значение, выбранное пользователем (или -1 при загрузке страницы), чтобы JavaScript, чтобы проверить, находится ли он в пределах диапазона, выполняется только при изменении значения. Это немного взломать, однако реализация <cfinput type="datefield">
не работает как задокументировано.
Вы также можете изменить этот пример так, чтобы Coldfusion Dynamic генерировал дату начала и дату окончания, чтобы он не был жестко запрограммирован.
Просто помните, что какой бы путь вы ни выбрали, вы всегда должны проверять сторону сервера значений на тот случай, если у пользователя отключен JavaScript.
Попробуй это:
Три поля даты.
Один скрыт высотой = 0. Это ваша отправная точка. Я использовал сегодня плюс один, чтобы пользователь мог выбрать сегодня в поле "Дата запроса".
<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" >
AFAIK, нет простого способа помешать клиенту выбрать день в прошлом. Однако в некоторых наших формах у нас есть такие поля, которые мы сверяем с текущей датой на стороне сервера. Просто не забудьте сгенерировать дату без времени для сравнения, или вы получите [сегодняшняя дата] <сейчас ().
Я только что добавил 100 лет к атрибуту endrange для компонента cfcalendar, думая, что никто не будет сидеть и пробираться так далеко, чтобы пройти проверку:
<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#">
Саймон.
В результате экспериментов я смог настроить поддерживающие файлы javascript для ограничения выбираемых дат. Однако опция jQuery звучит также хорошо.
Вы не можете ограничить поле даты датами, которые можно выбрать. У 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" >
Сначала я подумал <cfcalendar>
поможет, но кажется, что startrage
а также endrange
для отключенного диапазона.
Я думаю, если вы действительно хотите ограничить диапазон, используйте что-то еще, как http://docs.jquery.com/UI/Datepicker
Вам также следует использовать проверку на стороне сервера, но я считаю, что вы можете использовать атрибут range в cfinput, чтобы ограничить допустимые даты.