Arya
Arya

Reputation: 504

Ajax is not working in yii

In my Yii web application, any type of Ajax call like Ajax validation, Ajax for dependent dropdown etc.... Is not working.

My codes are, In my form page:

<?php
                            $form = $this->beginWidget('CActiveForm', array(
                                'id' => 'workdetails-form',
                                'enableClientValidation' => true,
                                'clientOptions' => array(
                                    'validateOnChange' => true,
                                    'validateOnSubmit' => true,
                                ),
                                // Please note: When you enable ajax validation, make sure the corresponding
                                // controller action is handling ajax validation correctly.
                                // There is a call to performAjaxValidation() commented in generated controller code.
                                // See class documentation of CActiveForm for details on this.
                                'enableAjaxValidation' => true,
                                'htmlOptions' => array('enctype' => 'multipart/form-data'),
                            ));
                            ?>

in controller:

 public function actionCreate() {
    $model = new Workdetails;

    // Uncomment the following line if AJAX validation is needed
    $this->performAjaxValidation($model);

    if (isset($_POST['Workdetails'])) {
        $model->attributes = $_POST['Workdetails'];
        if ($model->validate()) {
            if ($model->save()) {
                $this->redirect(array('create'));
            }
        }
    }

    $this->render('create', array(
        'model' => $model,
    ));
}

For dependant dropdown:

<div class="form-group col-sm-6">
                                <?php echo $form->label($model, 'designationid', array('class' => 'req')); ?>
                                <?php
                                $designation = CHtml::listData(Designation::model()->findAll(), 'designationid', 'designation_name');
                                echo $form->dropDownList($model, 'designationid', $designation, array(
                                    'class' => 'form-control',
                                    'prompt' => 'Please Select',
                                    'ajax' => array(
                                        'type' => 'POST',
                                        'url' => $this->createUrl('workdetails/Fetchemployee'), // here for a specific item, there should be different URL
                                        'update' => '#' . CHtml::activeId($model, 'employeeid'), // here for a specific item, there should be different update
                              'data'=>array('designationid'=>'js:this.value'),
                                        )));
                                ?>

                                <?php echo $form->error($model, 'designationid', array('class' => 'school_val_error')); ?>
                            </div>

How to solve this... Please help me..

Upvotes: 0

Views: 1188

Answers (1)

chapskev
chapskev

Reputation: 982

Arya I had the same problem with Yii1 and i gave up using yii-ajax validation cause i could not find a way to fix it. First make sure you have initialize/ register Yii-js file these are

yiiactiveform and yii.js

If you don't have these files on your project, it means you have not registered them. To register the core JS file proceed with this config in your main.

'clientScript' => array(
            'scriptMap' => array(
                'jquery.js' => true,
                'jquery.min.js' => true,
            ),
        ),

or if that doesn't work use this on your main view in the header section.

 Yii::app()->clientScript->registerCoreScript('jquery');

You can also add it to your base controller which is at components/Controller.php

public function init() {
     parent::init();
    Yii::app()->clientScript->registerCoreScript('jquery');
}

On your view have this when creating your forms. It will help in placing the error messages. to your elements

<?php
            $form = $this->beginWidget('CActiveForm', array(
                'id' => 'patient-registration-form',
                'enableClientValidation' => True,
                'enableAjaxValidation' => FALSE,
                'clientOptions' => array(
                    'validateOnSubmit' => true,
                    'afterValidate' => 'js:function(form, data, hasError) {
                  if(hasError) {
                      for(var i in data) $("#"+i).parent().addClass("has-error");
                      return false;
                  }
                  else {
                      form.children().removeClass("has-error");
                      return true;
                  }
              }',
                    'afterValidateAttribute' => 'js:function(form, attribute, data, hasError) {

                  if(hasError) $("#"+attribute.id).parent().addClass("has-error");
                      else $("#"+attribute.id).parent().removeClass("has-error");
                      $("#"+attribute.id).parent().addClass("has-success");
              }'
                ),
                'htmlOptions' => array(
                    'class' => 'form-horizontal form-bordered form-row-stripped',
                ),
            ));
            ?>

alternatively use Yii2 it has fixed alot of stufff and if you are loading the current page with ajax you need to render the the whole page including the js file again. since when you use renderPartial it doesn't initalize the js files hence no js scripts will work, including validation.

Upvotes: 1

Related Questions