案例:为用户创建数据库(系统)以请求发送电子邮件并在names.nsf中更新。
发现问题,假设我们无法编辑names.nsf视图或创建新视图只是为了检查Internet地址的唯一性。
示例:用户的InternetAddress(电子邮件地址)字段为:TestUser1@brooke.com.my
我不能仅仅使用选择器验证器来验证电子邮件地址的唯一性,因为没有视图,并且不允许在names.nsf中创建视图,只是为了对其进行排序并将其用于验证,我想知道另一种方式做验证〜?
arr
中的示例值2017年7月19日新增编码
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);
较新的测试结果:
- 该领域的属性
-validation property field
编码部分
<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 :(得分:2)
我看到三种可能性,无需更改names.nsf:
即可查找互联网地址InternetAddress
如果names.nsf是全文索引的,请使用database.FTSearch()
search
的示例:
var formula = 'InternetAddress="TestUser1@brooke.com.my":"TestUser2@brooke.com.my";
var dc:NotesDocumentCollection = database.search(formula);
if (dc.getCount() > 0) {
// read documents' InternetAddresses and tell user which are used already
}
FTsearch
的示例:
var search = '[InternetAddress]="TestUser1@brooke.com.my";
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
包含要验证的字段值。不要忘记一个消息控件来向用户显示错误消息。
答案 1 :(得分: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;
}
由于($ Users)视图还包含邮件地址,因此您可以使用该功能查明用户是否已使用某个地址注册。
根据您发布的代码示例,您的验证表达式将如下所示:
return isDominoUser(getComponent("mail11").getValue()+"@devsvr1.pcs.com.my");
PS:您必须确保签名者至少具有对地址簿的读取权限。