2017-07-18 129 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(...)'。 –

相关问题