2014-03-05 7 views
0

조건부로 해당 드라이버에서 위젯을 억제하려고합니다. 필자는 기본적으로 충족되면 위젯을 표시해야하고 그렇지 않으면 표시하지 말아야한다는 논리를 가지고 있습니다. 위젯은 현재 페이지 컨텐트 항목에서 속성을로드하고 일부 속성에 따라 표시하거나 숨길 수 있습니다. 나는 모든 로직을 작동 시켰고, 남아있는 유일한 부분은 실제 출력을 억제하는 것이다.과수원 CMS 조건부로 위젯 숨기기 및 표시 영역 숨기기

나는 그러나 이것은 단순히 (그 래퍼) 하늘의 위젯을 출력 드라이버에서 null을 반환 시도했습니다. 보기에서 위젯을 완전히 제거하려면 어떻게해야합니까? 마지막

이 위젯 경우 억제한다 배치되는 영역 조건부 위젯 표시 없음.

오차드에서 이러한 유형의 융통성이 가능합니까? 가급적 내 테마가 아닌 내 사용자 정의 모듈에서 스타일과 기능을 분리하려고합니다.

편집 : 여기

내 상황과 내가 무엇을 달성하려고의 맥락이다. Orchard 내에서이 작업을 수행하는 훨씬 더 깨끗한 방법이 있다고 생각합니다. 내 클라이언트의 카피라이터는 태그 모듈/파트를 사용하여 적합하다고 생각되는 페이지에 태그를 지정합니다. 나는 2 가지 맞춤형 콘텐츠 유형 인 '고객 성공 사례'와 '쿠폰'을 만들었습니다.이 두 가지 유형은 다른 부동산 중 태그 자체로 구성되어 있습니다. [다른 카피라이터 팀에 의해 관리됩니다.]

페이지의 사이드 바는 "추천"위젯과 "제안"위젯을 얻습니다. 이 위젯은 서로 독립적으로 작동하지만 동일하게 작동합니다.

그들은 현재 페이지의 태그를 가져온 다음 일치하는 태그가있는 임의의 [추천 | 제안]을 가져옵니다. 어떤 내부 페이지에서 일어날 수있는 4 가지 경우가 있습니다 : 증언이 표시되고 제안이 숨겨져 있습니다 (증언 태그 일치, 제안 태그하지 않음), 증언이 숨겨지고 제안이 표시됩니다 (증언 및 제공 디스플레이 모두) 마침내 표시되지 않습니다. 첫 번째 3 가지 사용 사례는 훌륭하게 작동합니다. 두 번째 위젯이 없어도 사이드 바 [zone]가 계속 표시되므로 (네 번째 드라이버에서 null을 반환하는 경우) 네 번째로 어려움을 겪고 있습니다.

+0

바로 그 부분이 수행하는 작업입니다. 레이어를 만들고 거기에 위젯을 표시하거나 숨기기위한 규칙을 던집니다. –

+0

논리를 레이어에 포함 할 수 없기 때문에 표시 논리는 현재 앉아있는 페이지의 속성을 기반으로 위젯에 표시됩니다. 이것은 모두 작동합니다. 즉, 위젯이 로직에 대해 올바르게 실행되고 있고 충족되지 않으면 제대로 숨어 있습니다 (드라이버에서 null이 반환 됨). 레이어에 여러 개의 "조건부"위젯이있을 수 있습니다. 위젯이 1 개이면 계속 표시되어야합니다. 표시/활성화되었지만 모든 위젯 자식이 표시되지 않으면 접기 자세한 내용은 – MikeAtCodeSmart

+0

논리를 레이어 규칙에 포함 할 수없는 이유는 무엇입니까? 이것은 정확히 정확히 어떤 레이어가 디자인 되었습니까? –

답변

2

위젯에 대한 약간의 컨텍스트 : 위젯은 사이트의 일부 또는 모든 페이지에서 볼 수 있으며 페이지의 기본 컨텐트 항목과 직접 관련이없는 정보를 제공합니다 (if 그런 일이있다).

