2012-10-09 18 views
6

Tôi đã viết một phần mở rộng GUI cho SDL Tridion 2011 SP1. GUI bao gồm một nút thêm ribbon và trình xử lý sự kiện được kích hoạt khi một thành phần được lưu.Làm thế nào để bạn có được tên và mô tả của người dùng từ ID của họ trong khung SDL Tridion Anguilla

xử lý sự kiện của tôi được đăng ký như sau:

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

và xử lý sự kiện trông như thế này:

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); 

}; 

này đang làm việc tốt, ngoại trừ việc biến commentername phải lúc nào cũng xác định. Có cách tiếp cận tốt hơn để nhận tên và mô tả của người dùng không?

Ngoài ra, có ai biết nếu giá trị được trả về bởi eventitem.source.getCreatorId() thực sự là Reviser hay thực sự là người đã tạo mục này?

Cảm ơn trước

+0

Nhận xét nhỏ. Bạn nên gọi command.invoke (lựa chọn); thay vì sau đó lệnh._execute (lựa chọn); Nếu không, các tiện ích mở rộng cho lệnh SaveClose sẽ không được áp dụng và bạn có thể gặp lỗi js. –

+0

Gọi getCreatorId() trên một mục thực sự trả về người đã tạo mục và không phải là người cuối cùng sửa đổi nó. –

Trả lời

8

tôi thường làm theo phương pháp này trong Anguilla: (? @puf)

  1. sử dụng $models.getItem(item Id) để nạp các đối tượng, nghe từ ai đó mà điều này được lưu trữ.
  2. kiểm tra nếu object.isLoaded() và nếu như vậy, thực hiện xử lý sự kiện của tôi
  3. nếu đối tượng không được tải, sau đó lắng nghe những sự kiện

Tất cả đều đi xuống đến một cái gì đó như thế này:

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(); 
} 

Sau đó, bạn sẽ gọi dịch vụ web của mô hình từ trình xử lý sự kiện, vì bạn chắc chắn rằng đối tượng sẽ được tải sau đó.

Trong mã hiện tại của bạn, bạn có thể đang cố gắng đọc mô tả trước khi đối tượng được tải, do đó không xác định. Tôi có xu hướng đặt biến mà tôi sẽ cần phải qua nhiều chức năng trong this.properties var (p trong ví dụ của tôi) sau đó làm một cái gì đó như thế này vào lúc bắt đầu của mỗi chức năng:

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

Nghe Nuno quen thuộc ... –

+0

Thật vậy. Và đối với một số thuộc tính, như Title, bạn sẽ muốn gọi phương thức getStaticXXXXX (và kiểm tra isStaticLoaded/call staticLoad). –

1

Như Nuno cho biết, có lẽ bạn đang đọc một tài sản chưa được tải.

Tuy nhiên, bạn không nên chấp nhận tên được gửi bởi khách hàng. Thay vào đó, bạn sẽ nhận được ID và tên của người dùng hiện tại trong dịch vụ web của mình. Tương tự đối với một số đối số khác như ngày/giờ.

Về cơ bản, dịch vụ web của bạn sẽ không bao giờ tin tưởng dữ liệu đến. Vì vậy, bất cứ điều gì mà nó có thể tự mình tìm ra thậm chí không phải là một biện luận cho phương pháp, và bất cứ điều gì mà nó cần phải được coi là nội dung độc hại và được khử trùng trước khi bạn sử dụng nó.

Các vấn đề liên quan