检索在Dreamweaver TBB链接部件的价值 - 并使其SiteEditable(Retrie

2019-06-23 20:15发布

我在支持SDL Tridion 2011 SP1工作Dreamweaver中TBBS。

我不知道的处理在Dreamweaver TBBS组件链接。

我的考虑组件名称为“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。

请它分享你的观点。

谢谢。

Answer 1:

有此话题在两个单独的问题:

  1. 如何从DWT链接组件访问领域?
  2. 如何从一个链接的组件在2009年SiteEdit编辑字段?

这是问题1,我会提供一个单独的答案的问题2回答。

在外表套上在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@@

或者您可以使用努诺的Dreamweaver中获取扩展(DGX)来访问这样的领域,而无需编写一个TBB:

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

唯一的缺点使用DGX是,你需要将每一个外表套上服务器上安装它。 在此之后,的扩展功能堆在你载重吨可用。



Answer 2:

链接组件的允许领域为可编辑的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>

那些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前端的组件外观确实不应该存在于它从外表套上检索页面的XML。

到SiteEdit前端没关系的命令是如何投入到HTML。

最常见的是为人们所称RenderComponentPresentationRenderComponentField ,这标志着相应的部件。 但不幸的是RenderComponentField只能用函数来呈现来自所谓的“背景部件”,它看起来像这样的字段:

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

这意味着,在一个单一的DWT将所有来电RenderComponentField将在同样的背景下部件的工作方式。 所以,你永远不能叫RenderComponentField单一DWT呈现来自两个不同的组件领域。

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

  1. 呼叫RenderComponentPresentation为链接组件
  2. 渲染Start SiteEdit Component Presentation ,并Start SiteEdit Component Field命令自己在DWT

选项1是你可以得到最干净的分离:因为你是从另一个组件呈现的字段,你基本上是渲染另一个组件演示。 如果你的链接字段打出布局到一个单独的DWT,并围绕一个CT,你可以在主DWT使其像这样:

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

沃尔特解释这适合他的外表套上模板的文章 :

由于该Dreamweaver模板的范围仅限于显示当前组件领域,额外的步骤是通过使用RenderComponentPresentation功能必要的。 我们需要与其他Dreamweaver模板的中医URI通过TCM URI的多媒体组件的这一功能,在一起。

虽然它确实导致更多的CT和载重吨,那些载重吨将大量简单,因为你现在可以使用RenderComponentField在他们像往常一样。

选项2真的只是意味着你输出与您载重吨SiteEdit命令HTML注释。 由于命令语言被记录为API的一部分(见上面的链接),很少有机会,它会在2009年SiteEdit的未来版本中改变。

很抱歉的很长的故事,你碰巧在这里引发棘手的用例。 我希望这是有道理的。



Answer 3:

如果使用的是2009年SiteEdit有可能,更多的只是有点难度比将它与主要成分领域。 SiteEdit就封装与JSON标记的内容领域。 有没有理由,如果出版指标正在上演,你无法检测和写出来的JSON自己。

或者将价格已经开发了一些模板构建模块,以帮助其SiteEdit可用这里 。

这些都伴随着导在这里 ,特别是在部分嵌入式组件将是对你有用的。



Answer 4:

您无法读取使用标准Dreamweaver模版从B场。 你需要写一个C#TBB提取链接的组件,并将其放置在包类型的组件。 然后,您可以使用DWT的语法来读取该组件的领域。 例如:@@ linkedComponent.Fields.first @@

Siteedit是在这一个问题,不同的版本使用不同的语法和能力。 恐怕你不能编辑等领域的最新版本...



文章来源: Retrieving values of a linked component in Dreamweaver TBB - and making it SiteEditable