Làm thế nào để tạo danh sách thả xuống trong yii2?


85

Làm thế nào để thực hiện một dropdowntrong yii2cách sử dụng một activeformvà một mô hình? Vì tất cả các phương thức đã được thay đổi yii2, nó được thực hiện như thế nào trong phương thức mới?


Câu hỏi này đã được chỉnh sửa. Nếu có câu hỏi ban đầu là gì.
Kshitiz

@Dency GBTôi đang tìm câu trả lời cho một câu hỏi khác của tôi tương tự như thế này .. Bạn có thể xem qua được không ?? Liên kết ở đây
Mohan Prasad

Câu trả lời:


122

Nó giống như

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

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

ArrayHelper trong Yii2 thay thế dữ liệu danh sách CHtml trong Yii 1.1. [Vui lòng tải dữ liệu mảng từ bộ điều khiển của bạn]

BIÊN TẬP

Tải dữ liệu từ bộ điều khiển của bạn.

Bộ điều khiển

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

Đang xem

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

1
Nhắc nhở rằng Yii2 sử dụng không gian tên, do đó, "sử dụng không gian tên" trong giải pháp. Tôi đã mất một lúc để nghĩ xem chúng dùng để làm gì.
johnsnails

11
Vui lòng không trực tiếp làm theo ví dụ này và có logic tìm nạp / xây dựng dữ liệu trong chế độ xem của bạn!
AndrewPK

@AndrewPK: bạn có thể cung cấp ví dụ về cách bạn muốn việc này được thực hiện không? Có lẽ đi qua từ bộ điều khiển?
almcnicoll

@AndrewPK tại sao? nó giống như các widget, bạn có thể tìm nạp dữ liệu trong các chế độ xem của mình và nó không phải là phản mẫu. Nhưng bạn không thể tạo truy vấn tạo thứ gì đó trong db, v.v.
Auine

2
@Auine bạn đã tạo mẫu của riêng mình? mvc, mvvm, v.v., tất cả đều mô tả sự tách biệt của các mối quan tâm. một chế độ xem chỉ nên quan tâm đến việc hiển thị dữ liệu mà nó đã được cung cấp - nó không nên thực hiện các truy vấn, GET, v.v. Nếu bạn không muốn tuân theo một trong những mẫu đó, điều đó cũng tuyệt - nhưng nó khiến mọi thứ trở nên khó khăn hơn khi bạn cần hoán đổi lượt xem để hỗ trợ các nền tảng khác nhau trong tương lai. Câu trả lời đã chỉnh sửa mà tác giả cung cấp ở trên là một giải pháp lý tưởng hơn trong MVC - có hàm find () trong bộ điều khiển và chuyển dữ liệu đến chế độ xem kết xuất.
AndrewPK

93

Có vẻ như bạn đã tìm thấy câu trả lời của mình nhưng vì bạn đã đề cập đến biểu mẫu đang hoạt động, tôi sẽ đóng góp thêm một câu nữa, ngay cả khi nó chỉ khác một chút.

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

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

    ActiveForm::end();
?>

@DencyGB là đơn giản nhất và tôi nghĩ giải pháp duy nhất sẽ là cung cấp tên trường được chọn đầu tiên và thao tác .on('change')sự kiện trong jquery để điền trường thứ hai dựa trên lựa chọn của trường đầu tiên.
Arman P.

Tôi muốn xóa số thông thường khỏi danh sách tự động hiển thị.
Mohammad Aghayari

56

Có một số giải pháp tốt ở trên, và giải pháp của tôi chỉ là sự kết hợp của cả hai (tôi đến đây để tìm kiếm một giải pháp).

Giải pháp của @Sarvar Nishonboyev là tốt vì nó duy trì việc tạo nhãn nhập biểu mẫu và khối trợ giúp cho các thông báo lỗi.

Tôi đã đi với:

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

Một lần nữa, toàn bộ tín dụng cho: @Sarvar Nishonboyev's và @ippi


21

Có vẻ như có rất nhiều câu trả lời hay cho câu hỏi này. Vì vậy tôi sẽ cố gắng đưa ra một câu trả lời chi tiết

biểu mẫu hoạt động và dữ liệu được mã hóa cứng

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

hoặc là

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

biểu mẫu hoạt động và dữ liệu từ một bảng db

chúng ta sẽ sử dụng ArrayHelper vì vậy trước tiên hãy thêm nó vào vùng tên bằng cách

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

ArrayHelper có nhiều chức năng sử dụng đầy đủ có thể được sử dụng để xử lý mảng.

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

không phải là một phần của biểu mẫu hoạt động

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

hoặc là

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

không phải là một biểu mẫu hoạt động mà là dữ liệu từ một bảng db

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

15

Hãy xem cái này:

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

Có lẽ tôi sai nhưng tôi nghĩ rằng truy vấn SQL từ chế độ xem là một ý tưởng tồi

Đây là cách của tôi

Trong bộ điều khiển

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


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

Và trong Chế độ xem

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

Hoặc sử dụng ActiveForm

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

Nó cho biết các mục biến không xác định khi truy cập chế độ xem. Tôi đã sử dụng cách này thêm mã để điều khiển $this->view->params['items'] = $items;và trang điểm của tôi<?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

Tôi gặp vấn đề tương tự, biến $ items bị trống trong chế độ xem của tôi
MeV

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

Điều này sẽ giúp bạn ... Đừng quên sử dụng tệp lớp trong tiêu đề.


1
Trên đầu tệp dạng xem, người ta cần viết use yii\helpers\ArrayHelper; để có thể sử dụng trình trợ giúp.
Gogol

5

Trong ActiveFormchỉ sử dụng:

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

5

Đây là về việc tạo ra dữ liệu và do đó được thực hiện đúng cách hơn từ mô hình. Hãy tưởng tượng nếu bạn muốn thay đổi cách dữ liệu được hiển thị trong hộp thả xuống, chẳng hạn như thêm họ hoặc một cái gì đó. Bạn phải tìm mọi hộp thả xuống và thay đổi arrayHelper. Tôi sử dụng một hàm trong các mô hình của mình để trả về dữ liệu cho danh sách thả xuống, vì vậy tôi không phải lặp lại mã trong các chế độ xem. Nó cũng có lợi thế là tôi có thể chỉ định bộ lọc ở đây và áp dụng chúng cho mọi menu thả xuống được tạo từ mô hình này;

/* Model Standard.php */

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

Bạn có thể sử dụng cái này trong tệp xem của mình như thế này;

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

1

Nếu bạn đã đến cuối danh sách. Lưu một số mã php và chỉ cần đưa mọi thứ trở lại từ DB khi bạn cần như sau:

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

0

Html :: activeDropDownList ($ model, 'id', ArrayHelper :: map (AttendanceLabel :: find () -> all (), 'id', 'label_name'), ['prompt' => 'Trạng thái tham dự']) ;


-3

Sau đây cũng có thể được thực hiện. Nếu bạn muốn thêm biểu tượng thêm trước. Điều này sẽ hữu ích.

<?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();?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.