Продвинутый Тематический сад - Объектная модель против Placement.info?
Мне было поручено преобразовать сложный, довольно продвинутый HTML-шаблон для сайта в тему Orchard, и я изо всех сил пытаюсь найти лучший способ добиться определенных целей. Тема основана на начальной загрузке и представляет собой современный адаптивный HTML-шаблон, который вы можете найти на ThemeForest или в другом месте. На сайте будет несколько типов контента (сотрудники, элементы портфолио, партнеры и т. Д.), И для него потребуется несколько шаблонов. Типы контента будут иметь большое количество полей (более десятка) внутри пользовательских частей контента.
Исходя из того, что я прочитал, правильный способ создания тем в Orchard - это использование place.info в сочетании с альтернативами, обертками и т. Д. Это изящно обрабатывает добавление / удаление частей или свойств. Тем не менее, эта техника быстро становится подавляющей, так как я должен объявить имя и порядок каждого поля / части в place.info для каждого типа контента и каждого типа отображения этого типа контента. Каждое поле каждого типа контента затем должно быть заключено в очень специфический HTML. Это создает проблему, поскольку одну страницу можно разделить на потенциально пару десятков просмотров, при этом HTML-теги открываются в одном представлении и закрываются в другом.
Лучшее решение этой проблемы, которое я нашел, заключается в том, чтобы в основном игнорировать файл place.info и создавать шаблоны просто путем обхода объектной модели. Так что, в основном, для страницы портфолио я бы скопировал имеющийся шаблон HTML, а затем заменил текстовые значения значениями из модели. Это может выглядеть примерно так:
<li class="@Display(Model.ContentItem.PortfolioPart.PortfolioCore.Value.ToLower())">
<a href="@Url.ItemDisplayUrl(contentItem)" >
@foreach (var media in Model.ContentItem.PortfolioPart.PortfolioImage.MediaParts)
{
<img src="@Display(media.MediaUrl)" />
}
<span class="type">@Display(Model.ContentItem.PortfolioPart.PortfolioCoreArea.Value)</span>
<span class="portfolio-item-content">
<span class="header">@Display(Model.ContentItem.TitlePart.Title)</span>
<span class="body">
<p>
@Display(Model.ContentItem.PortfolioPart.PortfolioTagline.Value)
</p>
</span>
</span>
</a>
</li>
Преимущество этого метода заключается в том, что я могу применить все значения в нескольких представлениях, и он более читабелен. Очевидно, что проблема в том, что, если какие-либо свойства или части удалены, шаблон ломается.
Есть ли способ в Орчард, чтобы получить лучшее из обоих миров? У меня не может быть обертки или шаблона для каждого поля - к концу это может привести к сотням полей. Мне также может понадобиться отображать типы контента в нескольких местах с разными представлениями - тогда для каждого поля потребуется целый новый набор оболочек или альтернатив для каждой проекции.
Пожалуйста, дайте мне знать, если я что-то упустил или есть лучший способ сделать это, кроме ручного перехода к нужным мне свойствам. Мне нужен способ, чтобы можно было легко подключать свойства в очень специфический HTML.
Моя последняя мысль заключалась в том, чтобы использовать очень специфические шаблоны для пользовательских типов контента с использованием объектной модели, но при этом предоставить хороший общий файл templates /place.info, чтобы общий контент Orchard был гибким, но пользовательские типы контента должны оставаться такими, как есть.
Стороннее мнение - я думаю, что другой вариант заключался бы в том, чтобы обернуть любой код, который обращается к свойству непосредственно в блоке try catch или в каком-то виде помощника по обработке ошибок, но это не похоже на "лучшую практику".
1 ответ
Я думаю, что методы в этой статье - то, что вы ищете: http://weblogs.asp.net/bleroy/archive/2013/02/13/easy-content-templates-for-orchard-take-2.aspx