【问题标题】:Yii Ajax form validate only for one fieldYii Ajax 表单仅对一个字段有效
【发布时间】:2014-04-27 04:06:09
【问题描述】:

我的模特注册表格中有一个电子邮件字段以及姓名、国家、年龄等其他字段。

我必须为 电子邮件 字段进行 ajax 验证 onChange 事件。

我的视图被设置为启用 ajax 验证。

我的问题是所有字段的 ajax 验证不仅适用于电子邮件,我只需要为一个字段 onChange 事件执行此操作。

这是我的看法

$form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
                'id'=>'Login-Form',
                'enableClientValidation'=>true,
                'enableAjaxValidation'=>true,
                'clientOptions'=>array(
                        'validateOnSubmit'=>true,
                ),
        )); 
 echo $form->errorSummary($loginForm);

 echo $form->textFieldRow($loginForm, 'email'); 

 echo $form->textFieldRow($loginForm, 'name'); 

 echo $form->textFieldRow($loginForm, 'age'); 

 echo $form->textFieldRow($loginForm, 'country'); 

这是我的模型

public function rules()
{
        return array(
            array('email, country, name', 'required'),
                        array('email', 'checkEmail')
                    );
}
// custom function to check email
 public function checkEmail($attribute, $params)      
 {  
            $this->addError($attribute,strtr('email exsit before',$params));
 }

如何在没有 ajax 验证的情况下仅对电子邮件和客户端的其他字段(国家、姓名、年龄)启用 ajax 验证。

请帮我花很多时间来做这件事。

谢谢

【问题讨论】:

    标签: php jquery yii


    【解决方案1】:

    在更改时设置表单 clientOption,如下所示:

    $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
                'id'=>'Login-Form',
                'enableClientValidation'=>true,
                'enableAjaxValidation'=>true,
                'clientOptions'=>array(
                        'validateOnSubmit'=>true,
                        'validateOnChange'=>true,
    

    以便在更改时触发验证 这可以通过在验证触发器上将第四个参数设置为 false 来完成。

    <?php echo $form->error($model,'email', array(), false); ?>
    

    【讨论】:

    • 谢谢,但它仍然验证所有字段,并且当任何字段 ajax 请求上的 onChange 事件发送到服务器时,所以我有很多 ajax 请求验证,我需要一个 ajax 请求来验证仅一封电子邮件.
    • 我们可以添加'validateOnType'=>true,这样在输入的时候会显示错误。
    【解决方案2】:

    在你的模型中设置这个

        public function rules()
        {
            return array(
                   array('email, country, name', 'required'),
                   array('email', 'unique'), //check if email already exist
                   array('email', 'email'),
            );
        }
    

    在你的控制器中

        <?php 
        class SiteController extends CController {
        .... // Other functions
    
        public function actionLogin(){  // Your corresponding action
            $model= new LoginForm();  // Your actual model name
    
            $_POST['ajax'] === 'Login-form' make sure that login form is the same as your form name in view 
    
             if (isset($_POST['ajax']) && $_POST['ajax'] === 'Login-form') {
             echo CActiveForm::validate($model,);
             Yii::app()->end();
        }
    
        ... // Remaining action logic
    

    在你看来

        $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
            'id'=>'Login-Form',
            'enableClientValidation'=>false,
            'enableAjaxValidation'=>true,
            'clientOptions'=>array(
                'validateOnSubmit'=>false,
                'validateOnChange'=>false,
                'validateOnType' => true,
    

    【讨论】:

      【解决方案3】:

      要通过 ajax 执行验证,除了在表单视图中启用 enableAjaxValidation 之外,您首先需要在控制器中调用辅助函数

      在您的控制器中(我假设是 SiteController,因为这是一个登录表单)

      <?php 
      class SiteController extends CController {
      .... // Other functions
      
      public function actionLogin(){  // Your corresponding action
          $model= new LoginForm();  // Your actual model name
      
          if (isset($_POST['ajax']) && $_POST['ajax'] === 'login-form') {
               echo CActiveForm::validate($model,array('email'));
               Yii::app()->end();
          }
      
          ... // Remaining action logic
      

      请参阅 ValidateenableAjaxValidation api 文档了解其工作原理的完整详细信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        相关资源
        最近更新 更多