Как проверить, пусто ли поле во встроенной схеме в блоке шаблонов Dreamweaver

Я использую SDL Tridion 2011 SP1. Я создаю Dreamweaver TBB для компонента. В моем компоненте некоторые поля пусты. Но в моем компоненте TBB я хочу проверить, пусто ли поле, и я не должен его отображать. Если поле не пустое, я должен отображать и отображать значение. Я сталкиваюсь с проблемой при проверке содержимого подполя во встроенном поле.

В моем компоненте есть одно многозначное поле встроенной схемы с именем «EMBFIELD». Схема EMBFIELD имеет текстовое поле с именем «текст». Я хочу проверить, пусто ли текстовое поле или нет. Если он не пуст, мне нужно перебрать поле, чтобы отобразить значения.

Я должен отображать поле только с помощью «RenderComponentField». Когда я пытался отобразить, он показывает какую-то ошибку, что поле не существует.

Я думал, что это можно сделать с помощью блока If.

 <!-- TemplateBeginIf cond="Component.Fields.EMBFIELD" --> 
     <!-- TemplateBeginRepeat name="Component.Fields.EMBFIELD" -->
           <!-- TemplateBeginIf cond="Component.Fields.EMBFIELD.text" --> 
                 <div>@@RenderComponentField("Component.Fields.EMBFIELD.text",TemplateRepeatIndex)@@</div>
            <!-- TemplateEndIf -->      
     <!-- TemplateEndRepeat -->
 <!-- TemplateEndIf -->

Но это дает ошибку, как

Внутренняя ошибка: Компонент контекста Компонент не имеет поля Component.Fields.conditionalText.text.


person Patan    schedule 14.03.2012    source источник
comment
Если вы выполняете статическую публикацию в Tridion 2011 SP1, вам действительно стоит попробовать Razor Mediator — более мощный и чистый код шаблона. Он даже поставляется с установщиком для CMS. Пример кода Razor Mediator: @if(Component.Fields.IntroField != ){ ‹span›@Component.Fields.IntroField‹/span› }   -  person robrtc    schedule 14.03.2012


Ответы (3)


Вы можете использовать функцию StringLength(object parameter), она вернет 0, если поле пусто или если невозможно определить длину строки параметра. Итак, в целом это должно выглядеть так:

<!-- TemplateBeginIf cond="StringLength(Component.Fields.Field) > 0" -->
 <b>Value is not empty<b>
 <p>@@Component.Fields.Field@@</p>
<!-- TemplateEndIf -->

Это может быть ответом на ваш обновленный вопрос:

<!-- TemplateBeginIf cond="Component.Fields.EMBFIELD.text" --> 
     <!-- TemplateBeginRepeat name="Component.Fields.EMBFIELD" -->
            @@RenderComponentField("EMBFIELD[${TemplateRepeatIndex}].text", 0)@@       
     <!-- TemplateEndRepeat -->
 <!-- TemplateEndIf -->
person Andrey Marchuk    schedule 14.03.2012
comment
@ user978511. На самом деле я использую редактирование сайта. Чтобы включить редактирование сайта, я думаю, нам нужно @@RenderComponentField(aaaa,0), а не @@Field@@. Если вы можете указать, как использовать RenderComponentField для извлечения данных, это поможет. - person Patan; 14.03.2012
comment
@ user978511. Большое спасибо, все работает так хорошо. Было бы приятно, если бы вы могли расширить это до двух встроенных схем. Скажем, у нас есть еще одно встроенное подполе, которое также является встроенным. В этом случае EMBFIELD имеет еще одно поле, такое как embfield2. Можете ли вы сказать, как перебрать. - person Patan; 14.03.2012

Вы должны иметь возможность использовать условные области Dreamweaver для проверки значения перед попыткой его визуализации.

Например:

<!-- TemplateBeginIf cond="Component.Fields.Field" -->
    @@Component.Fields.Field@@
<!-- TemplateEndIf -->
person Dave Houlker    schedule 14.03.2012

Мы получили ту же проблему с той же ошибкой при доступе к полю встроенной схемы, и после тонны назад и вперед с компоновщиком и отладкой dwt поняли, что ошибка связана с тем, что НЕ помещается пробел между последним двойным кавычком и --> в Оператор TemplateBeginIf. : Ошибки, выдаваемые DWT Mediator:

<!-- TemplateBeginIf cond="EMBEDFIELD.internalLink || EMBEDFIELD.externalLink || EMBEDFIELD.label"-->

Ниже не возникает ошибка:

<!-- TemplateBeginIf cond="EMBEDFIELD.internalLink || EMBEDFIELD.externalLink || EMBEDFIELD.label"<PUT_A_SPACE_HERE>-->

Это может быть любой TemplateBeginIf, окружающий оператор RenderComponentField, который выдает ошибку. Надеюсь, это поможет кому-то

person Rohan Gadiya    schedule 28.01.2016