【问题标题】:how to automatically enter data from form one to another form yii2yii2如何自动将数据从一个表格输入到另一个表格
【发布时间】:2019-05-02 15:36:28
【问题描述】:

我有一个 MySQL 表和模型 resume,其中包含字段

'resume_id', 'lao', 'persen', 'eom', 'tgt_perpetugas' and 'tgt_pergeseran'

我还有另一个表/模型resumes,其中也包含

'resumes_id', 'lao', 'persen', 'eom', 'tgt_perpetugas' and 'tgt_pergeseran'

假设resume 表已经填满了

'resume_id', 'lao', 'persen', 'eom', 'tgt_perpetugas','tgt_pergeseran'

当我在resumes 表单中输入数据时,当我通过与resume 表相关的下拉字段选择'lao' 时,我想要相关的

'persen', 'eom', 'tgt_perpetugas' and 'tgt_pergeseran'

要自动填充的字段。我的reference 但“ajax 请求错误”。 yii2如何自动将数据从一个表格输入到另一个表格 如何解决错误或有建议?

我的“简历”的 _form.php 看起来像这样

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\select2\Select2;
use yii\helpers\ArrayHelper;
use app\models\Resume;

    $routeAjax = \yii\helpers\Url::toRoute("resume/resumes");

$js=<<<JS
function getRelatedFields(lao_id){
    $.ajax({
        url: '$routeAjax',
        dataType: 'json',
        method: 'GET',
        data: {id: lao_id},
        success: function (data, textStatus, jqXHR) {
             $('#resumes-persen').val(data.persen);
             $('#resumes-eom').val(data.eom);
             $('#resumes-tgt_perpetugas').val(data.tgt_perpetugas);
             $('#resumes-tgt_pergeseran').val(data.tgt_pergeseran);
        },
        beforeSend: function (xhr) {
            alert('loading!');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log('An error occured!');
            alert('Error in ajax request'+textStatus'\n'+errorThrown);
        }
    });
}

JS;
$this->registerJs($js, \yii\web\View::POS_READY); 


?>

<div class="resumes-form">

    <?php $form = ActiveForm::begin(); ?>


    <?= $form->field($model, 'lao')->widget(Select2::classname(), [
    'data' => ArrayHelper::map(Resume::find()->all(),'lao','lao'),
    'language' => 'en',
    'options' => ['placeholder' => 'Pilih LAO'],
    'pluginOptions' => [
        'allowClear' => true
    ],
    'pluginEvents'=>[
        'select2:select' => 'function(e){getRelatedFields(e.params.data.id);}',
    ]
]); ?>

    <?= $form->field($model, 'persen')->textInput(['type' => 'number','maxlength' => true, 'readOnly'=>false])->label('Perpetugas %') ?>
    <?= $form->field($model, 'eom')->textInput(['maxlength' => true])->label('EOM') ?>

    <?= $form->field($model, 'tgt_perpetugas')->textInput(['maxlength' => true, 'readOnly'=>true])->label('Target Perpetugas') ?>

    <?= $form->field($model, 'tgt_pergeseran')->textInput(['maxlength' => true, 'readOnly'=>true])->label('Target Pergeseran') ?>

    <center>
    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>
    </center>

    <?php ActiveForm::end(); ?>

</div>

在 ResumesController 中,我添加了。这个:

public function actionResumes($id){
    // you may need to check whether the entered ID is valid or not
    $model =  \app\models\Resume::findOne(['lao'=>$id]);
    return \yii\helpers\Json::encode([
            'eom'=>$model->eom,
            'persen'=>$model->persen,
            'tgt_pergeseran'=>$model->tgt_pergeseran,
            'tgt_perpetugas'=>$model->tgt_perpetugas
        ]);
    }

【问题讨论】:

    标签: yii yii2 yii2-advanced-app autofill


    【解决方案1】:

    我的理解是你想要这些字段

    'persen', 'eom', 'tgt_perpetugas', 'tgt_pergeseran'

    针对保存在Resume 模型中的lao 匹配Resumes 表单lao 字段中的下拉()。

    如果正确,那么首先您需要使用Select2 事件select2:select,而不是使用传统的onchange 事件。对您的 Select2 和视图顶部的脚本进行一些更改。

    将您的 select2 替换为以下内容

    <?= $form->field($model, 'lao')->widget(Select2::classname(), [
        'data' => ArrayHelper::map(Lao::find()->all(),'lao_id','lao_id'),
        'language' => 'en',
        'options' => ['placeholder' => 'Pilih LAO'],
        'pluginOptions' => [
            'allowClear' => true
        ],
        'pluginEvents'=>[
            'select2:select' => 'function(e){getRelatedFields(e.params.data.id);}',
        ]
    ]); ?>
    

    将视图顶部的脚本替换为以下内容

    $routeAjax = \yii\helpers\Url::toRoute("resume/resumes");
    
    $js=<<<JS
    function getRelatedFields(lao_id){
        $.ajax({
            url: '$routeAjax',
            dataType: 'json',
            method: 'GET',
            data: {id: lao_id},
            success: function (data, textStatus, jqXHR) {
                 $('#resumes-persen').val(data.persen);
                 $('#resumes-eom').val(data.eom);
                 $('#resumes-tgt_perpetugas').val(data.tgt_perpetugas);
                 $('#resumes-tgt_pergeseran').val(data.tgt_pergeseran);
            },
            beforeSend: function (xhr) {
                alert('loading!');
            },
            error: function (jqXHR, textStatus, errorThrown) {
                console.log('An error occured!');
                alert('Error in ajax request'+textStatus'\n'+errorThrown);
            }
        });
    }
    
    JS;
    $this->registerJs($js, \yii\web\View::POS_READY); 
    

    然后,当您在lao 下拉列表中选择任何选项时,您希望将类似字段从 Resume 模型填充到 Resumes ActiveForm .您应该在Resume 模型中获取老挝语,而不是在Resumes 模型中获取id

    所以用下面的替换你的操作

    public function actionResumes($id)
    {
        // you may need to check whether the entered ID is valid or not
        $model = \app\models\Resume::findOne(['lao' => $id]);
        return \yii\helpers\Json::encode([
            'eom' => $model->eom,
            'persen' => $model->persen,
            'tgt_pergeseran' => $model->tgt_pergeseran,
            'tgt_perpetugas' => $model->tgt_perpetugas
        ]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      相关资源
      最近更新 更多