[英]yii2 Conditional Validation setting value to NULL
['state', 'required', 'when' => function ($model) {
return $model->country != null;
}, 'enableClientValidation' => false],
添加此代碼后,為什么country
屬性更新為具有null
值? 我發現上面的規則不起作用,因為當我在模型規則中添加這些代碼時, country
僅設置為NULL
。
在我的控制器上,我使用以下命令設置數據:
$model = Country::findOne($country_id);
$model->load(Yii::$app->request->post());
在我看來,我只有這個自定義的html,我沒有使用yii2的視圖
<form ='form1'>
<input name="Country[country_name]" type="text"/>
</form>
<form ='form2'>
<input name="Country[state_name]" type="text"/>
</form>
由於您沒有發布足夠多的代碼讓任何人都知道您擁有什么,因此這與我所能達到的程度非常接近。 如果您添加更多代碼,我可能會更新此答案。 我們需要查看更多的模型,控制器和視圖。
在視圖文件中,這將有幫助,這樣我就可以看到為您的輸入分配了哪些ID,這將使我能夠提供更詳細的代碼。 因此,現在,您需要查看表單並查看輸入元素上的ID。 將以下javascript中的REPLACEHERE
替換為您的ID開頭。
模型
['state_name', 'required', 'when' => function($model) {
return !empty($model->country_name);
}, 'whenClient' => "isCountryEmpty"
],
放置在視圖文件的底部:
<?php $this->registerJs('
function isCountryEmpty (attribute, value) {
return ($("#REPLACEHERE-country_name").val().length > 0) ? true : false;
};
jQuery( "#REPLACEHERE-country_name" ).keyup(function() {
$("#w0").yiiActiveForm("validateAttribute", "REPLACEHERE-state_name");
$("#w0").yiiActiveForm("validateAttribute", "REPLACEHERE-country_name");
});
jQuery( "#REPLACEHERE-state_name" ).keyup(function() {
$("#w0").yiiActiveForm("validateAttribute", "REPLACEHERE-state_name");
$("#w0").yiiActiveForm("validateAttribute", "REPLACEHERE-country_name");
});
'); ?>
模型中的whenClient告訴它運行客戶端驗證,並在javascript中調用isStateEmpty函數。 其他2個javascript檢測state
和country
輸入的變化。 在輸入keyup
它們會觸發Yii ActiveForm javascript重新驗證。
希望對您有所幫助!
編輯
添加視圖的代碼后,您的名稱不正確。 在您看來,您具有state_name
和country_name
但在模型中僅使用state
。 我已經更新了上面的代碼以反映這一點。
如果您未使用Yii表單,則不會獲得客戶端驗證。 當ActiveForm創建表單時,這些元素受附加到元素的專用Yii ID的約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.