2013-12-13 2 views
0

특정 레이어에있는 경우 CSS 클래스를 추가하려고합니다.과수원 CMS : 레이어 기반의 조건부 CSS 클래스

그래서이 질문 :

  1. IT는 면도기보기에 현재 레이어를 식별 할 수 있습니다. 같은 뭔가 :

    (currentLayer == "TheHomepage") {...} 경우

  2. 는 층에 HTML 조건부 접근하는 올바른 방법인가, 또는 과수원에서이 작업을 수행 할 수있는 더 좋은 방법은 무엇입니까? 당신은 레이어가 현재 활성화되어있는 참조해야 할 경우

+0

답변은 정확하지만 레이어와 위젯에 대한 몇 가지 오해가있는 것 같습니다. 각 위젯이 하나의 계층에만 속하기 때문에 위젯에 대한보기 코드를 제외하면 "현재 계층"이 실제로 존재하지 않기 때문에 모든 요청에 ​​대해 활성 계층이 여러 개있을 수 있습니다. 레이어는 본질적으로 위젯을 둘러싼 큰 if 구조와 같습니다. 따라서 레이어가 활성화되어 있는지 여부에 따라 물건을 만들고 싶다면 그냥 물건을 만드는 위젯을 만들고 그 레이어에 붙여야합니다. 꽤 마르코의 대답) –

답변

2

, 당신은 같은 것을 수행 할 수 있습니다

@using Orchard.Widgets.Services 
@{ 
    var widgetsService = WorkContext.Resolve<IWidgetsService>(); 
    var ruleManager = WorkContext.Resolve<IRuleManager>(); 

    var activeLayerNames = new List<string>(); 
    foreach (var layer in widgetsService.GetLayers()) { 
     try { 
      if (ruleManager.Matches(layer.LayerRule)) { 
       activeLayers.Add(layer.Name); 
      } 
     } catch(Exception ex) { 
      // Problem occurred during layer rule evaluation. 
      // Just treat it as though the layer rule did not match. 
     } 
    } 

    if (activeLayerNames.Contains("TheHomePage")) { 
     /* ... Your code here ... */ 
    } 
} 

코드의 대부분은 위의 드라이버 또는 컨트롤러에 더 많은 의미가 있습니다,하지만 당신이있는 경우 뷰 레이어에서만 작동하므로이 방법으로 수행 할 수 있습니다.

0

필요한 @{Style.Include} 문을 포함하는 위젯을 만든 다음 레이어에 추가 할 수 있습니다.

새로운 위젯 사용 면도칼 코드를 만들려면이 지침을 따르십시오 : 만약 당신이 좋아하면

그런 다음 테마에이보기를 추가 새로운 위젯 CssIncluder 이름을 Creating simple custom Orchard widgets을, 당신은 도구를 추적 모양을 사용할 수 있습니다

위젯-CssIncluder.cshtml :

@{ 
    Model.Metadata.Wrappers.Clear(); 
    Style.Include("somestyle.css"); 
} 

가 마지막으로 선택한 레이어에 위젯을 추가 할 수 있습니다. 깨끗한 코드를 얻으려면 제목 렌더링 옵션의 선택을 취소하십시오.

0

가쓰 유키의 답을 바탕으로 모든 활성 레이어를 CSS 클래스로 변환하는 WorkContext 확장 메서드를 만들었습니다.

using Orchard; 
using Orchard.Widgets.Services; 
using System.Collections.Generic; 

namespace KidsMinistryTeam.Theme.Extensions 
{ 
    static public class WorkContextExtensions 
    { 
     static public IList<string> GetLayerCssClasses(this WorkContext workContext) 
     { 
      var widgetsService = workContext.Resolve<IWidgetsService>(); 
      var ruleManager = workContext.Resolve<IRuleManager>(); 

      var classNames = new List<string>(); 
      foreach (var layer in widgetsService.GetLayers()) 
      { 
       try 
       { 
        if (ruleManager.Matches(layer.LayerRule)) 
        { 
         classNames.Add(string.Format("{0}-layer", layer.Name.ToLower())); //add any additional class sanitizing logic here 
        } 
       } 
       catch 
       { 
       } 
      } 

      return classNames; 
     } 
    } 
} 

그런 다음 내 테마의 Layout.cshtml에서 Model.Classes에 추가하여 이제 활성 레이어를 기반으로 스타일을 지정할 수 있습니다.

foreach(string className in WorkContext.GetLayerCssClasses()) 
{ 
    Model.Classes.Add(className); 
}