p:calendar를 사용하여 시작 날짜와 종료 날짜를 상호 제한(검증 없음)
사용자에게 각각 시작일과 종료일을 나타내는 2개의 p:calendar 컴포넌트를 제시해야 합니다.두 날짜 모두 날짜, 시간 및 분을 가집니다.는 완벽한 Prime Faces를 있습니다.mindate
,maxdate
,minHour
,maxHour
,minMinute
, , , , 입니다.minMinute
사용할 수 있습니다.
현재 요건은 다음과 같습니다.
시작 날짜/시간을 종료 날짜/시간 이상으로 설정할 수 없습니다.종료 날짜/시간을 종료 날짜/시간 이하로 설정할 수 없습니다.
다음 방정식이 참이어야 합니다.
begin datetime < end datetime
이제 다음 JSF를 사용해 보겠습니다.
<p:calendar id="begin-date"
value="#{debugManager.selectedBeginDate}"
mindate="#{debugManager.minBeginDate}"
maxdate="#{debugManager.maxBeginDate}"
maxHour="#{debugManager.maxBeginHour}"
maxMinute="#{debugManager.maxBeginMinute}"
pattern="yyyy-MM-dd HH:mm"
showButtonPanel="true"
readonlyInput="true"
navigator="true"
showOn="button"
required="true">
<p:ajax event="dateSelect" update="end-date" />
</p:calendar>
<p:calendar id="end-date"
value="#{debugManager.selectedEndDate}"
mindate="#{debugManager.minEndDate}"
minHour="#{debugManager.minEndHour}"
minMinute="#{debugManager.minEndMinute}"
pattern="yyyy-MM-dd HH:mm"
showButtonPanel="true"
readonlyInput="true"
navigator="true"
showOn="button">
<p:ajax event="dateSelect" update="begin-date" />
</p:calendar>
다음은 min/max 방법의 예시입니다(종료일 기준).
public Date getMinEndDate()
{
return this.getSelectedBeginDate();
}
보시는 바와 같이 최소 종료일은 현재 AJAX가 선택한 시작 날짜입니다.종료일을 올바르게 설정하면 시작일을 종료일보다 늦게 설정할 수 없습니다.
문제는 시간을 방정식에 포함시킬 때 시작된다...
p:calendar 인터페이스에는 다른 메서드가 있기 때문에 bean은 다음 로직을 제공해야 합니다.
public int getMinEndHour()
{
Date selectedBeginDate = this.getSelectedBeginDate();
Date selectedEndDate = this.getSelectedEndDate();
if ( selectedBeginDate != null && DateUtil.isSameDay( selectedBeginDate, selectedEndDate ) )
{
return DateUtil.getHourOf( selectedBeginDate );
}
return ComplianceConstants.DEFAULT_COMPLIANCE_CASE_MIN_END_HOUR;
}
되어 있고 종료시간」)을 합니다.minHour
이치노
조작:
Set the begin datetime to 2013-04-20 12:34 (legit)
Set the end datetime to 2013-04-22 00:00 (legit)
이제 종료 날짜의 시간은 00:00이며 종료 시간이 최소한 12:35로 조정되는 한 2013-04-20 달력 날짜를 선택할 수 있습니다.
그러나 p:calendar 컴포넌트는 이 사실을 알 수 없습니다.
sets the end datetime to 2013-04-20 00:00 (legit, but false)
...
여기서 문제는 사용자가 일정표에서 특정 새로운 종료일을 눌렀을 때 mindate/maxdate Atribute에 의해 시작일과 같은 값을 치도록 사용자를 제한할 수 없다는 것입니다.종료일이 같은 시작일보다 이전인 경우(잘못됨) 어쩔 수 없습니다.
이제 팔로업 문제는 사용자가 달력을 닫고 제출 버튼을 누르면 잘못된 데이터를 DB에 삽입할 수 있다는 것입니다.물론 검증자를 실행할 수도 있지만 검증자를 사용하지 않고 어떻게든 이를 달성해야 합니다.
에 하려고 은 '하다', '접촉하다', '접촉하다'였습니다.setSelectedBeginDate( Date selectedBeginDate )
★★★★★★★★★★★★★★★★★」setSelectedEndDate( Date selectedEndDate )
조정 java.util.Date
같은 날짜일 경우 시간 부분을 지정합니다.다음과 같이 합니다.
public void adjustSelectedEndDate()
{
if ( this.selectedEndDate != null )
{
this.log.infov( "adjustSelectedEndDate: b-hour = {0}, e-hour = {1}", DateUtil.getHourOf( this.selectedBeginDate ), DateUtil.getHourOf( this.selectedEndDate ) );
if ( DateUtil.isSameDay( this.selectedBeginDate, this.selectedEndDate ) &&
( DateUtil.getHourOf( this.selectedEndDate ) < DateUtil.getHourOf( this.selectedBeginDate ) ) ||
DateUtil.getHourOf( this.selectedEndDate ) == DateUtil.getHourOf( this.selectedBeginDate ) && DateUtil.getMinuteOf( this.selectedEndDate ) <= DateUtil.getMinuteOf( this.selectedBeginDate ) )
{
this.log.info( "Adjusting selected end date!" );
this.selectedEndDate = DateUtil.addOneMinuteTo( DateUtil.copyTime( this.selectedBeginDate, this.selectedEndDate ) );
}
}
}
해서 this this음음음음음음음음 、 this 、 this 、 this 、 this 、 this this 。@this
update
의 p:calendar
getter)가getSelectedBeginDate()
★★★★★★★★★★★★★★★★★」getSelectedEndDate
+ 업데이트 중에 최소/최대 제한)이 호출됩니다.
의 @this
그러나 업데이트 시 p:components를 혼동하여 시간 슬라이더를 한 번만 슬라이더로 만듭니다.이후의 슬라이더 이벤트는 단순히 무시되며 파손된 상태로 동작합니다.
질문
- 이 문제를 해결하기 위해 일반적으로 어떻게 접근합니까?
p:remoteCommand
우가원 원하 을을 ?? ???
옵션 Q:
- PrimeFaces p:calendar가 단일 minDateTime과 maxDateTime을 제공하도록 구현되지 않은 이유는 무엇입니까?
내가 말한 이 시나리오는 이미 해결되었을 거야.이 문제를 해결하기 위한 접근법(또는 일부 해결책도 공유)에 대해 설명해 주시면 감사하겠습니다.
서문:
저는 JSF와 일하지 않지만, 몇 가지 이유로 원하는 곳으로 돌아갈 수 있습니다.
a) 표준 캘린더에서 dateTime의 날짜 부분만 사용할 경우 다음 사용을 고려하십시오.
someCalendar.set(Calendar.MILLISECOND, 0)
b) 많은 상황에서 정확성, 성능 및 사용 편의성을 위해 표준 라이브러리보다 joda-time(여기, 여기 및 기타 많은 장소) 사용을 권장하는 것으로 보이므로 joda-time 사용을 고려하십시오.
가 각 콜에서 포스트백만 , 각가 얼굴 를 들면 bean 스코프)를 것을 확인합니다.FacesContext facesContext = FacesContext.getCurrentInstance();
)
d)mindate
그리고 이런 것들은 당신이 기대했던 것처럼 작동하지 않을 것이다. 그리고 나는 자동적인 동작이 그렇게 쉽게 중단될 것이라고 기대하지 않는다.
이러한 옵션을 사용할 수 없는 경우, 고객이 가지고 있는 모든 것을 직접 수행해야 하는 경우:
Philisophical / UX: 내가 가장 먼저 하고 싶은 일은 두 날짜의 배치나 관점에 대한 기대를 없애는 것이다.시간 표시줄에서 방향을 표시하거나 예상하는 벡터로 처리하지 마십시오.
는 「」, 「」입니다.
start
★★★★★★★★★★★★★★★★★」from
그 날짜end
★★★★★★★★★★★★★★★★★」to
날짜? 아니요, 과거 데이터의 쿼리 또는 아직 발생하지 않았거나 이미 발생한 이벤트에 대한 수정 적용에서 볼 수 있습니다.이 함축된 내용은 사용자가 '뒤로' 돌아가는지 '뒤로' 돌아가는지, 아니면 '뒤로' 돌아가는지에 대해 혼동하기 쉽습니다(또한 자신을 혼동할 수 있습니다.에, 나는 그 이 있는 한 할 것이다.
a pair of dates
또는range
또는period
간격을 선언하고 결과적으로 선택된 값에 따라 타임라인에서 상대적인 위치를 추론합니다.이렇게 하면 날짜가 결코 동일하지 않고 왼쪽이 항상 왼쪽, 오른쪽이 항상 오른쪽이라는 각각의 고유한 요건을 충족할 수 있습니다.
우리는 '시작'이나 '시작'이 무엇을 의미하는지 유추할 수는 없지만, 연대기적 연대표의 오른쪽, 왼쪽, 그리고 중간이라는 의미와 상대적인 관계를 유추할 수 있다.주의: 계산 또는 비교를 수행하기 전에 항상 날짜를 UTC로 해결하십시오.
long oneDateValue = oneDate.toUtc().toMilliseconds();
long anotherDateValue = anotherDate.toUtc().toMilliseconds();
long right = max (oneDateValue, anotherDateValue);
long left = min (oneDateValue, anotherDateValue);
정밀도 평가:어떤 언어로든 날짜 범위를 다룰 때 두 번째로 살펴봐야 할 것은 부동 소수점 숫자를 다루는 방법과 유사합니다.비교를 위해 동일성을 비교하지 말고 델타를 "허용 가능한 오차 수준"과 비교하십시오.즉, 어플리케이션은 실제로 어느 정도의 정밀도만을 고려하므로 그 정밀도만을 캡처하여 검토해야 합니다.
const int dateTimeResolutionInMs = 86400000; // milliseconds per day
public bool areEssentiallySame(long left, long right) {
// the difference between right and left is less than our precision
// requires, thus dates are effectively the same
return (right - left < dateTimeResolutionInMs);
}
강제 정밀도:셋째, 해상도 범위 내라도 가치의 차이를 어떻게 해결할 것인가(아웃 어플리케이션에는 처리 능력, 기대 또는 요구 이상의 정밀도가 주어졌습니다).
long diff = value % dateTimeResolutionInMs;
잘라내기:
return value - diff;
가장 가까운 (바이어스 포함):
return value + (diff < dateTimeResolutionInMs/ 2) ? -1 * diff : dateTimeResolutionInMs - diff;
기타: 원하는 해상도 또는 정밀도로 값을 축소하거나 확장하기 위한 다른 많은 전략이 있습니다.
부록:Post-Backs/Ajax 콜에 의해 실행되는 이벤트에 대해 예상되는 값을 포함한 뷰를 반환하는 경우calendar
서문에 있는 노트가 당신에게 아무런 도움이 되지 않았고, 당신의 콩이 제대로 등록되고 인식되고 있는 것을 확실히 알고 있다면, 당신은 그 우려를 새로운 질문으로 분리하는 것이 좋을지도 모릅니다.바람직하지 않은 동작의 원인이 되는 브라우저/브라우저 버전 고유의 문제가 있을 수 있습니다.다른 문제들과 마찬가지로 이미 알려진 문제와 알려지지 않은 문제가 모두 존재합니다.
언급URL : https://stackoverflow.com/questions/16162554/mutually-restricting-begin-and-end-date-times-using-pcalendar-no-validation
'programing' 카테고리의 다른 글
woocommerce 이메일 알림의 get_post_module (0) | 2023.03.27 |
---|---|
경고: 실패한 propType: 잘못된 prop 'component'가 'Route'에 제공됨 (0) | 2023.03.27 |
TypeScript에서 추상 메서드를 선언하는 중 (0) | 2023.03.27 |
스프링 부트에서 기본 활성 프로필 설정 (0) | 2023.03.27 |
Oracle에서 SELECT Count(*) From Somethable을 대체하는 빠른 방법 (0) | 2023.03.27 |