2011-12-05 52 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