如何从SDL Tridion Anguilla框架中的ID获取用户的名称和描述

时间:2012-10-09 17:29:58

标签: tridion tridion-2011

我为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还是创建该项目的人?

2 个答案:

答案 0 :(得分:8)

我通常在安圭拉采用这种方法:

  1. 使用$models.getItem(item Id)加载对象,从某人(@puf?)听到这是缓存的。
  2. 检查object.isLoaded()以及是否执行我的事件处理程序
  3. 如果未加载对象,则收听事件
  4. 这一切都归结为这样:

    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;
    

答案 1 :(得分:1)

正如Nuno所说,你可能正在阅读一个尚未装载的财产。

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

基本上,您的Web服务永远不应该信任传入的数据。因此,它本身可以解决的任何事情都不应该是该方法的一个参数,它所需要的任何东西都应该被视为恶意内容并在使用之前进行消毒。