Yii2-下拉列表OnChange以显示其他模型属性

时间:2018-12-04 22:22:45

标签: yii2

我有这些模型类

型号:Subject

public function attributeLabels()
{
    return [
        'subject_id' =>Yii::t('app',  'ID'),
        'subject_title' => Yii::t('app', 'Subject Title'),
    ];
}

型号:Grouping

public function attributeLabels()
{
    return [
        'grouping_id' => Yii::t('app', 'Grouping ID'),
        'grouping_name' => Yii::t('app', 'Grouping Name'),
    ];
}

型号:SubjectGrouping

public function attributeLabels()
{
    return [
        'subject_grouping_id' => 'Subject Grouping ID',
        'subject_grouping_grouping_id' => 'Subject Grouping Grouping ID',
        'subject_grouping_subject_id' => 'Subject Grouping Subject ID',
    ];
}

型号:Exam

public function attributeLabels()
{
    return [
        'exam_id' =>Yii::t('app',  'ID'),
        'exam_name' => Yii::t('app', 'Exam Name'),
    'exam_group_id' => Yii::t('app', 'Exam Group'),
    ];
}

模型:SubjectGrouping具有来自模型:Groupingsubject_grouping_grouping_id)和模型:Subjectsubject_grouping_subject_id)的外键

在型号:Exam中,exam_group_id与型号:subject_grouping_grouping_id中的SubjectGrouping相关。

控制器

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

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }
    if ($model->load(Yii::$app->request->post())) {

        $model->attributes = $_POST['Exam'];
        $model->save();
        return $this->redirect(['index']);
    } else {
        return $this->render(
            'create', [
                'model' => $model
            ]
        );
    }
}

查看

<div class="col-xs-12 col-sm-4 col-lg-4">
    <?=$form->field($model, 'exam_name')->textInput(['maxlength' => 50, 'placeholder' => 'Enter Exam Name'])?>
</div>

<div class="col-xs-12 col-sm-4 col-lg-4">
<?=$form->field($model, 'exam_group_id')->widget(
    Select2::classname(), [
        'data' => ArrayHelper::map(app\models\Grouping::find()->all(), 'grouping_id', 'grouping_name'),
        'language' => 'en',
        'options' => ['placeholder' => '--- Select Grouping ---'],
        'pluginOptions' => [
            'allowClear' => true
        ]
    ]
);
?>
</div>

Dropdownlist

从图中如何实现这些目标?

  1. exam_group_id的下拉列表为onChange时,使用模型SubjectGrouping和模型Subject之间的关系显示有关分组的主题列表。

  2. 其他字段,例如exam_name(textInput)和exam_group_id(Dropdownlist),应保存到模型Exam中。但是主题列表不应该保存。它仅用于显示目的。

我如何实现这些目标?

  

我在下拉列表中使用kartik\widgets\Select2

1 个答案:

答案 0 :(得分:0)

我已经通过Kartik扩展程序对州和国家/地区数据执行了类似的代码。

这是代码。

<?php
    //in view use this

    use kartik\widgets\DateTimePicker; // or kartik\select2\Select2
    use kartik\widgets\DepDrop;
    use kartik\widgets\Select2;
?>

<?php
    echo
    $form->field($model, 'country_id')->widget(
        Select2::className(),
        [
            'data' => \yii\helpers\ArrayHelper::map(common\models\Country::find()->all(), 'id', 'name'),
            'options' => [
                'id' => 'country_id',
                'prompt' => Yii::t('aspns', 'Select')
            ]
        ]
    );
?>
<?php
    echo
    $form->field($model, 'state_id')->widget(
        DepDrop::classname(),
        [
            'data' => !empty($model->state_id) ? \yii\helpers\ArrayHelper::map(common\models\State::find()->where(['country_id' => $model->country_id])->all(), 'id', 'name') : [],
            'options' => ['id' => 'state_id', 'placeholder' => Yii::t('aspns', 'Select')],
            'pluginOptions' => [
                'depends' => ['country_id'],
                'url' => Url::to(['//country/get-states'])
            ]
        ]
    )->label(Yii::t('aspns', 'State'));
?>

//在“控制器”部分,您需要执行此操作

 public function actionGetStates() {
    $out = [];
    if (isset($_POST['depdrop_parents'])) {
        $parents = $_POST['depdrop_parents'];
        if ($parents != null) {
            $country_id = (int)$parents[0];
            $out = State::find()->where(['country_id'=>$country_id])->select(['id', 'name'=>'name'])->asArray()->all();
            return Json::encode(['output'=>$out, 'selected'=>'']);

        }
    }
    return  Json::encode(['output'=>'', 'selected'=>'']);
}

根据您的要求更改代码。

谢谢