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 。@thisupdate 의 p:calendargetter)가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 |