【问题标题】:Yii client-side validation and jQuery Form plugin integrationYii 客户端验证和 jQuery Form 插件集成
【发布时间】:2012-02-20 15:39:10
【问题描述】:

我在我的一个项目中使用 Yii 框架,我想将 jQuery Form plugin 与 Yii 客户端内置验证一起使用。

我不能让他们一起工作。如果我用这个简单的 js 代码设置jQuery form plugin

$('#myform-id').ajaxForm();

执行客户端验证,但即使验证失败,它也不会停止表单提交。我想这与 Yii 客户端验证库和 jQuery 表单插件在表单上绑定相同的“提交”事件有关。

仅供参考,我仔细检查了 FireBug 和 Chrome 控制台没有 js 错误。

我想知道是否有人遇到过同样的问题并以某种方式解决了这个问题。

【问题讨论】:

    标签: php jquery validation yii jquery-forms-plugin


    【解决方案1】:

    我是这样解决的:

    Yii Active Form 初始化代码:

    <?php $form = $this->beginWidget('CActiveForm', array(
        'id'=>'user-form',
        'enableClientValidation'=>true,
        'clientOptions' => array(
             'validateOnSubmit'=>true,
             'validateOnChange'=>false,
             'afterValidate'=>'js:submiAjaxForm'
         )
    )); ?>
    

    在同一页面中,我添加了此 js 代码以通过 jquery 表单插件提交表单:

    function submitAjaxForm(form, data, hasError)
    {
       if(!hasError)
       {
           $('#user-form').ajaxSubmit(
           {
               // ajax options here
           });
       }
    }
    

    【讨论】:

      【解决方案2】:

      尝试在您的提交事件中停止传播:

      $('#your-form').submit(function(e){
            e.stopPropagation();
            ... some other code ...
      });
      

      【讨论】:

      • 不幸的是,如果不破解 Yii 框架的核心文件,我就无法做到这一点。而且我不直接绑定表单提交,但是jquery表单插件可以。无论如何,我用另一种方式解决了。
      【解决方案3】:

      在客户端你可以

      <?php echo CHtml::activeTextField($model, 'text', array(
                                                                  'placeholder'=>$model->getAttributeLabel('text'),
                                                                  'class'=>'form-control'
      <script>                                                    )); ?>
      function Validate(field){
                  var _this = field;
                  var errorDiv = _this.parent().find('.errors');
                  var attr = [];
                  _this.each(function(){
                      var match = $(this).attr('name').match(/\[(.*?)\]/);
                      attr.push(match[1]);
                  })
      
                  jQuery.ajax({
                      type: 'POST',
                      url: 'url/',
                      data: 'ajax=keyup&'+_this.serialize()+'&attr='+attr,
                      cache: false,
                      processData: false,        
                      success: function(data){
                          data=JSON.parse(data);
                          if(data.success){
                              _this.addClass('green');
                              errorDiv.html('');
      
                          }else{
                              _this.addClass('red');
                              errorDiv.html(data[attr][0]);
                          }
                      }
                  });
              }
              var delay = (function(){ 
                  var Timer = 0;
                  return function(callback, ms){
                      clearTimeout (Timer);
                      Timer = setTimeout(callback, ms);
                  };
              })(); //if you want to delay
      
              $('#traveler_info input').keyup(function(){
                  var _this = $(this);
                  timeout = setTimeout(function(){
                      Validate(_this,'Travelers')
                  },1000)
      
              });
      

      ` 在站点控制器中

      public function actionAjaxvalidation($type = null)
      {   
      
          $model = new Travelers;
      
          if( isset($_POST['Travelers'], $_POST['attr']) ) 
          {
              /*
              * @params Model->value $attr 
              *
              */
              $attr = $_POST['attr'];
      
              $model->$attr = $_POST['Travelers'][$attr];
      
              if( $model->validate(array($attr)) )
              {   
      
                  echo json_encode(['success'=>true]);
      
              }
              else
              {
                  echo json_encode( $model->errors );
              }
      
              Yii::app()->end();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 2012-11-13
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多