2013-12-13 2 views
0

Я пытаюсь добавить класс css, если я нахожусь в определенном слое.Orchard CMS: условный класс CSS на основе уровня

Так 2 вопроса:

  1. Можно ли определить текущий слой в целях Razor. Что-то вроде:

    если (currentLayer == «TheHomepage») {...}

  2. ли правильный способ приблизиться к HTML обусловливающие слоя, или есть лучший способ сделать это в сад?

+0

Ответы верны, но, похоже, у вас есть несколько недоразумений в отношении слоев и виджетов. Для любого заданного запроса может быть любое количество активных слоев, а не только один, поэтому «текущий слой» на самом деле не существует, за исключением, может быть, внутри кода вида для виджета, поскольку каждый виджет принадлежит только одному слою. Слои по существу * являются * условными: они похожи на большую структуру вокруг виджетов, поэтому, если вы хотите делать вещи на основе того, активен ли слой, просто создайте виджет, который делает это, и вставьте его в этот слой (который в значительной степени ответ Марко) –

ответ

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}, а затем добавить его в слой.

Следуйте эту инструкцию, чтобы создать новый виджет с помощью кода бритвы: Creating simple custom Orchard widgets, имя нового виджета CssIncluder

Затем добавить эту точку зрения к вашей теме, вы можете использовать Shape трассировки инструмента, если вам нравится:

Widget-CssIncluder.cshtml:

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

Наконец добавить виджет на слой вашего выбора. Обязательно снимите опцию заголовка, чтобы получить чистый код.

0

Основываясь на ответе Катсуюки, я создал метод расширения для WorkContext для преобразования всех активных слоев в классы css.

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; 
     } 
    } 
} 

Затем, добавив его в Model.Classes в Layout.cshtml моей теме, я могу теперь стиль на основе активных слоев.

foreach(string className in WorkContext.GetLayerCssClasses()) 
{ 
    Model.Classes.Add(className); 
} 
Смежные вопросы