【问题标题】:Unique of email address validation (xpages)电子邮件地址验证的唯一性 (xpages)
【发布时间】:2017-07-19 16:08:40
【问题描述】:

案例:为用户创建一个数据库(系统)以请求电子邮件并在 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);

较新的测试结果:

-字段的属性

-验证属性字段

-编码部分

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

【问题讨论】:

  • 遗憾的是,他们不允许向 names.nsf 添加视图,因为(通过电子邮件发送的人员)视图会使这变得更简单,并且不会破坏其他任何内容。

标签: xpages xpages-ssjs


【解决方案1】:

我看到了三种在不更改名称的情况下查找 Internet 地址的可能性。nsf:

  1. “遍历”隐藏视图“($Users)”并将您的 Internet 地址与列InternetAddress 进行比较
  2. 使用database.search()

  3. 如果 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 包含要验证的字段值。不要忘记向用户显示错误消息的消息控件。

【讨论】:

  • 我想在验证中检查是否存在......哪种验证器类型更好用。因为我尝试根本没有成功~
  • 您可以在 ($NamesFieldLookup) 或 ($Users) 视图中执行 GetDocumentByKey,使用地址作为查找键。
  • 如果给表达式无效~我会更新我的错误照片和新代码
  • 我尝试计算字段我的编码看起来不错。它给出“真实”,意味着存在。但在验证器 - 表达式中,它会给出错误消息表达式无效
  • 将您的代码放入“表达式”(= 服务器端 JavaScript SSJS),不是“clientScript”(= 客户端 JavaScript CSJS)
【解决方案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:您必须确保签名者至少具有通讯录的读取权限。

【讨论】:

  • 问题:我需要将它发布在“表达”或“客户端脚本”区域吗?
  • 顺便说一句:我的回答是基于您希望使用最初发布的代码实现的目标。但是,如果您打算在用户已经存在的情况下显示错误消息,您当然必须使用否定版本,即return !isDominoUser(...)
猜你喜欢
  • 2014-05-23
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2012-10-22
  • 2014-03-02
  • 2015-09-09
  • 2015-01-03
相关资源
最近更新 更多