2017-07-18 71 views
0

案例:爲用戶創建數據庫(系統)以請求電子郵件並在names.nsf中進行更新。電子郵件地址驗證的唯一性(xpages)

發現問題,比方說我們無法編輯names.nsf視圖或創建一個新視圖來檢查Internet地址的唯一性。

示例:用戶的網際地址(電子郵件地址)字段是:[email protected]

我不能使用選擇器驗證只是爲了驗證電子郵件地址的唯一性,因爲沒有視圖,而不是允許在names.nsf中創建一個視圖,然後對其進行排序並將其用於驗證,可以通過其他方式進行驗證嗎?

採樣值內改編

array

新的編碼增加了關於19/07/2017

var setdoc:NotesDocument = database.getProfileDocument("System Setting", ""); 
var server = setdoc.getItemValueString("DBSvr"); 
var DName = setdoc.getItemValueString("DbPath"); 
var db:NotesDatabase = session.getDatabase(server, DName, false); 

var vw:NotesView = db.getView("($VIMPeopleByLastName)") 
var doc:NotesDocument = vw.getFirstDocument(); 

var arr = [];  

while (doc != null) { 
    var tmpdoc = vw.getNextDocument(doc); 
    arr.push(doc.getItemValueString("InternetAddress")); 
    doc.recycle(); // to prevent IBM Notes Crash use recycle // The recycle method unconditionally destroys an object // and returns its memory to the system. 
    doc = tmpdoc; 
} 

value=getComponent("mail11").getValue() +"@devsvr1.pcs.com.my" 

return @IsMember(value, arr); 

Error

較新的測試結果:

enter image description here

領域

enter image description here

-validation屬性字段

enter image description here

-Coding部分

<xp:this.expression><![CDATA[#{javascript: 
var setdoc:NotesDocument = database.getProfileDocument("System Setting", ""); 
var server = setdoc.getItemValueString("DBSvr"); 
var DName = setdoc.getItemValueString("DbPath"); 
var db:NotesDatabase = session.getDatabase(server, DName, false); 

var vw:NotesView = db.getView("($VIMPeopleByLastName)") 
var doc:NotesDocument = vw.getFirstDocument(); 

var arr = [];  

while (doc != null) { 
    var tmpdoc = vw.getNextDocument(doc); 

     arr.push(doc.getItemValueString("InternetAddress")); 

    doc.recycle(); 
    doc = tmpdoc; 
} 

value=getComponent("mail11").getValue() +"@devsvr1.pcs.com.my" 

return @IsMember(value, arr); 
}]]></xp:this.expression> 
+0

他們不會允許在names.nsf中增加一個視圖,因爲(People By Email)視圖會使這個更簡單,而不會破壞其他任何東西。 –

回答

2

我看到三種可能性,尋找互聯網地址的-property無改變NAMES.NSF:

  1. 「走過」 ​​隱藏視圖 「($用戶)」,並與列與您的互聯網地址InternetAddress
  2. 使用database.search()

  3. 使用database.FTSearch()如果NAMES.NSF滿-text索引

示例search

var formula = 'InternetAddress="[email protected]":"[email protected]"; 
var dc:NotesDocumentCollection = database.search(formula); 
if (dc.getCount() > 0) { 
    // read documents' InternetAddresses and tell user which are used already 
} 

示例FTsearch

var search = '[InternetAddress]="[email protected]"; 
var dc:NotesDocumentCollection = database.FTsearch(search); 
if (dc.getCount() > 0) { 
    // tell user internet address is used already 
} 

把你的代碼轉換成例如表達驗證程序:

<xp:inputText 
    id="inputMail1"> 
    <xp:this.validators> 
     <xp:validateExpression 
      message="Your Error message"> 
      <xp:this.expression><![CDATA[#{javascript: 
       ... your code ... 
       return @IsMember(value, arr); 
      }]]></xp:this.expression> 
     </xp:validateExpression> 
    </xp:this.validators> 
</xp:inputText> 
<xp:message 
    id="message1" 
    for="inputMail1"> 
</xp:message> 

value包含要驗證的字段值。不要忘記一個消息控件向用戶顯示錯誤消息。

+0

我想在驗證中檢查是否存在或不驗證驗證器類型更好使用。因爲我嘗試不成功〜 –

+0

您可以在($ NamesFieldLookup)或($ Users)視圖中使用地址作爲查找鍵來執行GetDocumentByKey。 –

+0

如果表達無效〜我會更新我的錯誤照片和新代碼 –

2

這裏是一個SSJS功能,它檢查是否有一定ID用戶在任何可用的地址簿中存在:

function isDominoUser(id) { 
    try { 
     var db,vw,doc,itr; 

     itr=sessionAsSigner.getAddressBooks().iterator(); 
     while (itr.hasNext()) { 
      db=itr.next(); 
      try { 
       if (!db.open()) continue; 
       vw=db.getView("($Users)"); 
       doc=vw.getDocumentByKey(id,true); 
       if (doc) { 
        doc.recycle(); 
        vw.recycle(); 
        return true; 
       } 
       vw.recycle(); 
      } catch(err1) {} 
     } 

    } catch(err) { 
     java.lang.System.out.println("ERROR: "+err.toString()+" [isDominoUser]"); 
    } 
    return false; 
} 

由於($用戶)視圖還包含您可以使用該功能查找用戶是否已經註冊了某個地址。

根據您發佈的代碼示例,您的驗證表達會再看看這樣的:

return isDominoUser(getComponent("mail11").getValue()+"@devsvr1.pcs.com.my"); 

PS:你必須確保簽名者至少有讀訪問地址簿。

+0

問:我是否需要將它發佈到「表達式」或「客戶端腳本」區域? –

+0

將代碼放入「表達式」中。 –

+0

順便說一句:我的答案是基於你想用你最初發布的代碼實現的。但是,如果您打算在用戶已經存在的情況下顯示錯誤消息,您當然必須使用否定版本,即'return!isDominoUser(...)'。 –