2011-12-05 44 views
4

我有典型的密码,确认使用XForms密码布局: 我的情况是这样的:的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> 

我不t知道如何验证并使用confirmPassword匹配newPassword,我知道它使用<xf:bind标签,但我还没有找到如何验证节点之间的相等性。 请帮忙!

回答

4

确实可以使用xf:bind来应用约束。只需以下行添加到您的XF:型号:

<xf:bind nodeset="password" required="true()" constraint=". != ''"/> 
<xf:bind nodeset="newPassword" required="true()" constraint=". != ''"/> 
<xf:bind nodeset="confirmPassword" required="true()" constraint=". = ../newPassword"/> 

这将添加必需的标记后面的所有三个输入字段,确保所有三个字段填写,并最后两个必须是相同的。您可以添加一个约束条件,即password和newPassword不能相同,只需在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,但是我将把它作为一个练习。

最后,请务必检查服务器端的所有值,以确保没有人作弊。

HTH!

+0

谢谢!它像一个魅力工作!我尝试过之前像''但我唯一错过的就是'../'部分,并输出的想法是伟大的,谢谢! – jmacboy

+0

@jmacboy有一种更简单的方法来显示错误文本。只需将该消息作为'xf:secret'元素内的'xf:alert'元素。只要关联绑定的约束返回false,它就会出现在输入字段旁边。演示实际的消息可能取决于XForms解析器。 – grtjn