【问题标题】:How do you get a user's name and description from their ID in the SDL Tridion Anguilla framework如何从 SDL Tridion Anguilla 框架中的 ID 中获取用户的姓名和描述
【发布时间】:2012-10-09 17:29:57
【问题描述】:

我为 SDL Tridion 2011 SP1 编写了一个 GUI 扩展。 GUI 包含一个额外的功能区按钮和在保存组件时触发的事件处理程序。

我的事件处理程序注册如下:

PowerTools.Commands.ItemCommenting.prototype._execute = function (selection) {
    var item = $display.getItem();
    $evt.addEventHandler(item, "save", this.getDelegate(this._onItemSaved));
    $cme.getCommand("SaveClose")._execute(selection);
};

事件处理程序如下所示:

PowerTools.Commands.ItemCommenting.prototype._onItemSaved = function (eventitem) {

    var comment = prompt("Please enter a comment", "");

    $messages.registerNotification("Saving user comments...");

    var commentitemid = eventitem.source.getId();
    var commenterid = eventitem.source.getCreatorId();
    var commenter = $tcm.getItem(commenterid);
    var commentername = commenter.getDescription();
    var commentdate = eventitem.source.getLastModifiedDate();
    var commentversion = eventitem.source.getVersion();

    //Call the service to update 
    PowerTools.Model.Services.AppDataServices.Append("ext:ItemCommenting", commentitemid, "<comment><user>" + commenterid + "</user><message>" + comment + "</message><datetime>" + commentdate + "</datetime><version>" + commentversion + "</version></comment>", null, null, null, false);

};

这工作正常,除了变量commentername 始终未定义。有没有更好的方法来获取用户的姓名和描述?

另外,有谁知道eventitem.source.getCreatorId() 返回的值实际上是Reviser 还是创建该项目的人?

【问题讨论】:

  • 小备注。你应该调用 command.invoke(selection);而不是 command._execute(selection);否则将不会应用 SaveClose 命令的扩展,并且您可能会遇到 js 错误。
  • 在项目上调用 getCreatorId() 确实会返回创建项目的人,而不是最后一个修改项目的人。

标签: tridion tridion-2011


【解决方案1】:

我通常在安圭拉遵循这种方法:

  1. 使用$models.getItem(item Id) 加载对象,从某人(@puf?)那里听说这是缓存的。
  2. 检查 object.isLoaded() 是否存在,如果是,则执行我的事件处理程序
  3. 如果对象没有加载,则监听事件

这一切都归结为这样的事情:

p.keyword = $models.getItem(p.keywordUri);
if (p.keyword.isLoaded()) {
    this._onReleaseKeywordLoaded();
} else {
    $evt.addEventHandler(p.keyword, "load", this.getDelegate(this._onReleaseKeywordLoaded));
    p.keyword.load();
}

然后您将从事件处理程序中调用模型的 Web 服务,因为您确定到那时该对象将被加载。

在您当前的代码中,您可能试图在加载对象之前阅读描述,因此未定义。我倾向于在this.properties var(在我的示例中为p)中的多个函数中放置我需要的变量,然后在每个函数的开头执行以下操作:

var p = this.properties;
var whatever = p.whatever;

【讨论】:

  • 确实如此。对于某些属性,例如 Title,您需要调用 getStaticXXXXX 方法(并检查 isStaticLoaded / call staticLoad)。
【解决方案2】:

正如 Nuno 所说,您可能正在读取尚未加载的属性。

但是,无论如何,您都不应该接受客户端发送的名称。您应该在 Web 服务中获取当前用户的 ID 和名称。日期/时间等其他一些参数也是如此。

基本上,您的网络服务不应该信任传入的数据。因此,它可以自行发现的任何内容甚至都不应该成为该方法的参数,并且它确实需要的任何内容都应该被视为恶意内容并在您使用它之前进行清理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 2012-12-07
    • 2012-05-20
    • 2015-03-24
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多