2012-10-09 13 views
6

में आपने थियर आईडी से उपयोगकर्ता का नाम और विवरण कैसे प्राप्त किया है मैंने एसडीएल ट्रिडियन 2011 एसपी 1 के लिए एक जीयूआई एक्सटेंशन लिखा है। जीयूआई में एक अतिरिक्त रिबन बटन और इवेंट हैंडलर होता है जो एक घटक सहेजे जाने पर ट्रिगर होता है।एसडीएल ट्रिडियन एंगुइला फ्रेमवर्क

मेरे ईवेंट हैंडलर पंजीकृत किया गया है इस प्रकार है:

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() द्वारा लौटाया गया मूल्य वास्तव में रेविज़र या वास्तव में वह व्यक्ति है जिसने आइटम बनाया है?

अग्रिम

+0

छोटी टिप्पणी। आपको कमांड.inवोक (चयन) पर कॉल करना चाहिए; बल्कि कमांड._एक्सक्यूट (चयन); अन्यथा SaveClose कमांड के लिए एक्सटेंशन लागू नहीं होंगे और आप संभावित रूप से जेएस त्रुटियां प्राप्त कर सकते हैं। –

+0

कॉलिंग getCreatorId() किसी आइटम पर वास्तव में उस व्यक्ति को लौटाता है जिसने आइटम बनाया है और अंतिम व्यक्ति को इसे संशोधित करने के लिए नहीं। –

उत्तर

8

धन्यवाद मैं सामान्य रूप से एंगुइला में इस दृष्टिकोण का पालन करें: (? @puf)

  1. उपयोग $models.getItem(item Id) वस्तुओं लोड करने के लिए, किसी से सुना है कि इस कैश किया गया है।
  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(); 
} 

फिर आप ईवेंट मॉडल हैंडलर से अपने मॉडल की webservice को कॉल करेंगे, क्योंकि आप सुनिश्चित हैं कि ऑब्जेक्ट तब तक लोड हो जाएगा।

आपके वर्तमान कोड में आप ऑब्जेक्ट लोड होने से पहले विवरण को पढ़ने की कोशिश कर रहे हैं, इसलिए अपरिभाषित। मैं चर है कि मैं this.properties वर (p मेरे उदाहरण में) में एक से अधिक कार्यों में की आवश्यकता होगी जगह तो हर कार्य की शुरुआत में कुछ इस तरह करते हैं:

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

परिचित नूनो लगता है ... –

+0

दरअसल। और कुछ गुणों के लिए, जैसे शीर्षक, आप इसके बजाय getStaticXXXXX विधि को कॉल करना चाहते हैं (और isStaticLoaded/कॉल staticLoad जांचें)। –

1

रूप Nuno ने कहा, आप शायद एक पढ़ रहे हैं संपत्ति जो लोड नहीं हुई है।

हालांकि, आपको वैसे भी ग्राहक द्वारा भेजे गए नाम को स्वीकार नहीं करना चाहिए। आपको इसके बजाय अपनी वेब सेवा में वर्तमान उपयोगकर्ता का आईडी और नाम प्राप्त करना चाहिए। तारीख/समय जैसे कुछ अन्य तर्कों के लिए भी यही है।

असल में, आपकी वेब सेवा को आने वाले डेटा पर कभी भरोसा नहीं करना चाहिए। तो जो भी कुछ भी अपने आप को समझ सकता है उसे विधि के लिए भी तर्क नहीं होना चाहिए, और जो कुछ भी उसे चाहिए, उसे दुर्भावनापूर्ण सामग्री माना जाना चाहिए और इसका उपयोग करने से पहले इसे स्वच्छ किया जाना चाहिए।

संबंधित मुद्दे