Yii Framework: форма AJAX? - PullRequest
2 голосов
/ 10 июля 2011

Хорошо, мне нужна помощь с чем-то, что кажется довольно простым, но я просто не могу понять.

У меня есть страница в Yii, в которую я пытаюсь встроить форму AJAX. Давайте назовем страницу А. Форма принимает одно значение и должна проверить и сохранить ее в БД, если она в порядке.

Пока вот что я понял:

Форма находится в представлении _form.php, которое содержит CActiveForm и ajaxSubmitButton, которое выглядит следующим образом:

<?php echo CHtml::ajaxSubmitButton('submit', $this->createUrl('/site/something'), array('update'=>'#targetdiv'));?> 

Форма вызывается в представлении другого А следующим образом:

<?php echo $this->renderPartial('/site/_form', array('AModel'=>$model)); //Passing some info about A ?>

В действии контроллера что-то я делаю следующее:

if (Yii::app()->request->isAjaxRequest) {

  $model = new AJAXForm('submit');

  if (isset($_POST['AJAXForm'])) {

    $model->attributes = $_POST['AJAXForm'];

    if ($model->validate()) {
    //When data's valid, save to DB is working fine. This part is working perfectly.
    }
    else {
      //This is the part I'm confused about and that's not working

      /*Trying to render the form to get the error messages and summary displayed
      but nothing's showing */
      $this->renderPartial('/site/_form', array('AModel'=>$model));

      Yii::app()->end();

    }
  }
}

В Firebug я вижу, что при возникновении ошибки ответ снова содержит всю частично визуализированную форму. Однако targetdiv не обновляется с обновленной формой с сообщениями об ошибках.

У меня такое чувство, что я что-то не так делаю в actionController, но я не могу понять, что именно. Было бы полезно, если бы я мог также увидеть полный пример отправленной формы AJAX.

Спасибо!

Ответы [ 2 ]

1 голос
/ 28 октября 2012

$model->getErrors() выдаст вам все ошибки для всех атрибутов

http://www.yiiframework.com/doc/api/1.1/CModel#getErrors-detail

if ($model->validate()) {
  //When data's valid, save to DB is working fine. This part is working perfectly.
  }
else {
  $errors = $model->getErrors();
  echo $errors;

  Yii::app()->end();
}

И затем передаст это в параметр ajaxSubmitButton() ajax, согласно этому посту на Yiiфорум: http://www.yiichina.net/forum/index.php/topic/23236-extension-how-to-display-validation-errors-comming-from-ajax-validation/

'success'=>"function(html) {
   if (html.indexOf('{')==0) {
        var e = jQuery.parseJSON(html);
        jQuery.each(e, function(key, value) {
        jQuery('#'+key+'_em_').show().html(value.toString());
        jQuery('#'+key).addClass('clsError');
        jQuery('label[for='+key+']').addClass('clsError');
   });
}
0 голосов
/ 11 июля 2011

Попробуйте добавить 'dataType' к вашим атрибутам ajaxSubmitButton, например:

array('type' =>'POST',
    'update' => '#targetdiv',
    'dataType' => 'html',
),

вы можете попытаться сначала вернуть какой-то основной текст, чтобы проверить его - если вы просто пытаетесь отобразить сообщение об ошибке, вам может не понадобиться повторно отображать форму.

...