小编Alv*_*yes的帖子

C#代码片段和程序集TBB之间有什么区别?

我了解C#Code Fragments和.NET Assemblies为模块化模板开发提供了相同的功能.我们在Visual Studio中管理CME和汇编代码中的代码片段,但在Template Builder中使用相同的方法.

在代码方面,我可以创建一个C#代码片段模板构建块(TBB),例如:

var timeStamp = DateTime.Now.ToString("d MMM yyyy");
package.PushItem("timeStamp from fragment", package.CreateHtmlItem(timeStamp));
Run Code Online (Sandbox Code Playgroud)

我还可以通过实现如下的ITemplate,使用相同的代码创建.NET程序集模板构建块.

using System;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Templating.Assembly;

namespace CreateAndBreakTemplates
{
  [TcmTemplateTitle("Add Date to Package")]
  public class AddDateToPackage : ITemplate
  {
    public void Transform(Engine engine, Package package)
    {
      var timeStamp = DateTime.Now.ToString("d MMM yyyy");
      package.PushItem("timeStamp from assembly", 
                       package.CreateHtmlItem(timeStamp));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

文档解释"SDL外表套上插入在其预定的预定类的方法的代码片段." 看起来这个类实现了ITemplate并在下面添加了一些引用(我错过了什么?).

组件安装说明至少提及这些DLL.

  • Tridion.Common.dll
  • Tridion.ContentManager.dll
  • Tridion.ContentManager.Templating.dll
  • Tridion.ContentManager.Publishing.dll

片段和汇编之间的任何其他区别以及如何在两者之间进行选择?

tridion

15
推荐指数
4
解决办法
2911
查看次数

适用于内容交付的DTAP设置

我有这个设置,但它似乎不太正确.

您将如何改进跨多个.NET(客户)开发团队的内容交付(CD)开发?

CMS服务器 - > Presentation Server环境

  • CMS生产 - >实时和预览网站
  • CMS组合测试+验收(内部称为"暂存") - >实时("暂存")
  • CMS开发(DEV) - > Live(开发网站),有时是开发人员本地机器(笔记本电脑)

期望和限制:

  • 多个团队和多个网站
  • 单个 DEV CMS许可证(我认为是典型的客户?)
  • 每个开发人员都有足够的CD许可证
  • 最好是开发人员可以在本地编程和运行更改 - 这是一个合理的期望吗?

工作

我们使用Content Delivery API针对本地计算机和CD DEV的相同代理数据库开发了ASP.NET页面.本地计算机具有CD dll,它们自己的许可证文件,并且可以通过查询和组件表示调用运行/调试.

我们偶尔会发布Dev开发服务器开发者机器,这些机器现在似乎没有,但我认为是在本地机器上获取模式文件.但是,是的,我们不信任开发经纪人数据库.

问题:

本地机器有时需要Tridion发布的页面,但我们无法可靠地发布到本地机器:

  • 为单个"本地计算机"发布目标设置多个发布目标不起作用 - 我们经常将这些"服务器"置于主页.
  • VPN阻止了对异地笔记本电脑的访问(当时使用"传入"文件夹).

为每个开发人员管理发布目标并为每台新笔记本电脑设置CD是一种很好的做法(在练习中,不一定是个好主意),但只是有点单调乏味.

这些后见之明的方法是否适用?

  • 我们自己将物理文件从Dev同步到本地机器?
  • 不要在本地运行演示站点(localhost),而是从Dev构建,上传DLL和测试?
  • 我们只是错过了第四个CMS环境?尽管我们喜欢我们的销售人员,但我们对购买另一个CM许可证并不感兴趣.

你怎么能更好地为组织中的几个开发人员设置.NET CD?

编辑:@DominicCronin指出这只是正确DTAP设置的一个子集.我更新了我的条款,并创建了一个单独的问题,以使用Tridion澄清DTAP.

tridion

8
推荐指数
1
解决办法
617
查看次数

如何找到其他内置DWT字段?

在一个DWT模板积木,我们可以使用一些"免费"的变量,如@@Component.Title@@@@Component.ID@@以及内置DWT功能.

我没有意识到我们也可以使用或获取组件的模式描述.@@Component.Description@@@@Description@@

开箱即Default Dreamweaver Component Design用有一套很好的例子,以及Tridion Cook书的迭代示例SDL Live Content.

我怎么能找到其他允许的内置DWT函数和变量,编程或其他?

换句话说,如果没有@@Description@@首先看到一个例子,我甚至不会想到在DWT中可用(不是我还没有使用它).

编辑(2013年6月8日):我确实找到了有关SDL Live Content的更多信息(需要登录).我们当然可以使用文档中描述的可用Package变量.

tridion

8
推荐指数
1
解决办法
540
查看次数

增加修改属性有什么作用?

%TRIDION_HOME%\web\WebUI\WebRoot\Configuration\System.config我们可以增加修改属性的值,以指示内容管理器强制下载项目.

该设置在PowerTools讨论中提及,但也在SDL Live Content上的Skinning Content Manager Explorer主题中提及.

<server version="6.1.0.55920" modification="7">

更新CME的替代方法包括清除浏览器缓存(Chrome中的CTRL + Shift + Delete)或为每个用户设置缓存设置.

我是否应该将此用于任何CM端更改,例如GUI扩展,架构更改或模板链接架构?或者它仅适用于Content Manager Explorer的某些部分?

换句话说,在架构和模板更改之后,使用户获得最新版本的组件,架构下拉菜单和模板选择的最佳方法是什么?

tridion

8
推荐指数
1
解决办法
354
查看次数

从Anguilla JavaScript调用WCF Web方法时,所有这些参数是什么意思?

我有以下(来自Tridion PowerTools),当一些JavaScript运行时,它从CoreService获取用户名.

JavaScript(安圭拉):

PowerTools.Popups.Example.prototype._onbtnGetUserInfoClicked = function () { 
    var onSuccess = Function.getDelegate(this, this._handleUserInfo);
    var onFailure = null;
    var context = null;
    //call function
    PowerTools.Model.Services.Example.GetUserInfo(onSuccess, onFailure, 
                                                  context, false);
}; 

// Delegate function "onSuccess"
PowerTools.Popups.Example.prototype._handleUserInfo = function (response) {
    var p = this.properties;
    $j("#lblUserInfo").text(response.UserName);
};
Run Code Online (Sandbox Code Playgroud)

CoreService方面:(C#.svc)

[OperationContract, WebGet(ResponseFormat = WebMessageFormat.Json)]
public ExampleData GetUserInfo()
{
    var coreService = Client.GetCoreService();
    _exampleData = new ExampleData()
    {
        UserName = coreService.GetCurrentUser().Title
    };
    return _exampleData;
}
Run Code Online (Sandbox Code Playgroud)

这会发送异步调用:

PowerTools.Model.Services.Example.GetUserInfo(onSuccess, onFailure, context, false)

而这会分配不同的功能来处理响应:

Function.getDelegate(this, this._handleUserInfo)

但onSuccess,onFailure,context和Boolean的来源是PowerTools.Model.Services.Example.GetUserInfo(onSuccess, …

tridion

7
推荐指数
1
解决办法
556
查看次数

安圭拉的_isEnabled和isEnabled有什么区别?

我一直在下面GUI扩展和通知示例使用两种_isEnabledisEnabled,没有下划线.两者似乎都可以扩展或可能替换现有功能.

的IsEnabled

例如,PowerTools基类(似乎不"扩展"现有功能)具有:

PowerTools.BaseCommand.prototype.isEnabled = function(selection, pipeline)
{
    var p = this.properties;

    if (!p.initialized)
    {
        this.initialize();
    }

    if (!this.isToolConfigured())
    {
        return false;
    }

    if (this.isValidSelection)
    {
        return this.isValidSelection(selection, pipeline);
    }

    return true;
};
Run Code Online (Sandbox Code Playgroud)

工具可以使用此基类并声明.isValidSelection,例如:

PowerTools.Commands.CountItems.prototype.isValidSelection = 
                                       function (selection) { ... }
Run Code Online (Sandbox Code Playgroud)

_isEnabled

我看到Anguilla ._isEnabled用于现有功能(在代码中的许多地方的Chrome控制台中).例如,WhereUsed有:

Tridion.Cme.Commands.WhereUsed.prototype._isAvailable =
                      function WhereUsed$_isAvailable(selection) ...
Run Code Online (Sandbox Code Playgroud)

私人功能?

我熟悉前面的下划线是私有变量的命名约定._isEnabled和其他以下划线"私有"开头的函数是什么?如果是的话,那么

  • 我们应该如何扩展(向现有代码添加其他功能)这些功能?
  • 我们应该如何替换(没有现有的代码运行,但我们的运行而不是"覆盖")这些?

我假设相同的方法适用于以下划线开头的其他函数,例如_isAvailable,和_invoke.

tridion tridion-2011

7
推荐指数
1
解决办法
174
查看次数

我们可以在DWT(布局)模板构建块中循环什么?

我知道开箱即用,我们可以使用以下内容在DWT模板构建模块(TBB)中循环或迭代数组.

<!-- TemplateBeginRepeat name="array_name" -->
    <!-- template logic -->
<!-- TemplateEndRepeat -->
Run Code Online (Sandbox Code Playgroud)

文档描述了预定义的包项以及如何使用它们.

总之,我们可以使用:

  • Component 迭代组件或组件演示时引用当前组件
  • ComponentTemplate 迭代组件演示时引用当前组件模板(这将在页面级别)
  • Field 迭代字段和多值字段时引用当前字段.
  • FieldPath获取迭代项的完整路径.TemplateRepeatIndexTridion Practice Cookbook中看到的嵌套循环中使用它很有用.*
  • TemplateRepeatIndex,从零开始的循环计数.

我们可以在Components数组循环中的给定Component中执行嵌套循环,也可以Fields在迭代多值字段时有条件地检查特定的字段名称.

我通过嵌套DWT的语法看到了双重查找(例如@@Image_${TemplateRepeatIndex}@@ ,如Yet Another Tridion Blog所述).

问题(S)

可以肯定的是,这些是复合模板中的项目或数组/集合Package,正确(默认情况下存在或由我们的代码放置)?

我们可以"迭代"一个包中的单独项目吗?

例如,如果我们有单独的组件Package,我们可以用类似的东西"迭代"它们@@Component${TemplateRepeatIndex}@@吗?

  • COMPONENT1
  • COMPONENT2
  • Component3

我看到我可以在循环中引用这样的项目,但是我看到的所有内容都表明以下内容是不可能的:

<!-- TemplateBeginRepeat name="@@Component${TemplateRepeatIndex}@@" -->
    <!-- do something with @@Component${TemplateRepeatIndex}@@ -->
<!-- TemplateEndRepeat -->
Run Code Online (Sandbox Code Playgroud)

tridion

7
推荐指数
1
解决办法
1184
查看次数

我应该如何使用关键字元数据?

除了名称,键,值以及与其他关键字的关系之外,关键字本身也可以包含元数据.这允许作者通过选择元数据模式添加其他信息,然后添加任何内容:

  • 文本
  • 选择(带选项或类别的文本)
  • 链接
  • 等等

SDL Tridion关键字元数据

SDL Live Content描述了如何检索关键字属性.给定一个关键字,myKeyword我们可以得到myKeyword.KeywordMeta.NameValues名称 - 值对(字典).

我可以看到用例将在表示服务器端代码中,.NET或Java开发人员可以获得给定关键字的附加信息.

我将关键字理解为对组件进行分类并为作者提供在其他领域中进行选择的选项.在我需要字段的大多数情况下,我会建议一个组件,但是要确保我理解我们应该如何使用关键字元数据和任何程序限制.

  • 对于SDL翻译管理器,关键字元数据是否可以翻译?看起来关键字本身可以作为类别的一部分进行翻译(以及个别关键字取决于您的版本*).我们当然可以在不使用翻译管理器的情
  • 关键字元数据是否适用于Content Manager?你会在C#TBB中使用它吗?

更新其他人想知道:请务必检查您的SDL Tridion和SDL翻译管理器版本 - Lars指出SDL翻译管理器3.0版确实具有单一关键字翻译功能.克里斯注意到GA的行为.如有疑问,请检查文档或在您的设置中确认.

tridion tridion-content-delivery

7
推荐指数
1
解决办法
921
查看次数

避免使用与Tridion相关的代码中的硬编码TCM URI

我们经常需要与Tridion相关的代码中的特定项(模式,模板或组件).模板,内容交付,工作流或业务连接器(核心服务)经常需要引用Tridion Content Manager URI.我们可以链接到组件,但我通常会看到其他所有内容的硬编码值或WebDAV URL.

硬编码值

我理解硬编码Tridion Content Manager(Native)URI是一种不好的做法,除了几个场景:

  • 简化示例代码并明确变量是什么
  • 生成用于Content Delivery(CD)API逻辑时

我们尽可能使用给定的API或WebDAV URL来引用项目,否则我们必须避免在引用TCM URI的任何内容上使用Content Porter(或以某种方式使这些引用在Tridion之外"可配置").

WebDAV URL

WebDAV URL似乎更好,原因如下:

  • 设计模板构建块(TBB)或其他模板格式中的硬编码值与SDL内容移植器保持完整(在通过CMS环境移动时断开关系,下面有例外)
  • 虽然不同命名的路径可以"破坏"关系,但引用特定项目的"配置"组件对SDL内容移植器也会做得更好

用例

除了具有与Content Porter一起使用的模板之外,我还想在较低的出版物中本地化文件夹和/或结构组.这有助于:

  • CMS作者阅读不同的语言
  • 将项目名称和路径翻译为适当的语言
  • 也许可以帮助用户更好地导航(例如,我怀疑不同命名的文件夹可能会减少作者在BluePrint中的位置的混淆)

一种方法

为了使参考"内容易于使用",至少对于模板构建模块,我知道我们可以在组件中使用WebDAV Urls,确保将每条路径本地化到子出版物中的正确位置.例如:

  1. 代码检查发布元数据
  2. 发布元数据指向"配置组件"
  3. Config组件具有作为WebDAV URL的路径

只要我们设置发布元数据并将字段本地化为每个发布的正确路径,这将适用于大多数情况.

问题

  • 我做对了吗?是否有更简单或更易于维护的设置?

我相信我们也可以在模板代码中使用包含映射非托管URI.

  • 任何人都有这种#include方法的例子吗?我是否在TBB和/或DWT的顶部使用它,并且无论模板介体如何都可以替换引用(例如,这是否适用于XSLT Mediator,Razor Mediator等?)

  • 包含的参考文献是否适用于较低的出版物,还是仅适用于Content Porter?换句话说,如果我引用"tcm:5-123",模板会在出版物17中正确引用"tcm:17-123"吗?

tridion

7
推荐指数
1
解决办法
1003
查看次数

我们何时在给定OrganizationalItemData属性的情况下明确设置CME权限?

我正在为Core Service创建一个OrganizationalItemData对象的权限设置列表,我正在寻找帮助确认何时在CME中明确设置权限.

给定一个组织项并了解其共享,本地化和权限继承设置,我们何时需要为其明确设置权限(在CME下Properties> Security)?

API详细信息

鉴于OrganizationalItemData orgItem我可以检查以下内容(文档中的详细信息).

  • IsShared
    获取或设置是否在当前上下文发布中共享该项.

  • IsLocalized
    获取或设置项目是否已在当前上下文发布中本地化.

  • IsPermissionsInheritanceRoot
    如果为项目本身指定了权限,则为true; 否则,false,如果item继承父项的权限.

示例代码

我可以使用Core Service检查给定CMS中的权限设置.例如:

var CreatedHere = !orgItem.BluePrintInfo.IsShared.GetValueOrDefault();
var IsLocalized = orgItem.BluePrintInfo.IsLocalized.GetValueOrDefault();
var PermissionsFromParent = !orgItem.IsPermissionsInheritanceRoot.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)

我想输出给定组织项的权限,还有CMS管理员实际需要在其发布中设置属性的说明.例如,我可以使用针对CMS测试的脚本来显示CMS生产可能需要的内容.

方案

这是事实(我认为).

Shared  Local(ized)  PermissionsRoot  Set here?
No      No           No               No, set in parent in this Publication.
No      No           Yes              Yes, set in this "local" item.
No      Yes          No               Not possible. Can't localize non-shared item. 
No      Yes          Yes              Not possible. Can't localize non-shared item. …
Run Code Online (Sandbox Code Playgroud)

tridion

6
推荐指数
1
解决办法
134
查看次数