Мне поручено преобразовать дизайн тяжелого, довольно продвинутого HTML-шаблона для сайта в тему Orchard, и я изо всех сил пытаюсь выполнить определенные вещи. Тема построена на бутстрапе и представляет собой современный отзывчивый HTML-шаблон, который можно найти на ThemeForest или что-то в этом роде. На сайте будет несколько типов контента (сотрудники, элементы портфеля, партнеры и т. Д.) И потребуется ряд шаблонов. Типы содержимого будут иметь большое количество полей (более десятка) внутри пользовательских частей контента.Advanced Orchard Theming - Объектная модель против Placement.info?
Основываясь на том, что я прочитал, правильный способ делать тематику в Orchard использует placement.info в сочетании с альтернативами, обертками и т. Д. Это изящно обрабатывает, если компоненты или свойства добавляются/удаляются. Однако этот метод быстро становится подавляющим, так как я должен объявлять имя и порядок каждого поля/части в place.info для каждого типа контента и каждого типа отображения этого типа контента. Каждое поле каждого типа содержимого затем должно быть обернуто в очень специфическом html. Это создает проблему, потому что одна страница может быть разделена на потенциально несколько десятков просмотров, причем теги HTML открываются в одном представлении и закрываются в другом.
Лучшая работа вокруг этого, которую я нашел, заключается в том, чтобы в основном игнорировать файл placement.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.
Последняя мысль заключалась в том, чтобы использовать очень специфические шаблоны для пользовательских типов контента с использованием объектной модели, но при этом обеспечить хороший общий шаблон/файл placement.info, чтобы общий контент Orchard был гибким, но пользовательские типы контента должны оставаться такими, как они ,
Сторона мысли - я предполагаю, что другой вариант заключается в том, чтобы обернуть любой код, который обращается к свойству непосредственно в блок catch try или какой-то помощник обработчика ошибок, но это не похоже на «лучшую практику».
Привет Бертрана, Спасибо за ответ! Эта статья полезна, но можете ли вы подробнее рассказать о том, какое преимущество заключается в том, чтобы вводить часть контента в зону, а не просто обращаться к части или свойствам контента непосредственно из модели? Это потому, что, поскольку вы используете Placement.Info, он не сломается, если кто-то удалит эту часть? Если внутри зоны Orchard использует шаблон Content Part для прямого доступа к свойствам этой части, будет ли он по-прежнему прерываться, если менеджер контента удаляет свойства? Я надеюсь, что эти вопросы имеют смысл, ценят ваше время. –
Вы можете получить доступ к свойствам напрямую, если хотите, статья действительно делает это. В статье подчеркивается, что техника дает вам лучшее из того и другого. –