我想从单一记录制作下拉列表,我有两个这样的表:
来自prodi_pilihan_1_id
表的列prodi_pilihan_2_id
和prodi_penerima
引用。
我想要对列prodi_pilihan_1_id
和prodi_pilihan_2_id
进行下拉列表,但选项文本来自prodi_penerima
nama_prodi_penerima
,因此下拉列表如下:
<select>
<option value= '2'> BBB </option>
<option value= '4'> DDD </option>
</select>
从How to make dropdown in Yii2 from one record建议,我创建了这样的控制器:
$model4 = Pendaftar::find()
->select(['pro1.id_prodi_penerima as id_prodi_pilihan_1','pro1.nama_prodi_penerima as prodi_pilihan_1','pro2.id_prodi_penerima as id_prodi_pilihan_2','pro2.nama_prodi_penerima as prodi_pilihan_2'])
->from('pendaftar')
->leftJoin('prodi_penerima as pro1', 'pro1.id_prodi_penerima=pendaftar.prodi_pilihan_1')
->leftJoin('prodi_penerima as pro2', 'pro2.id_prodi_penerima=pendaftar.prodi_pilihan_2')
->andWhere(['=','id_user_pendaftar',$id])
->asArray()
->One();
$rows=\yii\helpers\ArrayHelper::map(array_filter([$model4['prodi_pilihan_1'],$model4['prodi_pilihan_2']]),function($item){
return $item;
},function($item){
return $item;
});
//return $this->render('lulus_ujian', ['rows' => $rows]);
return $this->renderAjax('lulus_ujian', [
'model' => $this->findModel($id),
'rows' => $rows,
]);
我将其渲染到视图中然后进入表单,表单如下:
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'status_lulus_tes_pendaftar')->dropDownList([ 'yes' => 'Yes', 'no' => 'No', ], ['prompt' => '']) ?>
<?= $form->field($model, 'prodi_lulus')->dropDownList($rows, ['prompt' => '']) ?>
<?= $form->field($model, 'ket_lulus_ujian')->textarea(['rows' => '6']) ?>
<div class="form-group">
<?= Html::submitButton('Save', ['class' => 'btn btn-danger']) ?>
</div>
<?php ActiveForm::end(); ?>
下拉列表正常,但值和选项具有相同的值:
<select>
<option value= 'BBB'> BBB </option>
<option value= 'DDD'> DDD </option>
</select>
我希望保存选项值为id_prodi_penerima
的模型。
我必须这样做,所以选项值是2和4,如下所示:
<select>
<option value= '2'> BBB </option>
<option value= '4'> DDD </option>
</select>
答案 0 :(得分:1)
我认为首先你必须检查你使用$rows
变量收到的内容。执行变量转储并检查您的$rows
变量是否包含如下数据(假设您只需要2对)。
array(2) { ["2"]=> string(3) "BBB" ["4"]=> string(3) "DDD" }
否则,您必须使用上述格式传递一个新数组,以在下拉列表中呈现预期结果。
答案 1 :(得分:1)
在您使用$model4 = Pendaftar::find()
->select([
'pro1.id_prodi_penerima as id_prodi_pilihan_1',
'pro1.nama_prodi_penerima as prodi_pilihan_1',
'pro2.id_prodi_penerima as id_prodi_pilihan_2',
'pro2.nama_prodi_penerima as prodi_pilihan_2'
])
->from('pendaftar')
->leftJoin('prodi_penerima as pro1', 'pro1.id_prodi_penerima=pendaftar.prodi_pilihan_1')
->leftJoin('prodi_penerima as pro2', 'pro2.id_prodi_penerima=pendaftar.prodi_pilihan_2')
->andWhere(['=', 'id_user_pendaftar', $id])
->asArray()
->one();
$rows = [
$model4['id_prodi_pilihan_1'] => $model4['prodi_pilihan_1'],
$model4['id_prodi_pilihan_2'] => $model4['prodi_pilihan_2'],
];
return $this->renderAjax('lulus_ujian', [
'model' => $this->findModel($id),
'rows' => $rows,
]);
的情况下没有任何意义,因为您只需要处理一条记录,并且您知道所需数组的确切结构。所以直接从查询结果中构建它:
st::vector<int> v2(v1.size());
std::iota(v2.begin(), v2.end(), 0);
std::sort(v2.begin(), v2.end(),
[&](int pos1, int pos2) {
return std::tie(v1[pos1], pos1) < std::tie(v1[pos2], pos2);
}
);
std::transform(v2.begin(), v2.end(), v2.begin(),
[&](int pos) { return index[pos]; }
);