3

我昨天发布了一个关于单选按钮Textfield Mandatory On Radio Button的自定义验证的问题。我得到了答案。但是,这不是确切的答案。但是,它解决了我的一个问题。

实际上,我有 2 个单选按钮。

  • 个人
  • 公司

When, Radio Button having "Individual" value is selected, CompanyName textbox should not be mandatory. But, when Radio Button having "Firm" value is selected, CompanyName textbox should be mandatory.

现在发生的事情是,当我选择单选按钮“公司”并且没有为 CompanyName 文本框填充任何值时,数据没有插入到数据库表中。美好的。这没关系。但是,错误消息未以形式显示。选择 Radio Button Firm 后,错误消息应显示为 CompanyName 文本框是必需的。

我没有得到我做错的地方。这是我的视图、控制器和模型代码。请帮我。

register.php (查看)

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\captcha\Captcha;
use yii\bootstrap\Modal;
use yii\helpers\Url;
?>

<?php $form = ActiveForm::begin(['id' => 'register-form']); ?>
    .
    .
    .
    <?= $form->field($model, 'AdminType')
            ->radioList(array('Individual'=>'An Individual', 'Firm'=>'Firm/Company'))
            ->label('Are You')?>
    <?= $form->field($model, 'CompanyName')->textInput()->label('Company Name')->error() ?>
    .
    .
<?php ActiveForm::end(); ?>

SiteController.php(控制器)

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\swiftmailer\Mailer;
use app\models\RegisterForm;

public function actionRegister()
{
    // Register Model
    $model = new RegisterForm();
    if ($model->load(Yii::$app->request->post())) 
    {
        $post = Yii::$app->request->post('RegisterForm');
        if ($model->validate())
        {

        }
        else
        {
            // HERE YOU CAN PRINT THE ERRORS OF MODEL
            echo "<pre>";
            print_r($model->getErrors());
            echo "</pre>";
        }
        return $this->refresh();
    }

}

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'],

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

    //implement the validator
    public function radioValidator($attribute)
    {
        if($this->$attribute === 'Firm')
            return $this->addError('CompanyName', 'Company Name cannot be blank');
    }
}
4

5 回答 5

1

您应该添加'enableAjaxValidation' => true.ActiveForm

完成此操作后,您的代码应该是,

控制器

public function actionRegister()
{
    $model = new RegisterForm();
    if(Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
      \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
      return \yii\widgets\ActiveForm::validate($model);
    }

    if ($model->load(Yii::$app->request->post())) 
    {
    }
    else
    {
        // HERE YOU CAN PRINT THE ERRORS OF MODEL
        echo "<pre>";
        print_r($model->getErrors());
        echo "</pre>";
    }
    return $this->refresh();
}

看法

<?php $form = ActiveForm::begin([
           'id' => 'register-form',
           'enableAjaxValidation' => true,
]); ?>
    .
    .
    .
    <?= $form->field($model, 'AdminType')
            ->radioList(array('Individual'=>'An Individual', 'Firm'=>'Firm/Company'))
            ->label('Are You')?>
    <?= $form->field($model, 'CompanyName')->textInput()->label('Company Name')->error() ?>
    .
    .
<?php ActiveForm::end(); ?>

它可能会帮助你。

于 2015-10-06T12:38:04.760 回答
1

阿特拉斯,我得到了答案

     //company_name
      ['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';
      }"],
于 2015-10-15T09:24:43.907 回答
0

如果您在error没有选项的情况下调用,则会抑制错误输出

ActiveFielderror方法

yii\widgets\ActiveField

public function error($options = [])
{
    if ($options === false) {
        $this->parts['{error}'] = '';
        return $this;
    }
    $options = array_merge($this->errorOptions, $options);
    $this->parts['{error}'] = Html::error($this->model, $this->attribute, $options);

    return $this;
}

您必须将调用error方法删除到 VIEW

<?= $form->field($model, 'CompanyName')->label('Company Name')->textInput() ?>
于 2015-10-06T13:12:42.423 回答
0

@娜娜派对卡

当您询问如何为验证码禁用 ajax 验证时,我尝试过这种方式。但我不确定这是否是正确的方法。

我已使用此设置设置表单

'enableAjaxValidation' => true,
'enableClientValidation' => false,
'validateOnSubmit' => false,

并将操作的验证更改为此(在我的案例中,我从应该验证的属性中删除了我的验证码“verifyCode”。

if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = 'json';
        $validateAttributes = $model->activeAttributes();
        $key = array_search('verifyCode', $validateAttributes);
        if ($key!==false) {
            array_splice($validateAttributes, $key, 1);
        }
        return \yii\widgets\ActiveForm::validate($model, $validateAttributes);
}
于 2015-10-07T07:33:08.913 回答
0

实际上,您的操作方法是不正确的。当您调用 refresh() 时,您基本上会重新加载页面。如果模型尚未在数据库中更新,您将不会看到任何特殊情况,并且在重新加载新模型后也不会出现错误。

此代码将在您的视图中照常显示错误:

   /**
     * @return \yii\web\Response
     */
    public function actionRegister()
    {
        // Register Model
        $model = new RegisterForm();
        if ($model->load(Yii::$app->request->post()))
        {
            $post = Yii::$app->request->post('RegisterForm');
            if ($model->validate())
            {
                 // whatever
            }

//            return $this->refresh(); // do not refresh but...
        }

        // ... render the view with the current model, who's errors attribute is filled
        return $this->render('register', compact('model'));
    }

注意:另外,您不必在视图中调用 errors(),ActiveFormField 渲染方法会为您处理它:

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

足够

于 2015-10-07T08:05:54.930 回答