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

时间:2012-04-21 06:13:08

标签: dreamweaver tridion

我正在使用SDL Tridion 2011 SP1中的Dreamweaver TBB。

我不知道在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,它可以从组件A访问链接组件B中的字段。

我想使用RenderComponentField再现方法。

我是否需要添加任何扩展名,我是否可以在其上应用SiteEdit。

请分享您对此的看法。

谢谢。

4 个答案:

答案 0 :(得分:6)

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

  1. 如何从DWT中的链接组件访问字段?
  2. 如何在SiteEdit 2009中编辑链接组件中的字段?
  3. 这是问题1的答案。我将为问题2提供单独的答案。

    在Tridion对DWT模板中表达式的默认处理中,您只能访问包中的组件字段。因此,如果要访问组件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);
    

    如果你将它放在C#片段TBB中并在DWT之前将其放入CT中,你可以在DWT中执行此操作:

    @@ComponentB.Fields.first@@
    

    或者你可以使用Nuno的Dreamweaver Get eXtension (DGX)访问这些字段而无需编写TBB:

    @@Get("Fields.Name.first")@@"/>
    

    使用DGX的唯一缺点是您需要在每个Tridion服务器上安装它。之后,您的DWT中可以使用一堆扩展功能。

答案 1 :(得分:5)

SiteEdit 2009 SP2中引入了允许链接组件的字段可编辑的功能。 SiteEdit前端基于SiteEdit command language工作,该article on Tridion templating嵌入到从登台服务器返回的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命令,一个用于外部组件,另一个用于链接组件。这里要注意的一件重要事情是嵌套的Component Presentation的IsQueryBased属性必须设置为true。这告诉SiteEdit前端组件表示确实不应出现在它从Tridion中检索的页面XML中。

对于SiteEdit前端,命令如何放入HTML无关紧要。

最常见的是人们拨打RenderComponentPresentationRenderComponentField,这标志着相应的部分。但不幸的是,RenderComponentField函数只能用于从所谓的“上下文组件”中呈现字段,它看起来像这样:

Item component = _package.GetByType(ContentType.Component);

这意味着在单个DWT中,对RenderComponentField的所有调用都将在同一个上下文组件上工作。因此,您永远不能在单个DWT中调用RenderComponentField来渲染来自两个不同组件的字段。

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

  1. 为链接的组件
  2. 调用RenderComponentPresentation
  3. 在DWT中自行呈现Start SiteEdit Component PresentationStart SiteEdit Component Field命令
  4. 选项1是您可以获得的最清晰的分离:因为您要从另一个组件渲染字段,所以您实际上是在渲染另一个组件演示文稿。如果将链接字段的布局拆分为单独的DWT并在其周围构建CT,则可以在主DWT中将其渲染为:

    @@RenderComponentPresentation(Component.Fields.Name, "tcm:1-2-32")@@
    

    沃尔特在他的command language中解释了这一点:

      

    由于此Dreamweaver模板的范围仅限于显示当前组件字段,因此使用RenderComponentPresentation函数需要额外的步骤。我们需要将多媒体组件的TCM URI与另一个Dreamweaver模板的TCM URI一起传递给该函数。

    虽然它确实会导致更多的CT和DWT,但这些DWT会更加简单,因为您现在可以照常使用RenderComponentField

    选项2实际上只是意味着您在DWT中使用SiteEdit命令输出HTML注释。由于{{3}}被记录为API的一部分(请参阅上面的链接),因此在SiteEdit 2009的未来版本中它几乎不会发生变化。

    对不起,很长一段时间,你碰巧在这里触发了一个棘手的用例。我希望这是有道理的。

答案 2 :(得分:2)

如果您使用SiteEdit 2009,则可能比使用主要组件字段更困难。 SiteEdit通过使用JSON标记包装内容字段来工作。没有理由为什么你无法检测出版物目标是否正在升级并自己编写这个JSON。

另外Will Price已经开发了一些模板构建模块来帮助SiteEdit提供here

这些内容附有指南here,特别是embedded components部分对您有用。

答案 3 :(得分:-2)

您无法使用标准Dreamweaver模板读取B中的字段。您需要编写一个C#TBB来提取链接的Component,并将其作为Component类型放在包中。然后,您可以使用DWT语法从该组件中读取字段。例如:@@ linkedComponent.Fields.first @@

Siteedit在这个版本上存在问题,不同的版本使用不同的语法和功能。我担心最新版本你无法编辑这些字段......