yii2でドロップダウンリストを作成するにはどうすればよいですか?


85

どのように作るためdropdownyii2使用activeformしてモデルを?ですべての方法が変更されたのでyii2、新しい方法ではどのように行われますか?


この質問は編集されていますか?はいの場合、最初の質問は何でしたか。
kshitiz 2014年

@Dency GBIは、これに似た私の別の質問に対する答えを探しています。あなたがそれを見ることができますか?ここにリンク
Mohan Prasad 2016

回答:


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は、Yii1.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 2015年

@AndrewPK:これをどのように行うかについての例を教えてください。おそらくコントローラーから渡されたのでしょうか?
almcnicoll 2015

@AndrewPKなぜですか?ウィジェットのようなもので、ビュー内のデータをフェッチでき、アンチパターンではありません。ただし、dbなどで何かを作成するクエリを作成することはできません
Auine

2
@Auine独自のパターンを作成しましたか?mvc、mvvmなどはすべて、関心の分離について説明しています。ビューは、与えられたデータの表示のみに関係する必要があります-クエリやGETなどを実行するべきではありません。これらのパターンのいずれかに固執したくない場合は、それもクールです-しかし、それは物事をより困難にします将来、さまざまなプラットフォームをサポートするには、ビューを交換する必要があります。上記で作成者が提供した編集済みの回答は、MVCのより理想的なソリューションです。コントローラーにfind()を設定し、データをビューレンダリングに渡します。
AndrewPK 2016年

93

あなたはすでにあなたの答えを見つけたようですが、あなたがアクティブなフォームについて言及したので、それがほんの少しだけ異なっていても、私はもう1つ貢献します。

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

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

    ActiveForm::end();
?>

@DencyGBが最も単純で、唯一の解決策は、最初の選択フィールド名を指定し.on('change')、jqueryでイベントを操作して、最初の選択に基づいて2番目のフィールドにデータを入力することだと思います。
Arman P.

自動的に表示されるリストから通常の番号を削除したい。
Mohammad Aghayari 2016年

56

上記のいくつかの良い解決策があります、そして私のものはちょうど2つの組み合わせです(私は解決策を探してここに来ました)。

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

繰り返しになりますが、完全なクレジット:@ SarvarNishonboyev'sと@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) ;
?>

アクティブなフォームではなく、dbテーブルのデータ

<?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; 、ヘルパーを使用できるように書き込む必要があります。
ゴーゴリ2015

5

ActiveFormちょうど使用:

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

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コードを保存し、次のように必要に応じてDBからすべてを戻します。

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

0

Html :: activeDropDownList($ model、 'id'、ArrayHelper :: map(AttendanceLabel :: find()-> all()、 'id'、 'label_name')、['prompt' => 'Attendance Status']) ;


-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();?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.