6

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

组分 B 来源是:

<Content xmlns="Some other UUID">
    <first>first field</first>
    <second>second field</second>
</Content>

我想编写一个 DWT TBB,它可以从组件 A 访问链接组件 B 中的字段。

我想使用 RenderComponentField 再现方法。

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

请分享您对此的看法。

谢谢你。

4

4 回答 4

6

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

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

于 2012-04-21T12:18:53.730 回答
5

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

因此,假设您在其中有一个组件:

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

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

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

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

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

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

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

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

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

Walter 在他关于 Tridion 模板的文章中解释了这一点:

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

尽管它确实会导致更多的 CT 和 DWT,但这些 DWT 会简单得多,因为您现在可以RenderComponentField照常使用它们。

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

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

于 2012-04-21T14:28:54.797 回答
2

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

或者,Will Price 开发了一些模板构建块来帮助使用 SiteEdit,可在此处获得。

此处附有指南,特别是有关嵌入式组件的部分将对您有用。

于 2012-04-21T11:47:59.547 回答
-2

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

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

于 2012-04-21T08:20:13.413 回答