yii2 автозаполнение связанного поля на основе другого поля

У меня есть поле с именем employee_name, и в зависимости от значения этого поля я хочу автоматически заполнить другое поле employee_id. Я искал и нашел это answer и попытался реализовать это в своей форме, но я получаю Error in ajax request. Код jquery в моей форме

$('#emp').focusout(function() {
        empName = this.value;
        if ( empName != '' || empName != null ) {
            $('#depcustomer-employee_name').val(empName);
        }
        $.ajax({
            url: '".yii\helpers\Url::toRoute("deposit/employeeid")."',
            dataType: 'json',
            method: 'GET',
            data: {name: $(this).val()},
            success: function (data, textStatus, jqXHR) {
                $('#depcustomer-employee_id').val(data.id);
            },
            beforeSend: function (xhr) {
                alert('loading!');
            },
            error: function (jqXHR, textStatus, errorThrown) {
                console.log('An error occured!');
                alert('Error in ajax request');
            }
        });
    });

Имя моего контроллера — Deposit, а код моего контроллера —

public function actionEmployeeid($name){
$model= app\modules\settings\models\DepEmployee::findOne(['employee_name'=>$name]);
return \yii\helpers\Json::encode([
    'id'=>$model->employee_id
]); 

Что может быть возможной причиной того, что мой код ajax не работает?

Моя форма довольно большая. Вот часть записи поля сотрудника

<div class="row">
                <div class="col-md-6">               
                 <?= $form->field($model, 'employee_id')->textInput(['maxlength' => true]) ?>
                </div> 
                <div class="col-md-6">  
                    <label for='emp'>Employee Name</label>
                    <?= Html::activeHiddenInput($model, 'employee_name')?>

                    <?php
                        echo AutoComplete::widget([
                            'name' => 'employee_name',
                            'id' => 'emp',
                            'clientOptions' => [
                                'source' => $dataEmp,
                                'autoFill'=>true,
                                'minLength'=>'2',
                                'select' => new JsExpression("function( event, ui ) {
                                    $('#depcustomer-name').val(ui.item.id);
                                }")
                            ],
                         ]);
                    ?>      
                </div>
            </div>

person gojiraki    schedule 11.01.2017    source источник
comment
Как вы ожидаете, что jquery узнает об этом: yii\helpers\Url::toRoute("deposit/employeeid")? Опубликуйте свою форму, чтобы получить дополнительную помощь, пожалуйста.   -  person Francis Ngueukam    schedule 11.01.2017
comment
@stfsngue Итак, должен ли я заменить его абсолютным URL-адресом, например http://localhost/testingDeposit/backend/web/index.php?r=deposit%2Fdeposit%2Femployeeid   -  person gojiraki    schedule 11.01.2017
comment
Попробуйте этот ответ вниз.   -  person Francis Ngueukam    schedule 11.01.2017
comment
показать $dataEmp содержание.   -  person Insane Skull    schedule 12.01.2017
comment
@InsaneSkull Здесь <?php $dataEmp = DepEmployee::find() ->select(['employee_name as value', 'employee_name as label','employee_id as id']) ->asArray() ->all(); ?>   -  person gojiraki    schedule 12.01.2017
comment
@InsaneSkull Вот сгенерированный HTML <input id="emp" class="ui-autocomplete-input form-control" name="employee_name" autocomplete="off" type="text">   -  person gojiraki    schedule 12.01.2017


Ответы (2)


Согласно вашим данным автозаполнения у вас уже есть employee_id. Поэтому нет необходимости делать запрос ajax для получения идентификатора сотрудника.

Модель DepEmployee

public static function getEmpData()
{
    $dataEmp = DepEmployee::find()
       ->select(['employee_name as value', 'employee_name as label','employee_id as id'])
       ->asArray()
       ->all();

    return $dataEmp;
}

_form

<?= AutoComplete::widget([
         'name' => 'employee_name',
         'id' => 'emp',
         'clientOptions' => [
              'source' => DepEmployee::getEmpData(),
              'autoFill'=>true,
              'minLength'=>'2',
               'select' => new JsExpression("function( event, ui ) {
                   $('#depcustomer-name').val(ui.item.id);
                   $('#depcustomer-employee_id').val(ui.item.id);
               }")
          ],
]);?>
person Insane Skull    schedule 12.01.2017

Что мне делать, если бы я был у вас дома:

Здесь вид:

<?= $form->field($model, 'employeeName')->textInput([
    // I use onfocusout instead of focusout
    'onfocusout' => '
        $.post("generateemployeeid?name="+$(this).val(), function(data) {
            $("#employee_id_container").html(data);
        });
    ',
]) ?>

<div id="employee_id_container"></div> // <- I will autofill here

Теперь вот функция, которая будет заполнять ввод ID: (должна быть в вашем контроллере)

public function actionGenerateemployeeid($name) {
    $employeeModel = DepEmployee::find()
        ->where(['employee_name' => $name])
        ->one();

    if($employeeModel !== NULL) {  
        echo  'Employee ID: <input type="text" name="EmployeeID" value="'.$employeeModel->employee_id.'" readonly><br>';
    }
    else {
        // error 404
    }
}

Resume: функция jquery берет имя сотрудника и отправляет его контроллеру, который будет искать идентификатор сотрудника в базе данных. Затем отправьте входной текст со значением по умолчанию (идентификатор сотрудника) в качестве ответа и загрузите этот ввод в форму.

person Francis Ngueukam    schedule 11.01.2017