Получение значений связанного компонента в Dreamweaver TBB и создание его SiteEditable
Я работаю над TBB Dreamweaver в SDL Tridion 2011 SP1.
Я не знаю, как обрабатывать ссылки на компоненты в Dreamweaver TBB.
Предположим, что имя моего компонента - "A", которое имеет ссылку на другой компонент "B".
Компонент Источник выглядит так:
<Content xmlns="Some UUID">
<Name xlink:type="simple" xlink:href="tcm:184-1897"
xmlns:xlink="http://www.w3.org/1999/xlink" xlink:title="B"></Name>
</Content>
Компонент B источник:
<Content xmlns="Some other UUID">
<first>first field</first>
<second>second field</second>
</Content>
Я хочу написать DWT TBB, который может получить доступ к полям в связанном компоненте B из компонента A.
Я хочу использовать метод представления RenderComponentField.
Нужно ли мне добавлять какие-либо расширения, смогу ли я применить SiteEdit к нему.
Пожалуйста, поделитесь своими взглядами на это.
Спасибо.
4 ответа
В этой теме есть два отдельных вопроса:
- Как получить доступ к полям из связанного компонента в DWT?
- Как сделать поля из связанного компонента редактируемыми в SiteEdit 2009?
Это ответ на вопрос 1. Я предоставлю отдельный ответ на вопрос 2.
При обработке выражений в шаблонах DWT по умолчанию в Tridion у вас есть доступ только к полям компонентов, которые находятся в пакете. Поэтому, если вы хотите получить доступ к полям компонента B, вам нужно написать C# TBB, который помещает этот компонент в пакет.
Образец фрагмента C#:
var componentA = (Component) engine.GetObject(package.GetValue("Component.ID"));
var fieldsA = new ItemFields(componentA.Content, componentA.Schema);
var linkField = (ComponentLinkField) fieldsA["Name"];
var componentB = linkField.Value;
var itemB = package.CreateTridionItem(ContentType.Component, componentB);
package.PushItem("ComponentB", itemB);
Если вы поместите это в фрагмент CB TBB и поместите его в ваш CT до DWT, вы можете сделать это в вашем DWT:
@@ComponentB.Fields.first@@
В качестве альтернативы вы можете использовать Dreamweaver Get eXtension (DGX) от Nuno для доступа к таким полям без написания TBB:
@@Get("Fields.Name.first")@@"/>
Единственным недостатком использования DGX является то, что вам нужно будет установить его на каждый сервер Tridion. После этого в ваших DWT будет доступна куча расширенных функций.
Разрешение полей связанного компонента быть редактируемым было введено в SiteEdit 2009 SP2. Внешний интерфейс SiteEdit работает на основе командного языка SiteEdit, который встроен в HTML- код, возвращаемый с промежуточного сервера.
Допустим, у вас есть один компонент:
<div class="cp">
<!-- Start SiteEdit Component Presentation: {"ID" : "cp_1",
"ComponentID" : "tcm:12-549", "ComponentTemplateID" : "tcm:12-568-32",
"ComponentVersion" : 5, "IsQueryBased" : false } -->
<label>Title: </label>
<span>
<!-- Start SiteEdit Component Field: {"ID": "cf_1",
"XPath": "tcm:Content/custom:Content/custom:Title",
"IsMultiValued":false} -->
Tips for getting insurance when you have a pre-existing condition
</span>
</div>
Те Start SiteEdit
в комментариях есть команды, которые ваш HTML дает SiteEdit, и вы можете видеть, как они отмечают представление компонентов и поле заголовка.
Если вы визуализируете поля связанного компонента, вам также необходимо иметь соответствующую команду представления компонента, например:
<div class="cp">
<!-- Start SiteEdit Component Presentation: {"ID" : "cp_1",
"ComponentID": "tcm:12-54", "ComponentTemplateID": "tcm:12-56-32",
"ComponentVersion" : 5, "IsQueryBased" : false } -->
<label>Title: </label>
<span>
<!-- Start SiteEdit Component Field: {"ID": "cf_1",
"XPath": "tcm:Content/custom:Content/custom:Title",
"IsMultiValued":false} -->
Tips for getting insurance when you have a pre-existing condition
</span>
<br />
<div class="cp">
<!-- Start SiteEdit Component Presentation: {"ID" : "cp_2",
"ComponentID": "tcm:12-85", "ComponentTemplateID": "tcm:12-60-32",
"ComponentVersion" : 2, "IsQueryBased" : true } -->
<label>Byline: </label>
<span>
<!-- Start SiteEdit Component Field: {"ID": "cf_2",
"XPath": "tcm:Metadata/custom:Metadata/custom:ByLine",
"IsMultiValued":false} -->
"It's a huge problem, because ..." says one expert.
</span>
<br />
<label>Copyright: </label>
<span>
<!-- Start SiteEdit Component Field: {"ID": "cf_3",
"XPath": "tcm:Metadata/custom:Metadata/custom:Copyright",
"IsMultiValued":false} -->
Getty Images
</span>
</div>
</div>
Там сейчас два Start SiteEdit Component Presentation
команды, одна для внешнего компонента и одна для связанного компонента. Здесь важно отметить, что для свойства IsQueryBased вложенного представления компонентов должно быть установлено значение true. Это говорит внешнему интерфейсу SiteEdit, что представление компонента действительно не должно присутствовать в XML-странице, которую он извлекает из Tridion.
Для внешнего интерфейса SiteEdit не имеет значения, как команды помещаются в HTML.
Чаще всего люди звонят RenderComponentPresentation
а также RenderComponentField
, который отмечает соответствующие части. Но к сожалению RenderComponentField
Функция может использоваться только для визуализации полей из так называемого "компонента контекста", который выглядит следующим образом:
Item component = _package.GetByType(ContentType.Component);
Это означает, что в одном DWT все вызовы RenderComponentField
будет работать на том же компоненте контекста. Так что ты никогда не сможешь позвонить RenderComponentField
в одном DWT для визуализации полей из двух разных компонентов.
У вас есть два варианта решения этой проблемы:
- Вызов
RenderComponentPresentation
для связанного компонента - Визуализировать
Start SiteEdit Component Presentation
а такжеStart SiteEdit Component Field
Команды себя в DWT
Вариант 1 - самое чистое разделение, которое вы можете получить: поскольку вы визуализируете поля из другого Компонента, вы по сути визуализируете другое представление Компонента. Если вы разбили макет для связанных полей на отдельный DWT и построили вокруг него CT, вы можете отобразить его следующим образом в вашем основном DWT:
@@RenderComponentPresentation(Component.Fields.Name, "tcm:1-2-32")@@
Уолтер объяснил это лучше всего в своей статье о шаблонах Tridion:
Поскольку область действия этого шаблона Dreamweaver ограничена отображением полей текущего компонента, необходим дополнительный шаг с использованием функции RenderComponentPresentation. Мы должны передать URI TCM мультимедийного компонента этой функции вместе с URI TCM другого шаблона Dreamweaver.
Хотя это приводит к большему количеству CT и DWT, эти DWT будут намного проще, так как теперь вы можете использовать RenderComponentField
в них как обычно.
Вариант 2 действительно означает, что вы выводите комментарии HTML с помощью команд SiteEdit в своем DWT. Поскольку командный язык задокументирован как часть API (см. Ссылку выше), маловероятно, что он изменится в будущих версиях SiteEdit 2009.
Извините за длинную историю, вы случайно вызвали хитрый вариант использования. Я надеюсь, что это имеет смысл.
Если вы используете SiteEdit 2009, это возможно, немного сложнее, чем с основными полями компонента. SiteEdit работает, оборачивая поля содержимого разметкой JSON. Нет причины, по которой вы не можете определить, находится ли цель публикации, и написать этот JSON самостоятельно.
В качестве альтернативы Уилл Прайс разработал несколько шаблонных строительных блоков для помощи с SiteEdit, которые доступны здесь.
Это сопровождается руководством, в частности, раздел о встроенных компонентах будет вам полезен.
Вы не можете прочитать поля из B, используя стандартные шаблоны Dreamweaver. Вам нужно написать C# TBB, чтобы извлечь связанный компонент и поместить его в пакет как компонент типа. Затем вы можете использовать синтаксис DWT для чтения полей из этого компонента. Например: @@ connectedComponent.Fields.first @@
Siteedit проблематичен в этой версии, и разные версии используют разные синтаксисы и возможности. Боюсь, с последней версией вы не можете редактировать такие поля...