【问题标题】:Retrieving values of a linked component in Dreamweaver TBB - and making it SiteEditable在 Dreamweaver TBB 中检索链接组件的值 - 并将其设为 SiteEditable
【发布时间】:2012-05-02 15:50:02
【问题描述】:

我正在开发 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。

请分享您对此的看法。

谢谢。

【问题讨论】:

    标签: dreamweaver tridion


    【解决方案1】:

    SiteEdit 2009 SP2 中引入了允许编辑链接组件的字段。 SiteEdit 前端基于嵌入到从登台服务器返回的 HTML 中的 SiteEdit command language 工作。

    假设你有一个单独的组件:

    <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 cmets 是您的 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 前端组件表示确实不应该出现在它从 Tridion 检索的页面 XML 中。

    对于 SiteEdit 前端,如何将命令放入 HTML 并不重要。

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

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

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

    你有两个选择来解决这个问题:

    1. 为链接的组件调用RenderComponentPresentation
    2. 在 DWT 中自己渲染 Start SiteEdit Component PresentationStart SiteEdit Component Field 命令

    选项 1 是您可以获得的最清晰的分离:因为您正在渲染来自另一个组件的字段,所以您实际上是在渲染另一个组件表示。如果将链接字段的布局拆分为单独的 DWT 并围绕它构建 CT,则可以在主 DWT 中像这样呈现它:

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

    Walter 在他的 article on Tridion templating 中解释了这一点:

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

    虽然它确实会导致更多 CT 和 DWT,但这些 DWT 会简单得多,因为您现在可以像往常一样在其中使用 RenderComponentField

    选项 2 实际上只是意味着您在 DWT 中使用 SiteEdit 命令输出 HTML cmets。由于command language 被记录为 API 的一部分(请参见上面的链接),因此它在 SiteEdit 2009 的未来版本中发生更改的可能性很小。

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

    【讨论】:

    • Frank,您提到“所谓的上下文组件”,是它的定义:_package.GetByType(ContentType.Component); ?换句话说:最顶层的 Component 类型的包项是否称为“上下文组件”? (..因此受到上述行为的影响)
    • “上下文组件”这个名称只是我在这里用来使行为清晰的东西。这不是 SDL 在任何地方编纂的专门表示我在这里使用的术语。
    【解决方案2】:

    这个话题有两个独立的问题:

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

    这是问题 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 中就可以使用大量扩展功能。

    【讨论】:

      【解决方案3】:

      如果您使用的是 SiteEdit 2009,这是可能的,只是比使用主要组件字段要困难一些。 SiteEdit 通过使用 JSON 标记包装内容字段来工作。您没有理由无法检测发布目标是否正在暂存并自己编写此 JSON。

      Will Price 还开发了一些模板构建块来帮助 SiteEdit,这些模板构建块可通过here 获得。

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

      【讨论】:

        【解决方案4】:

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

        Siteedit 在这一点上存在问题,并且不同的版本使用不同的语法和功能。恐怕最新版本的您无法编辑此类字段...

        【讨论】:

        • SiteEdit 2009 SP2(及更高版本)只要您正确标记它们,就可以编辑链接组件的字段。我将在单独的答案中提供一个示例。
        猜你喜欢
        • 2012-05-31
        • 2012-12-15
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多