yii2自动填充相关字段基于另一个字段

时间:2017-01-11 13:34:21

标签: yii2 autofill

我有一个名为employee_name的字段,根据此字段值,我想自动填充另一个字段employee_id。我已经搜索过了,我找到this回答,并尝试在我的表单上执行此操作,但我得到了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>

2 个答案:

答案 0 :(得分:1)

根据您的自动填充数据,您已拥有employee_id。所以不需要发出ajax请求来获取员工ID。

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);
               }")
          ],
]);?>

答案 1 :(得分:0)

如果我在你的位置我应该怎么做:

这里的观点:

<?= $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
    }
}

恢复: jquery函数获取员工姓名并发送给将在数据库中查找员工ID的控制器。然后发送带有默认值(员工ID)的输入文本作为响应,并在表单中加载此输入。