2014-03-25 89 views
2

我想要ajax驗證我的表單,我跟着this這是工作正常,但在第一列的值,我想讓用戶填寫其他列以及,yii ajax表單驗證,需要更多的字段基於某些字段

一樣,如果選擇的值是一個車,我想用戶填寫車牌號碼爲好,但如果用戶選擇了自行車,我不需要那個車牌號。

在模型前驗證功能

我已經實現了我的邏輯,但問題是在前端,如果之前沒有所需的領域,但現在需要的,形式不顯示這個。

它不會被提交,但表單字段不會變紅,並且錯誤消息不會顯示。

我怎麼能做到這一點

更新:

我也提出新要求的領域模型的規則,並用$('#my-form').trigger('reset');重置形式,但這些新必填字段不會 有紅色星號,以顯示他們是需要。

也因爲我開始賞金,有沒有什麼辦法來顯示每個領域的所有信息,他們必須注重過嗎?

+0

http://www.yiiframework.com/wiki/466/a-simple-way-to-get-yii-client-side-form-validation-run-when-submitting-by-ajax/您的要求是自定義一個。編寫一個自定義腳本是很好的。上面的鏈接可以幫助我們編寫這樣的腳本來驗證並在提交之前執行操作 – Jebin

+0

這個有獎勵它...任何一個關心採取100代表?? – tinybyte

+1

你的問題看起來很有趣但很難說沒有看到任何代碼 –

回答

1

我有一個想法...你必須創建場景...但應該有一些固定的數量,你想驗證...像如你所說,你有複選框的汽車或自行車(或無線電或下拉)選擇,你可以通過ajax再次加載你的表單,在那個動作中,你可以設置你的場景,如果汽車被選中,自行車選擇...和負載形式再次與所選擇的選項......與特定的情況下,你可以驗證動態...我認爲這是做到這一點的唯一途徑...

+0

這是一個很好的觀點,但我無法修復我想將必填字段傳遞給admin用戶。再次載入表單?像'renderPartial'一樣? – tinybyte

+0

是的...喜歡選擇汽車..再次使用renderPartial和使用setScenario加載窗體,如果還有其他條件,你可以到汽車的場景......現在你知道汽車被選中,所以setScenario的基礎上seection ...這是方式..這是非常棘手的,但將工作......(並且不要在renderPartial的最後使用false和true來通過ajax重新加載yiiactiveform ...) –

+0

您的解決方案是數據中最重的trafic,但結合從數據庫加載所需的字段和加載表單將工作,但我決定有一個ajax請求,並只獲得基於用戶定義的必填字段,並只放在字段標籤旁邊的星號。 – tinybyte

0

如果我理解正確的話,你就需要custom validation rules而不是標準要求的規則。

+0

驗證不是問題,在前端顯示是問題,根據第一個字段選擇,其他字段可能是必需的,我希望能夠爲了向客戶展示,客戶會注意到表單有一些錯誤,但我需要讓他填寫這些新的必填字段。 – tinybyte

+0

然後,你被問到如何根據其他領域的價值顯示/隱藏''元素?這不是很清楚你的意思。請顯示代碼和您嘗試的內容。 –

+0

我不需要隱藏任何東西,只需讓它們看起來像必需的字段。 – tinybyte

0

當用戶從例如您發佈的形式向控制器的下拉選擇自行車/車,還有你設置一個新的場景和渲染部分爲新創建的輸入特定的字段,並在DOM插入。這裏還有另一個問題,它們沒有經過驗證的客戶端,因爲它們不是當前呈現的活動表單的一部分。爲了實現這個看看我的帖子在這裏: Dynamic added form fields based on 1-to-n relation - What framework alternatives?

+0

我可以做你想要的東西(比如手動),但是我想知道[yii]是否支持這一點,靜態場景也不適合我,但是謝謝 – tinybyte

1

的方式我解決這個問題的方法是創建場景並在客戶端動態更新它們,而無需loadi通過AJAX重新整個表單。

在model.php創建方案類似以下內容: -

... 
public function rules(){ 
    return array(
     ... 
     array('license_plate', 'required', 'on'=>'car'), 
     array('some_column', 'some_validation', 'on'=>'bike') 
     ... 
    ); 
} 
... 

現在你詢問是否可以驗證用戶的選擇輸入而改變。假設用戶有從選擇(汽車或自行車)選擇,具有值1車,具有值2.更新控制器這樣的創建操作自行車: -

public function actionCreate(){ 
    $model = new Vehicle(); 
    if(isset($_POST['ajax']) && $_POST['ajax'] == 'FORM_ID'){ 
     if($_POST['Vehicle']['type'] == 1) 
      $model->setScenario('car'); 
     else 
      $model->setScenario('bike'); 
     //You can have n-number of scenarios here based upon your application. 
    } 
    $this->performAjaxValidation($model); 
    if(isset($_POST['Vehicle'])) 
     $model->attributes = $_POST['Vehicle']; 
    if($model->type == 1) 
     $model->setScenario('car'); 
    else 
     $model->setScenario('bike'); 
    //You can have n-number of scenarios here based upon your application. 
} 

現在,而這樣做我面臨的一個即使情況發生變化,錯誤消息的問題也不會消失。與窗體的ID,並且下拉的ID「DROPDOWN_ID」

(包括在您的視圖文件這個腳本)

$(document).on('change', '#DROPDOWN_ID', function(e){ 
    $(':input','#FORM_ID') 
     .not('#DROPDOWN_ID') 
     .val('') 
     .removeAttr('checked') 
     .removeAttr('selected'); 
    $('.help-block, .error').hide(); //NOTE 1.0 
    var settings = $('#FORM_ID').data('settings'); 
    $.each(settings.attributes, function() { 
     this.status = 2; 
    }); 
    var form = $("#FORM_ID"); 
    form.data('settings', settings); 
    $.fn.yiiactiveform.validate(form, function (data) { 
     $.each(settings.attributes, function() { 
      $.fn.yiiactiveform.updateInput(this, data, $("#FORM_ID")); 
     }); 
    }); 
}); 

請更換「FORM_ID」和 - :我解決了使用JavaScript這樣的問題驗證的選擇分別取決於您的表單。

注1.0說明:

我使用YiiBooster所以我所有的形式都在引導。驗證 我的表單中的錯誤有'幫助塊錯誤'類,請將 替換爲表單中用於顯示錯誤的類,以 正確隱藏它們。

參考文獻:

  1. Validating other fields on change of one field - Yii
  2. Changing scenarios on client side without loading the form again

我希望這可以解決此問題。

+0

你的解決方案適用於靜態場景,但如果我想離開形式驗證,給用戶(例如管理員會說什麼也需要其他字段)這不會工作,但感謝 – tinybyte

+0

順便說一句,你可以像這樣更容易地重置窗體:'$('#FORM_ID')。trigger('reset');' – tinybyte

+0

恕我直言,我不認爲Yii支持動態場景,我搜索它也是:D 在你的問題中,你說你正在實現你的beforeValidate()函數中的檢查邏輯。它是動態的還是靜態的? @tinybyte並重置我應用該方法的表單,因爲如果我使用您的方法,它也會重置用於選擇汽車或自行車的下拉列表,這將再次更改窗體的驗證。 :P –

0

你的邏輯將被實現的原始JavaScript比yii自定義驗證要容易得多。 你可以使用一個ajax下拉菜單來綁定ajax回調。通過改變它的值,當域邏輯在那裏被驗證時,你所需要的動作將被調用,並且返回一個結果(如真/假),你可以決定哪個域要顯示給用戶。 您也可以將required類附加到ajax回調後所需的字段。