Razor: извлечение переменной из шаблона компонента по шаблону страницы
Привет всем, я работал над набором шаблонов Razor, которые либо редактируются на сайте с помощью Experience Manager, и в то же время полностью адаптированы к нескольким экранам с помощью загрузчика Twitter. В результате мне нужно динамически манипулировать выводом DOM, основываясь на том, что редактор Experience Manager добавляет или удаляет, но все же поддерживает адаптивный дизайн. Часть этой конструкции придерживается правил, которые диктует твиттер.
Начальная загрузка Twitter обеспечивает превосходный адаптивный дизайн, вводя динамически рассчитанную ширину div с использованием классов. <div class="span12>
использует всю ширину обертки, например. "Span6" эффективно использует половину с определенным запасом, чтобы учесть еще один div с "span6". Однако это работает, только если предыдущий класс называется <div class="row-fluid">
и до тех пор, пока промежуток<numbers>
на самом деле в сумме ровно 12. Проблема возникает, когда мне нужно закрыть <div class="row-fluid">
когда это число действительно достигнуто.
Чтобы уточнить: он должен выводить, как это
<div class="row-fluid">
<div class="span6">..code</div>
<div class="span4">..code</div>
<div class="span2">..code</div>
</div>
<div class="span[#]">
отображаются с шаблоном компонента, чтобы можно было использовать несколько компонентов в пределах <div class="row-fluid>
, который отображает шаблон страницы.
Тем не менее, на уровне шаблонов компонентов я не могу получить фактическое количество компонентов этого шаблона, реально существующих на самой странице. Я рассчитываю ширину используемого компонента на основе опции схемы самого компонента. Я использую следующий код шаблона компонента, чтобы сделать его правильно:
@{
var spanClass = String.Empty;
if (Fields.HasField("component_width") && Fields.component_width != null) {
if (Fields.component_width.ToLower() == "full") {
spanClass = "span12";
} else if (Fields.component_width.ToLower() == "half") {
spanClass = "span6";
} else if (Fields.component_width == "40%") {
spanClass = "span5";
} else if (Fields.component_width == "35%") {
spanClass = "span4";
} else if (Fields.component_width == "25%") {
spanClass = "span3";
}
}
}
<div class="@spanClass">...code
Чтобы перейти к моему вопросу: мне нужно иметь возможность закрыть <row-fluid>
Div, если число 12 было достигнуто. Поэтому, если выбран один компонент с параметрами "Полная" (ширина), должен появиться следующий выходной код:
<div class="row-fluid">
<div class="span12">..code</div>
</div>
Если на странице есть два компонента с опцией "половина", это должно позволить
<div class="row-fluid">
<div class="span6">..code</div>
<div class="span6">..code</div>
</div>
обратите внимание на заключительный div на конце. Есть ли какой-то способ, которым я могу достичь переменной, которую я создал в шаблоне компонента var spanClass = String.Empty;
из шаблона страницы? Что-то вроде:
@foreach (var cp in GetComponentPresentationsByTemplate("XM_Generic Content")) {
@if (cp.Component.spanClass == "span6") {
<div class="row-fluid">
@cp.RenderComponentPresentation()
@if (cp.Index == 1) {
</div>
}
}
}
Я все еще знакомлюсь с шаблонами Razor, практичностью адаптивного дизайна и, конечно же, Stackru. Скорее всего, я что-то упустил, допустил глупые ошибки в своем коде или просто задал глупый вопрос. Во что бы то ни стало, дайте мне знать.
3 ответа
Пакет не распределяется между средами выполнения шаблонов, поэтому это нормальное поведение (невозможность увидеть переменные, установленные в одном шаблоне, из другого экземпляра).
Есть способы обойти это, но вы должны учитывать, что, возможно, есть веская причина, по которой Tridion решил изолировать выполнение шаблона.
Смотрите здесь для одного из способов обойти это.
Стандартные методы, использующие словарь ContextVariables, не позволяют вам устанавливать что-либо в CT и получать к нему доступ из PT. Фактически каждый раз при визуализации компонента контекст рендеринга получает свежую копию переменных из контекста рендеринга страницы. Писать им обратно, поэтому не эффективно. Есть методика, которая обходит это, которая подробно описана на практике тридионов. Как уже отмечалось, использование таких методов не должно быть вашим первым вариантом, но иногда вам необходимо.
В настоящее время, кажется, пользователь определяет положение ширины в поле компонента. Я думаю, это довольно типично, но если вы создадите 5 Component Template, который будет вызывать тот же Razor TBB, а также определите схему параметров в компоненте Template, где можно задать ширину компонента, то впоследствии вы можете легко вызвать эти разные CT в шаблон страницы.