2015-10-16 3 views
1

Я использую проверку Ajax в своем виджете. вот код.Yii Ajax Проверка в виджет не работает

функция Widget

public function run(){ 

if(!Yii::app()->user->isGuest){ 
    $this->controller->redirect('/'); 
} 

$model= new LoginForm; 

// if it is ajax validation request 
if(isset($_POST['ajax']) && $_POST['ajax']==='login-form') 
{ 
    echo CActiveForm::validate($model); 
    Yii::app()->end(); 
} 
    if(isset($_POST['LoginForm'])) 
    { 

     $model->attributes=$_POST['LoginForm']; 
     // validate user input and redirect to the previous page if valid 
     // blah blah....... 

Widget Вид:

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'login-form', 
    'enableAjaxValidation'=> true, 
    'enableClientValidation'=>true, 
    'clientOptions'=>array(
     'validateOnSubmit'=>true, 
    ), 
)); ?> 


    <div class="row"> 
     <?php echo $form->textField($model,'username',array('placeholder'=>'email','class'=>'form-control')); ?> 
     <?php echo $form->error($model,'username'); ?> 
    </div> 

    <div class="row"> 
     <?php echo $form->passwordField($model,'password',array('placeholder'=>'password','class'=>'form-control')); ?> 
     <?php echo $form->error($model,'password'); ?> 
    </div> 


    <div class="row buttons"> 
     <?php echo CHtml::submitButton('Login', array('class'=>'btn btn-primary btn-block')); ?> 
    </div> 
    ... 
  • Сейчас форма не подает. После того, как я нажимаю login, ничего не происходит.
  • Если я делаю enableAjaxValidation fale, форма работает, но не AJAX.
  • Если я делаю enableClientValidation false, то формы работают , но все еще нет AJAX.

Любые идеи? Благодарю.

ответ

1

Дело в том, что вы используете одну кнопку отправки, вместо кнопки отправки ajax.

Для этого вы можете использовать, например, виджет ajaxSubmitButton из Yii Bootstrap (или Yii booster).

Так, в SiteController:

... 
$model= new LoginForm; 

if(isset($_POST['ajax']) && $_POST['ajax']==='login-form') 
{ 
    echo CActiveForm::validate($model); 
    Yii::app()->end(); 
} 
if(isset($_POST['LoginForm'])) 
{ 
    $model->unsetAttributes(); 
    $model->attributes=$_POST['LoginForm']; 

    if($model->validate() && $model->login()) 
    { 
    $array = array('login' => 'success'); 
    $json = json_encode($array); 
    echo $json; 

    Yii::app()->end(); 
    } 
    else{ //This is the important point 
    if(Yii::app()->getRequest()->getIsAjaxRequest()) 
    { 
     $array=$model->getErrors(); 
     $json = json_encode($array); 
     echo $json; //JSON containing the errors set in /models/LoginForm.php 
     Yii::app()->end(); 
    } 
    } 
} 
... 

На ваш взгляд:

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'login-form', 
    'enableAjaxValidation'=> true, 
    'enableClientValidation'=>true, 
    'clientOptions'=>array(
    'validateOnSubmit'=>true, 
    ), 
)); 
?> 

<div class="row"> 
    <?php echo $form->textField($model,'username',array('placeholder'=>'email','class'=>'form-control')); ?> 
    <?php echo $form->error($model,'username'); ?> 
</div> 

<div class="row"> 
    <?php echo $form->passwordField($model,'password',array('placeholder'=>'password','class'=>'form-control')); ?> 
    <?php echo $form->error($model,'password'); ?> 
</div> 

<div class="row" > 
    <?php 
     /** THIS IS THE AJAX SUBMIT BUTTON **/ 
    $this->widget('bootstrap.widgets.TbButton', array(
         'buttonType' => 'ajaxSubmit', 
         'label' => 'Login', 
         'ajaxOptions' => array(
           'success' => 
            'function(data){ 
             var obj = $.parseJSON(data); 
             if(obj.login=="success"){ 
              //... 
              // $(location).attr("href","BASEURL/someController/someAction") 
             } 
             else{ 
              if("username" in obj){ 
               $("#LoginForm_username_em_").text(obj.username[0]); 
               $("#LoginForm_username_em_").show(); 
               $("#LoginForm_username").css({"background":"#FEE","border-color":"#C00"}); 
              } 

              if("password" in obj){ 
               $("#LoginForm_password_em_").text(obj.password[0]); 
               $("#LoginForm_password").css({"display":"block"}); 
               $("#LoginForm_password").css({"background":"#FEE","border-color":"#C00"}); 
              } 
              $("#LoginForm_password_em_").show(); 
             } 
          }'), 
        )); 
    ?> 
</div> 

Для того, чтобы использовать ajaxSubmitButton виджет Yii Bootstrap (или Yii Booster), вы должны загрузить его из http://yiibooster.clevertech.biz/, извлеките его в папку с защитой/расширением и включите его в /protected/config/main.php:

... 
Yii::setPathOfAlias('bootstrap',dirname(__FILE__).'/../extensions/bootstrap'); //booster insead of bootstrap if you download the Yii Booster. 

return array(
    ... 
    'components'=>array(
    ... 
    'bootstrap'=>array(
     'class'=>'ext.bootstrap.components.Bootstrap', // assuming you extracted bootstrap under extensions 
    ), 
) 
) 

У Yii Booster есть много других виджетах, поэтому я использую его. Если вы не хотите использовать ускоритель Yii для кнопки отправки ajax, просто используйте CHtml :: ajaxSubmitButton

+0

благодарит за помощь. Но я не думаю, что код выше работает. Я попробовал var obj = $ .parseJSON (данные); но он всегда возвращает недопустимый токен в консоли. – jackhao

+0

Попробуйте это: В login.php, в 'ajaxOptions': .. 'ajaxOptions' => массив ( 'успех' => «функция (данные) { вар OBJ = $ .parseJSON (данные); оповещения (данные);. если (obj.login == "успех") { ... } еще {..} – Mundo

+0

С этим предупреждением, вы можете увидеть, что возвращая JSON тем не менее, я думаю, что вы пропустил что-то в модели LoginForm.php. В ней вам необходимо установить правила исключения для ошибок: ... правила общественные функции() \t { \t \t возвращение массива ( массив ('имя пользователя', 'требуется Имя пользователя.' 'Требуется', 'сообщение' =>), массив ('пароль', 'требуется', ' message '=>' Требуется пароль. '), \t \t); \t} – Mundo

0

Проверка Ajax требует некоторой осторожности. Проверьте ответ на консоль для вызова ajax. При проверке ajax вывод вызова ajax должен быть чистым json. В случае, если валидация ajax из виджета может включать некоторый html с ответом на вызов ajax.

взгляните на http://www.yiiframework.com/forum/index.php/topic/12222-ajax-validation-in-widget-does-not-work/ надеюсь, что это может вам помочь.