2015-10-05 93 views
2

我使用具有兩個值的單選按鈕,即Individual和Firm。 我正在尋找一個場景,如果單選按鈕的值爲Firm,則CompanyName textinput應作爲強制(必填)字段。並且,當選擇具有個人值的單選按鈕時,則CompanyName textinput應作爲可選字段。Textfield強制性基於單選按鈕選擇 - Yii2

我沒有得到如何去做。我試圖在CompanyName textinput中添加addAttribute爲必填項。但它不起作用RegisterForm.php(模型)沒有指定任何規則。

那麼,任何想法如何做到這一點。我沒有得到。任何幫助?

register.php(視圖)

<?php $form = ActiveForm::begin(['id' => 'register-form']); ?> 
    . 
    . 
    . 
    <?= $form->field($model, 'AdminType') 
      ->radioList(array('Individual'=>'An Individual', 'Firm'=>'Firm/Company/Group of Employees')) 
      ->label('Are You')?> 
    <?= $form->field($model, 'CompanyName')->textInput()->label('Company Name') ?> 
    <div class="form-group"> 
     <?= Html::submitButton('Register', ['class' => 'btn btn-success', 'name' => 'register-button' ]) ?> 
    </div> 
<?php ActiveForm::end(); ?> 

<script> 
    $('input[type="radio"]').click(function() 
    { 
     if($(this).attr("value")=="Firm") 
     { 
      $('#registerform-companyname').addAttribute("required"); 
     } 
    }); 
</script> 

RegisterForm.php(模型)

<?php 

namespace app\models; 

use Yii; 
use yii\base\Model; 
use kartik\password\StrengthValidator; 

class RegisterForm extends Model 
{ 
    public $fname; 
    public $lname; 
    public $email; 
    public $password; 
    public $confirmPassword; 
    public $AdminType; 
    public $CompanyName; 
    public $verifyCode; 

    public function rules() 
    { 
     return [ 
       [['fname','lname', 'email', 'password','confirmPassword','verifyCode','AdminType'], 'required'], 
       ['email', 'email'], 
      ['confirmPassword', 'compare', 'compareAttribute' => 'password'], 
       ['verifyCode', 'captcha'], 
     ]; 
    } 

回答

1

最後我得到了,

['company_name', 'required', 'when' => function($model){ 
    return ($model->user_type == 'Firm' ? true : false); 
    }, 'whenClient' => "function (attribute, value) { 
     return $('input[type=\"radio\"][name=\"Users[user_type]\"]:checked').val() == 'Firm'; 
    }"], 
1

首先,具有任何類型的前端驗證是BAD,因爲我可以通過以編程方式生成帖子來規避它,並且它可以毫無問題地保存記錄,從而使得記錄不一致的可能性成爲現實。

你想要做的,而不是什麼是你的模型創建一個自定義的驗證規則的功能,以及添加規則以驗證陣列:

<?php 
namespace app\models; 

use Yii; 
use yii\base\Model; 
use kartik\password\StrengthValidator; 

class RegisterForm extends Model 
{ 
    public $fname; 
    public $lname; 
    public $email; 
    public $password; 
    public $confirmPassword; 
    public $AdminType; 
    public $CompanyName; 
    public $verifyCode; 

    public function rules() 
    { 
     return [ 
       [['fname','lname', 'email', 'password','confirmPassword','verifyCode','AdminType'], 'required'], 
       ['email', 'email'], 
       ['confirmPassword', 'compare', 'compareAttribute' => 'password'], 
       ['verifyCode', 'captcha'], 

       //add rule that uses the validator function 
       ['AdminType','radioValidator'], 
     ]; 
    } 

    //implement the validator 
    public function radioValidator($attribute, $params) 
    { 
     if($this->$attribute === 'Firm' && empty($this->$attribute)) 
      $this->addError('CompanyName', 'CompanyName cannot be blank'); 
    } 
} 
?> 

現在你的磁場產生的代碼看起來應該是這樣

<?= $form->field($model, 'CompanyName')->textInput()->label('Company Name')->error() ?> 

希望這有助於你

編輯:我習慣了用AR CLA工作(通常在使用gii生成時會自動進行驗證),它並沒有讓我想到您只使用表單模型(在基本應用中作爲示例給出的模型)

忘記->error()在現場,也請確保您有行

if ($model->load(Yii::$app->request->post()) && $model->validate()) {...}

在你的行動

+0

嗨@SmartCoder。它沒有奏效。幫我。 –

+0

我也在這裏問我的問題@SmartCoder。請看看這個http://stackoverflow.com/questions/32969883/custom-validation-not-working-yii2-app-basic-yii2。 –

+0

編輯修復 – SmartCoder