如何使用ArrayHelper在Yii2中制作下拉列表

时间:2018-06-10 01:13:52

标签: yii2

我想从单一记录制作下拉列表,我有两个这样的表:

the tables

来自prodi_pilihan_1_id表的

prodi_pilihan_2_idprodi_penerima 引用

我想要对列prodi_pilihan_1_idprodi_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>

2 个答案:

答案 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]; }
);