如何在Yii2中制作下拉列表?

86
如何使用activeform和模型在yii2中制作一个dropdown?由于所有方法在yii2中都已更改,因此请告知新的方法。

这个问题被编辑过吗?如果是,最初的问题是什么? - Kshitiz
@Dency G B,我正在寻找与此类似的另一个问题的答案。你能否看一下它?链接在这里 - Mohan Prasad
13个回答

129

就像这样

<?php
use yii\helpers\ArrayHelper;
use backend\models\Standard;
?>

<?= Html::activeDropDownList($model, 's_id',
      ArrayHelper::map(Standard::find()->all(), 's_id', 'name')) ?>

在Yii2中,ArrayHelper替换了Yii 1.1中的CHtml列表数据。[请从您的控制器加载数组数据]

编辑

从您的控制器加载数据。

控制器

$items = ArrayHelper::map(Standard::find()->all(), 's_id', 'name');
...
return $this->render('your_view',['model'=>$model, 'items'=>$items]);

在视图中

<?= Html::activeDropDownList($model, 's_id',$items) ?>

1
提醒一下,Yii2使用命名空间,因此解决方案中有“使用命名空间”。我花了一段时间才想明白它们的作用。 - johnsnails
11
请不要直接按照这个例子,在你的视图中编写数据获取/构建逻辑! - AndrewPK
@AndrewPK:你能提供一个示例,说明你希望如何完成吗?预计是通过控制器传递的吗? - almcnicoll
4
@Auine,你是否创建了自己的设计模式?MVC、MVVM等都描述了关注点分离。视图应只关注显示它所接收到的数据-不应该执行查询、获取等操作。如果你不想遵循这些模式也没问题,但是当未来需要为不同平台支持切换视图时,这会使事情变得更加困难。作者提供的编辑答案是MVC中更理想的解决方案-在控制器中使用find()并将数据传递给视图渲染。 - AndrewPK
多年来,我曾像你一样教条地思考(和编码)。但是,使用基于Yii的Craft CMS后,我发现有时查询更清晰地从视图中完成。例如:如果您有一个小部件显示即将到来的活动,并且该小部件需要在站点的多个区域中显示(主页、新闻区域、活动区域等),则不必在每个控制器中运行该查询,只需在该视图中编写一次即可。如果停止在某个区域显示小部件,则查询会自动被抑制,否则往往会被遗忘。 - Simon East
显示剩余4条评论

100

看起来你已经找到了答案,但是因为你提到了主动语态,我会再做出一点贡献,即使它只有微小的差别。

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

    echo $form->field($model, 'attribute')
        ->dropDownList(
            $items,           // Flat array ('id'=>'label')
            ['prompt'=>'']    // options
        );

    ActiveForm::end();
?>

@DencyGB 最简单的解决方案,我认为是给第一个选择字段命名,并在jquery中操作.on('change')事件,根据第一个选择的选项填充第二个字段。 - Arman P.
我想从自动显示的列表中删除普通数字。 - Mohammad Aghayari

57

上面有一些好的解决方案,我的解决方法只是两个方案的组合(我来这里是为了寻找解决方案)。

@Sarvar Nishonboyev的解决方案很好,因为它保留了表单输入标签和错误信息帮助块的创建。

我选择了:

<?php
use yii\helpers\ArrayHelper;
use app\models\Product;
?>
<?=
$form->field($model, 'parent_id')
     ->dropDownList(
            ArrayHelper::map(Product::find()->asArray()->all(), 'parent_id', 'name')
            )
?>

再次致谢:@Sarvar Nishonboyev和@ippi


22

看起来这个问题有很多好的答案,所以我会尝试给出一个详细的回答。

主动形式和硬编码数据

<?php
    echo $form->field($model, 'name')->dropDownList(['1' => 'Yes', '0' => 'No'],['prompt'=>'Select Option']);
?>
或者
<?php
    $a= ['1' => 'Yes', '0' => 'No'];
    echo $form->field($model, 'name')->dropDownList($a,['prompt'=>'Select Option']);
