использовать начальную дату для <cfinput type = "datefield"> в ColdFusion - PullRequest
0 голосов
/ 05 августа 2009

Я использую <cfinput type="datefield">, и мне нужно ограничить даты, которые можно выбрать. Я не могу позволить дату, которая может быть выбрана в прошлом. Любая помощь здесь?

Спасибо! * * 1004

Ответы [ 8 ]

2 голосов
/ 05 августа 2009

Что ж, у вас есть два варианта: проверять его строго на стороне сервера или дополнительно добавлять проверку 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.

1 голос
/ 24 июня 2011

Попробуйте это:

Три поля даты.

Один скрыт высотой = 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" >
0 голосов
/ 25 августа 2014

Нельзя ограничить поле даты датами, которые можно выбрать. 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" >
0 голосов
/ 22 марта 2010

Я только что добавил 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#">

Саймон.

0 голосов
/ 07 августа 2009

В результате экспериментов я смог настроить поддерживающие файлы javascript на ограничить выбираемые даты . Однако опция jQuery также хорошо звучит.

0 голосов
/ 05 августа 2009

Сначала я подумал, что <cfcalendar> поможет, но кажется, что startrage и endrange для отключенного диапазона.

Полагаю, если вы действительно хотите ограничить диапазон, используйте что-то еще, например jQuery UI Datepicker

0 голосов
/ 05 августа 2009

Вы должны также использовать проверку на стороне сервера, но я считаю, что вы можете использовать атрибут "range" в cfinput для ограничения допустимых дат.

0 голосов
/ 05 августа 2009

AFAIK, нет простого способа помешать клиенту выбрать день в прошлом. Однако в некоторых наших формах у нас есть такие поля, которые мы сверяем с текущей датой на стороне сервера. Просто не забудьте сгенерировать дату без времени для сравнения, или вы получите [сегодняшняя дата] <сейчас (). </p>

...