결과적으로 설명하는 내용은 실제로 컨텐츠 항목의 일부이기 때문에 위젯으로 구현하면 안됩니다. 대신 파트 또는 필드를 구현해야합니다. 그런 다음 최상위 영역을 지정하여 게재 위치를 사용하여이 필드 부분의 모양을 간단히 배치 할 수 있습니다. <place the_shape_name="/the_zone_where_you_want_it:1"/>

+0

헤이 버트 랜드, 나는 아직도 많은 것을 알았다. :). 이것을 구현하는 올바른 방법을 조금 더 자세히 설명해 주시겠습니까? 어떻게 부품을 만드는 것이 좋을까요? 나는 견본을 만들 수 있도록 견본 유형뿐만 아니라 인용문 (본문, 저자 [텍스트]를 포함하는 평가 부분)을 만들었습니다. 나는 페이지 유형에 증명서 부분을 추가 할 수없고, 몇몇 페이지는 증명서의 동일한 "물통"을 공유하고 (동일한 꼬리표가있다) 증명서는 필수적으로 페이지에 결합되지 않는다. 위젯은 회원 평가 및 페이지를 연결하는 데 사용되는 것으로, 추천은 다른 곳에서 사용될 수 있습니다. – MikeAtCodeSmart

+0

회원 평가 항목을 페이지 유형에 추가 할 수없는 이유는 무엇입니까? –

+0

회원 평가가 페이지에 결합되어 있지 않기 때문입니다. 이렇게하면 콘텐츠 관리자가 서로 다른 페이지에서 중복 된 추천을 많이 만들지 않을까요?따라서 5 페이지가있는 사이트의 "섹션"에 대해 10 개의 풀을 1 개의 무작위로 선택해야합니다 (예 : 10). 이렇게하면 50 개의 추천을 생성하고 10 개의 중복 된 세트를 5 개 만듭니다. Y 회원 평가의 풀과 X 페이지의 다른 섹션. – MikeAtCodeSmart

0

불행히도 나는 공격적인 마감 기한에 맞춰 프로젝트를 진행할 수 있도록 약간의 해킹을해야했지만, 더 나은 방법 및/또는 해결책이 있다면 나는 기회와 기회를 얻는다.

것은 내 테마 내에서 Widget.Wrapper.cshtml 파일을 덮어, 그것을 얻합니다. 거기에 Display (Model.Child) 호출에 변수를 할당하고 결과가 빈 문자열이면 단순히 반환합니다. 빈 위젯 래핑 태그가 제거됩니다. (나는 개인적으로 오차드 기본적으로이 방식으로 작동한다고 생각) :

var child = Display(Model.Child); 

// -- NOTE: shape tracing breaks this logic! 
if (string.IsNullOrWhiteSpace(child.ToString())) { 
    return; 
} 

그런 다음 단순히 @(child)

에 머리글과 바닥 글 사이의 @Display(Model.Child) 교체 그때 내 Layout.cshtml 파일에 다음과 같은 방법을 추가했습니다. 이 빈 영역 태그이며, 반환 경우 수표 변수에 디스플레이 호출을 할당

Func<dynamic, IHtmlString> CollapsableZone = x => 
{ 
    var display = Display(x); 
    string zoneName = x.ZoneName; 
    if (string.Equals(display.ToString(), string.Format("<div class=\"zone zone-{0}\"></div>", zoneName.HtmlClassify()), StringComparison.CurrentCultureIgnoreCase)) 
    { 
     return new HtmlString(string.Empty); 
    } 
    return display; 
}; 

간단한 함수. 그런 다음 위의 함수 값에 할당 된 각 영역에 대한 변수를 만듭니다. @if (Model.ZoneName != null)을 모두 @if (!string.IsNullOrWhiteSpace(zoneVariable))으로 바꾸고 @Zone(Model.ZoneName)의 전화를 @(zoneVariable)으로 바꿉니다.

이것은 당분간 작동합니다. 그것은 상당히 해킹과 취성 솔루션이지만 다른 것들로 이동해야했습니다.