2012-03-30 100 views
0

我正在爲我的表單編寫幾個(自定義)驗證程序,並且一切都如往常一樣順利,但對於一個小問題。Yii的CActiveForm錯誤消息不會消失

我有兩個字段:一個是html選擇輸入(又名dropDownList),另一個是簡單的textField

我設置我的AJAX驗證,這樣,當選擇XdropDownList被選中,在textField文字不能爲空。

因此,當用戶選擇的選項在dropDownListX,錯誤消息(對於dropDownList,請注意)出現:文本字段Y不能爲空

目前爲止還不錯。當我然後點擊textField時,鍵入一些東西,然後單擊屏幕上的其他地方,確信ajax驗證程序被關閉,並且HTTP響應爲空,表示窗體上沒有錯誤。 但是錯誤信息並沒有消失!

我猜這與我在另一個字段上使用一個字段的驗證程序clearErrors()有關,但是不應該這樣工作嗎?我已經給出了正確的字段作爲clearErrors()方法的參數..

有沒有人有任何想法可能會出錯我?

在此先感謝

編輯這裏的鏈接到我的表型號:click

當我改變target_constantsource_constant,一個驗證器發射了服務器。它工作,並由此我的意思是一個AJAX響應確實被服務器發送到我的驗證器被解僱。 此外,響應正文沒有錯誤消息,但target_regsource_reg(取決於哪些受影響)的錯誤消息而不是在同一時刻消失。只有在下一個請求/響應中,錯誤消息纔會消失。

+2

請發佈您的自定義驗證功能。 – rajmohan 2012-03-30 05:31:29

+1

非常非常難以猜出沒有代碼是什麼錯誤,所以把你的代碼放好。 – 2012-03-30 05:48:39

+0

我發佈了完整的表單模型 – 2012-03-31 04:49:24

回答

2

我只是看了這個,但是找不到你的代碼有問題。看來實際的驗證工作(你得到正確的數據),但Javascript(yiiactiveform.js)只更新最後編輯的字段的數據。這與服務器端驗證相反,後者檢查所有字段。從用戶角度來看,只顯示當前正在編輯的字段的錯誤是有意義的,但是當您有複雜的交互時,這當然有點缺乏。我在這裏大量拖延,所以我想出了一個「解決方案」。你可以使用任何屬性的afterValidateAttribute回調給力呈現與$ .fn.yiiactiveform.updateInput錯誤信息:

<div class="row"> 
    <?php echo $form->labelEx($model,'text'); ?> 
    <?php echo $form->textField($model,'text'); ?> 
    <?php echo $form->error($model,'text', array('afterValidateAttribute' => 'js:function(form, attribute, data, hasError) 
    { 
     mSettings = $.fn.yiiactiveform.getSettings(form); 
     $.fn.yiiactiveform.updateInput(mSettings.attributes[0], data, form) 
    }')); ?> 
</div> 

它有什麼作用?在回調中,我開始處理一些數據。這裏最有趣的是數據 - 這是AJAX JSON響應,所有屬性都有錯誤。在函數中,我將獲得當前形式的設置。這很重要,因爲我必須找到要操縱的屬性對象。然後我手動調用updateInput,並傳遞我想修改的屬性對象,以及來自回調的數據和表單。問題在於,您必須找出屬性對象中的哪個從零開始的索引是您的對象。我通過console.log做到了這一點。 Et瞧,你的屬性得到更新。 我只希望沒有更簡單的方法來做到這一點,我花了這麼多時間在這上面沒有任何東西。 :P

2

$form HTML字段添加自定義的「ID」這樣

$form->textField($model, 'test_field', array('id' => 'custom_id'); 

是否有必要添加自定義ID,那麼你必須把型號名稱您的自定義ID之前這樣

$form->textField($model, 'test_field', array('id' => 'youModelName_custom_id'); 

自定義ID的另一個解決方法是使用自定義類名稱。