如何在yii2中创建一个下拉列表?


85

如何使一个dropdownyii2使用activeform和模式?由于所有方法都已更改yii2,因此如何在新方法中完成?


这个问题被编辑了吗?如果是,最初的问题是什么。
Kshitiz 2014年

@Dency GBI正在寻找另一个与此类似的问题的答案。您可以看看吗?此处链接
Mohan Prasad

Answers:


122

它像是

<?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 2014年

11
请不要直接遵循此示例,并在您的视图中使用数据获取/构建逻辑!
AndrewPK

@AndrewPK:您能否提供一个示例,说明您希望如何完成此操作?从控制器通过大概?
almcnicoll 2015年

@AndrewPK为什么?就像小部件一样,您可以在视图中获取数据,但它不是反模式。但是您不能创建在数据库中创建查询的查询,依此类推
Auine

2
@Auine您是否创建了自己的模式?mvc,mvvm等都描述了关注点分离。视图仅应与显示给定的数据有关,而不必执行查询,GET等。如果您不希望遵循这些模式之一,那也很酷-但在遇到这种情况时,事情会变得更加困难您将来需要交换视图以支持不同的平台。上面作者提供的经过编辑的答案是MVC中更理想的解决方案-在控制器中具有find()并将数据传递到视图渲染。
AndrewPK '16

93

看来您已经找到了答案,但是自从您提到有效表格以来,我将再提供一份,即使只是略有不同。

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

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

    ActiveForm::end();
?>

@DencyGB是最简单的方法,我认为唯一的解决方案是给第一个选择字段名称并.on('change')在jquery中操纵事件以根据第一个选择填充第二个字段。
Arman P. 2014年

我想从自动显示的列表中删除普通号码。
Mohammad Aghayari

56

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

@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


21

看来这个问题有很多好的答案。所以我将尝试给出详细的答案。

活动表格和硬编码数据

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

10

也许我错了,但我认为从角度来看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->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 2015年

我有同样的问题,我认为变量$ items为空
MeV

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

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


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

1

如果您将其置于列表的底部。保存一些php代码,然后根据需要将所有内容从数据库中带回来:

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


-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();?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.