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

Posted

技术标签:

【中文标题】如何在yii2中制作下拉列表?【英文标题】:How to make a drop down list in yii2? 【发布时间】:2014-03-01 09:36:18 【问题描述】:

如何使用activeform 和模型在yii2 中创建dropdown?既然yii2里面的方法都变了,那么新的怎么做呢?

【问题讨论】:

这个问题是否已编辑。如果是,最初的问题是什么。 @Dency G B 我正在寻找与此类似的另一个问题的答案。你可以看看吗? Link here 【参考方案1】:

好像

<?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) ?>

【讨论】:

提醒 Yii2 使用命名空间,因此解决方案中的“使用命名空间”。我花了一些时间思考它们的用途。 请不要直接按照这个例子,在你的视图中有数据获取/构建逻辑! @AndrewPK:你能提供一个你希望如何完成的例子吗?大概是从控制器传递过来的? @AndrewPK 为什么?它就像小部件,您可以在视图中获取数据,它不是反模式。但是您不能创建在 db 中创建某些东西的查询等等 @Auine 您是否创建了自己的模式? mvc、mvvm 等都描述了关注点分离。视图应该只关心显示它所提供的数据——它不应该执行查询、GET 等。如果你不想遵守其中一种模式,那也很酷——但它会让事情变得更加困难您需要换出视图以支持将来的不同平台。上面作者提供的编辑答案是 MVC 中更理想的解决方案 - 在控制器中使用 find() 并将数据传递给视图渲染。【参考方案2】:

您似乎已经找到了答案,但既然您提到了活动表格,我将再提供一个,即使它只是略有不同。

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

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

    ActiveForm::end();
?>

【讨论】:

@DencyGB 最简单,我认为唯一的解决方案是提供第一个选择字段名称并在 jquery 中操作.on('change') 事件以根据第一个选择填充第二个字段。 我想从自动显示的列表中删除普通号码。【参考方案3】:

以下也可以。如果要附加前置图标。这会很有帮助。

<?php $form = ActiveForm::begin();    
   echo $form->field($model, 'field')->begin();
     echo Html::activeLabel($model, 'field', ["class"=>"control-label col-md-4"]); ?>
       <div class="col-md-5">
          <?php echo Html::activeDropDownList($model, 'field', $array_list, ['class'=>'form-control']); ?>
          <p><i><small>Please select field</small></i>.</p>
          <?php echo Html::error($model, 'field', ['class'=>'help-block']); ?>
       </div>
   <?php echo $form->field($model, 'field')->end(); 
ActiveForm::end();?>

【讨论】:

【参考方案4】:

看看这个:

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-']) ?>

【讨论】:

【参考方案5】:

上面有一些很好的解决方案,我的只是两者的结合(我是来这里寻找解决方案的)。

@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's 和 @ippi

【讨论】:

【参考方案6】:

ActiveForm 中使用:

<?=
    $form->field($model, 'state_id')
         ->dropDownList(['prompt' => '---- Select State ----'])
         ->label('State')
?>

【讨论】:

【参考方案7】:
<?= $form->field($model, 'attribute_name')->dropDownList(
         ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
        ['prompt' => 'Select']
) ?>

这将帮助你...不要忘记在标题中使用类文件。

【讨论】:

在视图文件的顶部,需要写use yii\helpers\ArrayHelper;才能使用助手。【参考方案8】:

也许我错了,但我认为从视图中查询 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(); ?>

【讨论】:

它在访问视图时表示未定义的变量项。我用这种方式将代码添加到控制器$this-&gt;view-&gt;params['items'] = $items; 并在我的视图页面&lt;?php echo $form-&gt;field($model, 'plan_type', ['options' =&gt; ['class' =&gt; ' input select']])-&gt;dropdownList( $this-&gt;params['items'],['prompt'=&gt;'Select Plan','class' =&gt; 'selectpicker', 'data-live-search' =&gt; 'true','label'=&gt;false]);?&gt; 我也有同样的问题,变量 $items 在我看来是空的【参考方案9】:

看来这个问题有很多不错的答案。所以我会尽量给出详细的答案

活动表格和硬编码数据

<?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) ;
?>

不是活动表单,而是来自 db 表的数据

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

【讨论】:

【参考方案10】:

这是关于生成数据的,因此更适合从模型中完成。想象一下,如果您想更改数据在下拉框中的显示方式,例如添加姓氏或其他内容。您必须找到每个下拉框并更改arrayHelper。我在模型中使用一个函数来返回下拉数据,因此我不必在视图中重复代码。它还有一个优点是我可以在此处指定过滤器并将它们应用于从该模型创建的每个下拉列表;

/* Model Standard.php */

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

您可以像这样在视图文件中使用它;

echo $form->field($model, 'attribute')
        ->dropDownList(
            $model->dropDown
        );

【讨论】:

【参考方案11】:

如果您排在列表的底部。保存一些 php 代码,然后根据需要从数据库中取回所有内容,如下所示:

 $items = Standard::find()->select(['name'])->indexBy('s_id')->column();

【讨论】:

【参考方案12】:

Html::activeDropDownList($model, 'id', ArrayHelper::map(AttendanceLabel::find()->all(), 'id', 'label_name'), ['prompt'=>'出勤状态']);

【讨论】:

【参考方案13】:
<?=$form->field($model, 'category_id')->dropdownList(
    \common\models\Category::find()
        ->select(['name', 'id'])
        ->indexBy('id')
        ->column(),
    ['prompt'=>'select category']
)?>

【讨论】:

以上是关于如何在yii2中制作下拉列表?的主要内容,如果未能解决你的问题,请参考以下文章

Yii2:Gridview过滤器中的kartik\Select2下拉列表

YII2 广告 html 标签到下拉列表

yii2.0下拉列表的使用

如何使用 jQuery 为表格制作下拉列表过滤器?

如何在 Laravel 中制作简单的动态下拉列表?

GridView中的Yii2下拉列表筛选器