2017-09-12 1 views
0

현재 구성 요소 조각에 대해 작업 중이며 페이지 개체가 null인지 아닌지를 필터링하기 위해 if 문이 필요합니다. 내 시도 :magnolia freemarker (.ftl)에서 object가 null과 같은지 정의하는 방법

[#assign page = cmsfn.page(component)] 
[#if page IS NULL ] // not working... 
    [@cms.component content=cmsfn.asContentMap(component) editable=false/] 
[/#if] 

이 하나

[#assign page = cmsfn.page(component)] 
[#if !page?has_content ] // not working... 
    [@cms.component content=cmsfn.asContentMap(component) editable=false/] 
[/#if] 

내가 여기 일을하려고하고, 페이지 객체가 null의 경우, 다음 구성 요소 렌딩을,이 페이지 객체가 JRC 아이 노드 , 구성 요소를 렌더링 할 때 이러한 유형의 노드가 엉망이되어 템플릿이 생기므로 필터링을해야하고 p age가 null 인 경우 렌더링됩니다.

제안 사항? 코드 예제를 제공해주십시오. 감사합니다

답변

2

FreeMarker (2.x)의 템플릿 언어에이 ... 기발한 문자가 있으며 null 값이 없습니다. 따라서 변수에 null을 저장할 수 없습니다. foo.bar이 있고 barnull을 반환하는 Java getBar()에 해당하는 경우 템플릿 언어와 관련하여 foo에는 bar이 포함되지 않습니다. 그리고 존재하지 않는 것을 말하는 것은 불법입니다. null/누락 된 처리기 연산자 (foo.bar!'myDefault' 또는 foo.bar??과 같은)에 직접 적용하면 예외가 아닙니다.

따라서 가장 간단한 방법은 [#if cmsfn.page(component)??]...[/#if]과 같은 할당을 피하는 것입니다. 그러나 때로는 수용 할 수없는 경우가 있으므로 page을 두 번째로 내려야합니다. 그런 다음 기본값이 아닌 기본값과 구별 할 수있는 기본값을 사용할 수 있습니다. page 객체의 경우 ?has_contenttrue이라고 가정하면 (ObjectWrapper이 이상하지 않은 경우) {} (빈 해시)과 같은 기본값으로 충분하다고 가정합니다. ?has_content이 false 인 기본값을 제공하므로 exp! 연산자는 약식으로 사용할 수 있습니다.

[#assign page = cmsfn.page(component)!] 
[#if page?has_content] 
    [@cms.component content=cmsfn.asContentMap(component) editable=false/] 
    ... Do something with `page`, otherwise we need not use #assign. 
[#else] 
    ... Don't do anything with `page`, it's that strange default object. 
[/#if]