Pat*_*tan 6 dreamweaver tridion
我正在使用SDL Tridion 2011 SP1中的Dreamweaver TBB.
我不知道在Dreamweaver TBB中处理组件链接.
考虑我的组件名称是"A",它具有到另一个组件"B"的链接.
组件A源看起来像这样:
<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>
Run Code Online (Sandbox Code Playgroud)
组件B来源是:
<Content xmlns="Some other UUID">
<first>first field</first>
<second>second field</second>
</Content>
Run Code Online (Sandbox Code Playgroud)
我想编写一个DWT TBB,它可以从组件A访问链接组件B中的字段.
我想使用RenderComponentField再现方法.
我是否需要添加任何扩展名,我是否可以在其上应用SiteEdit.
请分享您的观点.
谢谢.
本主题中有两个单独的问题:
这是问题1的答案.我将为问题2提供单独的答案.
在Tridion对DWT模板中表达式的默认处理中,您只能访问包中的组件字段.因此,如果要访问组件B的字段,则必须编写一个C#TBB,将该组件推送到Package中.
一个示例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);
Run Code Online (Sandbox Code Playgroud)
如果你将它放在C#片段TBB中并在DWT之前将其放入CT中,你可以在DWT中执行此操作:
@@ComponentB.Fields.first@@
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用Nuno的Dreamweaver Get eXtension(DGX)访问这些字段而无需编写TBB:
@@Get("Fields.Name.first")@@"/>
Run Code Online (Sandbox Code Playgroud)
使用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>
Run Code Online (Sandbox Code Playgroud)
这些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>
Run Code Online (Sandbox Code Playgroud)
现在有两个Start SiteEdit Component Presentation命令,一个用于外部组件,另一个用于链接组件.这里要注意的一件重要事情是嵌套的Component Presentation的IsQueryBased属性必须设置为true.这告诉SiteEdit前端组件表示确实不应该存在于它从Tridion中检索的页面XML中.
对于SiteEdit前端,命令如何放入HTML无关紧要.
最常见的是为人们所称RenderComponentPresentation并且RenderComponentField,这标志着相应的部件.但不幸的是,该RenderComponentField函数只能用于从所谓的"上下文组件"中呈现字段,它看起来像这样:
Item component = _package.GetByType(ContentType.Component);
Run Code Online (Sandbox Code Playgroud)
这意味着在单个DWT中,所有调用都RenderComponentField将在同一个上下文组件上工作.因此,您永远不能RenderComponentField在单个DWT中调用来渲染来自两个不同组件的字段.
您有两种方法可以解决此问题:
RenderComponentPresentation链接的组件Start SiteEdit Component Presentation和Start SiteEdit Component Field命令选项1是您可以获得的最清晰的分离:因为您正在从另一个Component渲染字段,所以您实际上是在渲染另一个Component Presentation.如果将链接字段的布局拆分为单独的DWT并在其周围构建CT,则可以在主DWT中将其渲染为:
@@RenderComponentPresentation(Component.Fields.Name, "tcm:1-2-32")@@
Run Code Online (Sandbox Code Playgroud)
沃尔特在他关于Tridion模板的文章中解释了这一点:
由于此Dreamweaver模板的范围仅限于显示当前组件字段,因此使用RenderComponentPresentation函数需要额外的步骤.我们需要将多媒体组件的TCM URI与另一个Dreamweaver模板的TCM URI一起传递给此函数.
虽然它确实会导致更多的CT和DWT,但是这些DWT将会更加简单,因为您现在可以RenderComponentField照常使用它们.
选项2实际上只是意味着您在DWT中使用SiteEdit命令输出HTML注释.由于命令语言被记录为API的一部分(参见上面的链接),因此在未来版本的SiteEdit 2009中它几乎没有变化.
很抱歉,你碰巧在这里触发了一个棘手的用例.我希望这是有道理的.
| 归档时间: |
|
| 查看次数: |
3011 次 |
| 最近记录: |