?>

活动表单和数据库表中的数据

我们将使用ArrayHelper,因此首先通过以下方式将其添加到名称空间中

<?php
    use yii\helpers\ArrayHelper;
?>

ArrayHelper有许多有用的函数,可以用来处理数组。 map()是我们要在这里使用的一个函数。 该函数用于从多维数组或对象数组中创建一个映射(键值对)。

<?php
    echo $form->field($model, 'name')->dropDownList(ArrayHelper::map(User::find()->all(),'id','username'),['prompt'=>'Select User']);
?>

不是活动表单的一部分

<?php
    echo Html::activeDropDownList($model, 'filed_name',['1' => 'Yes', '0' => 'No']) ;
?>
或者
<?php
    $a= ['1' => 'Yes', '0' => 'No'];
    echo Html::activeDropDownList($model, 'filed_name',$a) ;
?>

不是一个活动表单,而是来自数据库表的数据

<?php
    echo Html::activeDropDownList($model, 'filed_name',ArrayHelper::map(User::find()->all(),'id','username'),['prompt'=>'Select User']);
?>

15

看看这个:

use yii\helpers\ArrayHelper; // load classes
use app\models\Course;
    .....
$dataList=ArrayHelper::map(Course::find()->asArray()->all(), 'id', 'name');
<?=$form->field($model, 'center_id')->dropDownList($dataList, 
         ['prompt'=>'-Choose a Course-']) ?>

11

也许我错了,但我认为从视图中进行SQL查询是一个不好的想法。

这是我的方式。

在控制器中。

$model = new SomeModel();
$items=ArrayHelper::map(TableName::find()->all(),'id','name');


return $this->render('view',['model'=>$model, 'items'=>$items])

同时在视图中

<?= Html::activeDropDownList($model, 'item_id',$items) ?>

或者使用ActiveForm

<?php $form = ActiveForm::begin(); ?>
 <?= $form->field($model, 'item_id')->dropDownList($items) ?>
<?php ActiveForm::end(); ?>

访问视图时出现“undefined variable items”的错误。我在控制器中添加了以下代码:$this->view->params['items'] = $items; ,然后在我的视图页面中使用了:<?php echo $form->field($model, 'plan_type', ['options' => ['class' => ' input select']])->dropdownList( $this->params['items'],['prompt'=>'Select Plan','class' => 'selectpicker', 'data-live-search' => 'true','label'=>false]);?> - RN Kushwaha
我有同样的问题,在我的视图中变量$items为空。 - MeV

8
<?= $form->field($model, 'attribute_name')->dropDownList(
         ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
        ['prompt' => 'Select']
) ?>

这将有助于你...不要忘记在头部使用class文件。


1
在视图文件的顶部,需要编写 use yii\helpers\ArrayHelper; 以便使用助手。 - Gogol

5

本文涉及生成数据,因此最好从模型中进行。想象一下,如果您想要更改下拉框中显示数据的方式,比如添加一个姓氏之类的信息。您将不得不查找每个下拉框并更改arrayHelper。我在我的模型中使用一个函数来返回下拉菜单的数据,这样我就不必在视图中重复代码。它还具有一个优点,即我可以在此处指定筛选器,并将其应用于从此模型创建的每个下拉菜单;

/* Model Standard.php */

public function getDropdown(){
      return ArrayHelper::map(self::find()->all(), 's_id', 'name'));
}

您可以在视图文件中像这样使用它;
echo $form->field($model, 'attribute')
        ->dropDownList(
            $model->dropDown
        );

5
ActiveForm中,只需使用以下内容:
<?=
    $form->field($model, 'state_id')
         ->dropDownList(['prompt' => '---- Select State ----'])
         ->label('State')
?>

1
如果您已经浏览到列表底部,可以保存一些PHP代码,并且可以像这样从数据库中按需获取所有内容:
 $items = Standard::find()->select(['name'])->indexBy('s_id')->column();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接