在Dreamweaver TBB中检索链接组件的值 - 并使其成为SiteEditable

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.

请分享您的观点.

谢谢.

Fra*_*len 6

本主题中有两个单独的问题:

  1. 如何从DWT中的链接组件访问字段?
  2. 如何在SiteEdit 2009中编辑链接组件中的字段?

这是问题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中提供了一堆扩展功能.


Fra*_*len 5

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中调用来渲染来自两个不同组件的字段.

您有两种方法可以解决此问题:

  1. 调用RenderComponentPresentation链接的组件
  2. 在DWT中自己渲染Start SiteEdit Component PresentationStart 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中它几乎没有变化.

很抱歉,你碰巧在这里触发了一个棘手的用例.我希望这是有道理的.