XForms 密码确认密码

4
我有一个包含典型密码和确认密码布局的xforms表单: 我的实例如下:
<data>
  <password/>
  <newPassword/>
  <confirmPassword/>
</data>

输入内容如下:

 <xf:secret ref="password">
        <xf:label>Old PAssword</xf:label>
   </xf:secret>

   <xf:secret ref="newPassword">
        <xf:label>New Password</xf:label>
   </xf:secret>
   <xf:secret ref="confirmPassword">
        <xf:label>Confirm Password</xf:label>
   </xf:secret>
   <div>
       <xf:submit submission="test">
            <xf:label>Change Password</xf:label>
       </xf:submit>
   </div>

我不知道如何使用<xf:bind标签来确切地验证和匹配新密码和确认密码,我知道这是一些内容,但我没有找到如何验证节点之间的相等性。请帮忙!

1个回答

4
您确实可以使用xf:bind来应用约束。只需将以下行添加到您的xf:model中即可:
<xf:bind nodeset="password" required="true()" constraint=". != ''"/>
<xf:bind nodeset="newPassword" required="true()" constraint=". != ''"/>
<xf:bind nodeset="confirmPassword" required="true()" constraint=". = ../newPassword"/>

这将在所有三个输入字段后添加必需标记,确保填写了所有三个字段,并且最后两个字段必须相同。您可以通过将其与 newPassword 的约束条件“and”一起添加来限制密码和 newPassword 不能相同。

个人而言,我更喜欢获得更多的反馈。这些约束只会在每个字段后面出现指示器,没有任何进一步的信息。如果您可以在试图提交信息的时候显示消息,那将是最好的。但这涉及到 xforms 事件处理,而我自己没有足够的经验告诉您如何做。有一个 xforms-submit-event,您可能可以某种方式捕获它并采取行动。但最常见的问题是,一旦提交被点击,您几乎没有或只有很少的可能性向用户显示反馈,然后才将事情发送到服务器。

另一个选项是使用 xf:output 显示条件消息。如果在 xf:secret 输入中添加 incremental="true" 属性,则在每次按键时都会刷新这些输入。只需在 xf:output 元素上使用值属性和选择表达式即可。类似于以下内容:

<xf:output value="choose(password = '' or newPassword = '' or confirmPassword = '', 'Please enter current password, new password, and confirmation of new password', '')"/>

<xf:output value="choose(newPassword = '' or newPassword = confirmPassword, '', 'new password, and confirmation do not match!')"/>

你也可以在它们周围添加一些漂亮的打印效果。实现动态样式的其他方式是使用xf:group,但我会把这留给你作为练习。
最后,确保在服务器端检查所有值,以确保没有人作弊。
祝一切顺利!

谢谢!它像魔法一样奏效了!我之前尝试过类似<xf:bind nodeset="confirmPassword" required="true()" constraint=". = ../newPassword"/>的东西,但我错过的唯一一件事是../部分,而输出的想法很棒,谢谢! - jmacboy
@jmacboy,显示错误文本有更简单的方法。只需将消息作为xf:alert元素放置在xf:secret元素内部即可。一旦相关绑定上的约束条件返回false,它将出现在输入字段旁边。实际消息的呈现可能取决于XForms解析器。 - grtjn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接