我了解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.
片段和汇编之间的任何其他区别以及如何在两者之间进行选择?
我有这个设置,但它似乎不太正确.
您将如何改进跨多个.NET(客户)开发团队的内容交付(CD)开发?
CMS服务器 - > Presentation Server环境
期望和限制:
工作
我们使用Content Delivery API针对本地计算机和CD DEV的相同代理数据库开发了ASP.NET页面.本地计算机具有CD dll,它们自己的许可证文件,并且可以通过查询和组件表示调用运行/调试.
坏
我们偶尔会发布Dev开发服务器和开发者机器,这些机器现在似乎没有,但我认为是在本地机器上获取模式文件.但是,是的,我们不信任开发经纪人数据库.
问题:
本地机器有时需要Tridion发布的页面,但我们无法可靠地发布到本地机器:
为每个开发人员管理发布目标并为每台新笔记本电脑设置CD是一种很好的做法(在练习中,不一定是个好主意),但只是有点单调乏味.
这些后见之明的方法是否适用?
你怎么能更好地为组织中的几个开发人员设置.NET CD?
编辑:@DominicCronin指出这只是正确DTAP设置的一个子集.我更新了我的条款,并创建了一个单独的问题,以使用Tridion澄清DTAP.
在一个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_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 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, …
我一直在下面GUI扩展和通知示例使用两种_isEnabled或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)
我看到Anguilla ._isEnabled用于现有功能(在代码中的许多地方的Chrome控制台中).例如,WhereUsed有:
Tridion.Cme.Commands.WhereUsed.prototype._isAvailable =
function WhereUsed$_isAvailable(selection) ...
Run Code Online (Sandbox Code Playgroud)
我熟悉前面的下划线是私有变量的命名约定._isEnabled和其他以下划线"私有"开头的函数是什么?如果是的话,那么
我假设相同的方法适用于以下划线开头的其他函数,例如_isAvailable,和_invoke.
我知道开箱即用,我们可以使用以下内容在DWT模板构建模块(TBB)中循环或迭代数组.
<!-- TemplateBeginRepeat name="array_name" -->
<!-- template logic -->
<!-- TemplateEndRepeat -->
Run Code Online (Sandbox Code Playgroud)
总之,我们可以使用:
Component 迭代组件或组件演示时引用当前组件ComponentTemplate 迭代组件演示时引用当前组件模板(这将在页面级别)Field 迭代字段和多值字段时引用当前字段.FieldPath获取迭代项的完整路径.TemplateRepeatIndex在Tridion Practice Cookbook中看到的嵌套循环中使用它很有用.*TemplateRepeatIndex,从零开始的循环计数.我们可以在Components数组循环中的给定Component中执行嵌套循环,也可以Fields在迭代多值字段时有条件地检查特定的字段名称.
我通过嵌套DWT的语法看到了双重查找(例如@@Image_${TemplateRepeatIndex}@@ ,如Yet Another Tridion Blog所述).
问题(S)
可以肯定的是,这些是复合模板中的项目或数组/集合Package,正确(默认情况下存在或由我们的代码放置)?
我们可以"迭代"一个包中的单独项目吗?
例如,如果我们有单独的组件Package,我们可以用类似的东西"迭代"它们@@Component${TemplateRepeatIndex}@@吗?
我看到我可以在循环中引用这样的项目,但是我看到的所有内容都表明以下内容是不可能的:
<!-- TemplateBeginRepeat name="@@Component${TemplateRepeatIndex}@@" -->
<!-- do something with @@Component${TemplateRepeatIndex}@@ -->
<!-- TemplateEndRepeat -->
Run Code Online (Sandbox Code Playgroud) 除了名称,键,值以及与其他关键字的关系之外,关键字本身也可以包含元数据.这允许作者通过选择元数据模式添加其他信息,然后添加任何内容:

SDL Live Content描述了如何检索关键字属性.给定一个关键字,myKeyword我们可以得到myKeyword.KeywordMeta.NameValues名称 - 值对(字典).
我可以看到用例将在表示服务器端代码中,.NET或Java开发人员可以获得给定关键字的附加信息.
我将关键字理解为对组件进行分类并为作者提供在其他领域中进行选择的选项.在我需要字段的大多数情况下,我会建议一个组件,但是要确保我理解我们应该如何使用关键字元数据和任何程序限制.
更新其他人想知道:请务必检查您的SDL Tridion和SDL翻译管理器版本 - Lars指出SDL翻译管理器3.0版确实具有单一关键字翻译功能.克里斯注意到GA的行为.如有疑问,请检查文档或在您的设置中确认.
我们经常需要与Tridion相关的代码中的特定项(模式,模板或组件).模板,内容交付,工作流或业务连接器(核心服务)经常需要引用Tridion Content Manager URI.我们可以链接到组件,但我通常会看到其他所有内容的硬编码值或WebDAV URL.
我理解硬编码Tridion Content Manager(Native)URI是一种不好的做法,除了几个场景:
我们尽可能使用给定的API或WebDAV URL来引用项目,否则我们必须避免在引用TCM URI的任何内容上使用Content Porter(或以某种方式使这些引用在Tridion之外"可配置").
WebDAV URL似乎更好,原因如下:
除了具有与Content Porter一起使用的模板之外,我还想在较低的出版物中本地化文件夹和/或结构组.这有助于:
为了使参考"内容易于使用",至少对于模板构建模块,我知道我们可以在组件中使用WebDAV Urls,确保将每条路径本地化到子出版物中的正确位置.例如:
只要我们设置发布元数据并将字段本地化为每个发布的正确路径,这将适用于大多数情况.
任何人都有这种#include方法的例子吗?我是否在TBB和/或DWT的顶部使用它,并且无论模板介体如何都可以替换引用(例如,这是否适用于XSLT Mediator,Razor Mediator等?)
包含的参考文献是否适用于较低的出版物,还是仅适用于Content Porter?换句话说,如果我引用"tcm:5-123",模板会在出版物17中正确引用"tcm:17-123"吗?
我正在为Core Service创建一个OrganizationalItemData对象的权限设置列表,我正在寻找帮助确认何时在CME中明确设置权限.
给定一个组织项并了解其共享,本地化和权限继承设置,我们何时需要为其明确设置权限(在CME下Properties> Security)?
鉴于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)