Yii2'de açılır liste nasıl yapılır?


85

Nasıl bir hale getirmek için dropdownde yii2bir kullanma activeformve bir model? Tüm yöntemler değiştiğine göre yii2, yenisinde nasıl yapılıyor?


Bu soru düzenlendi mi? Eğer evet ise, ilk soru neydi.
Kshitiz

@Dency GBBen buna benzer başka bir soruma cevap arıyorum .. Bir bakmanız mümkün mü? Buraya bağlantı
Mohan Prasad

Yanıtlar:


123

Gibi

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

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

Yii2'deki ArrayHelper, Yii 1.1'deki CHtml liste verilerinin yerini alır. [Lütfen denetleyicinizden dizi verilerini yükleyin]

DÜZENLE

Denetleyicinizden veri yükleyin.

Kontrolör

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

Görünümünde

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

1
Yii2'nin ad alanlarından yararlandığını, dolayısıyla çözümde 'ad alanlarını kullandığını' hatırlatalım. Ne için olduklarını düşünmem biraz zaman aldı.
johnsnails

11
Lütfen bu örneği doğrudan takip etmeyin ve görünümlerinizde veri getirme / oluşturma mantığı bulundurmayın!
AndrewPK

@AndrewPK: Bunun nasıl yapılmasını tercih edeceğinize dair bir örnek verebilir misiniz? Muhtemelen denetleyiciden geçti?
almcnicoll

@AndrewPK neden? Widget'lar gibidir, görünümlerinize veri getirebilirsiniz ve bu anti-model değildir. Ancak
db'de bir

3
@Auine kendi modelini mi yarattın? mvc, mvvm vb. konuların tümü endişelerin birbirinden ayrılmasını açıklamaktadır. bir görünüm yalnızca kendisine verilen verileri görüntülemekle ilgilenmelidir - sorgular, GET'ler, vb. Gelecekte farklı platformları desteklemek için görünümleri değiştirmeniz gerekir. Yazarın yukarıda verdiği düzenlenmiş yanıt, MVC'de daha ideal bir çözümdür - denetleyicide find () 'a sahip olmak ve verileri görünüm oluşturucusuna geçirmek.
AndrewPK

94

Görünüşe göre cevabınızı zaten buldunuz, ancak aktif formdan bahsettiğiniz için, çok az farklılık gösterse bile, bir tane daha katkıda bulunacağım.

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

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

    ActiveForm::end();
?>

@DencyGB en basit olanıdır ve bence tek çözüm ilk seçim alan adını vermek ve jquery'deki .on('change')olayı birinci seçimine göre ikinci alanı doldurmak için değiştirmek olacaktır .
Arman P.

Otomatik olarak gösterilen listeden sıradan numarayı kaldırmak istiyorum.
Mohammad Aghayari

56

Yukarıda bazı iyi çözümler var ve benimki sadece ikisinin bir kombinasyonu (buraya bir çözüm aramaya geldim).

@Sarvar Nishonboyev'in çözümü iyidir çünkü hata mesajları için form giriş etiketinin ve yardım bloğunun oluşturulmasını sağlar.

İle gittim:

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

Yine, tam kredi: @Sarvar Nishonboyev ve @ippi


21

Görünüşe göre bu soruya birçok güzel cevap var, bu yüzden detaylı bir cevap vermeye çalışacağım.

etkin form ve kodlanmış veriler

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

veya

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

aktif form ve bir db tablosundaki veriler

ArrayHelper'ı kullanacağız, bu yüzden önce onu isim alanına ekleyin.

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

ArrayHelper, dizileri işlemek için kullanılabilecek tam işlevlere sahiptir () burada kullanacağımız işlevdir, bu işlev çok boyutlu bir diziden veya bir dizi nesneden bir eşleme (anahtar-değer çiftleri) yapmaya yardımcı olur.

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

aktif bir formun parçası değil

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

veya

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

etkin bir form değil, bir db tablosundaki veriler

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

15

Şuna bir bak:

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

Belki yanılıyorum ama SQL sorgusunun kötü bir fikir olduğunu düşünüyorum

Bu benim yolum

Denetleyicide

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


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

Ve Görünümde

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

Veya ActiveForm kullanarak

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

Görünüme erişirken tanımsız değişken öğeler diyor. Bu şekilde denetleyiciye kod ekledim $this->view->params['items'] = $items;ve görünüm <?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]);?>
sayfamda

Aynı sorunu yaşıyorum, $ items değişkeni benim
görüşümde

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

Bu size yardımcı olacaktır ... Başlıktaki sınıf dosyasını kullanmayı unutmayın.


1
Görünüm dosyasının üstüne use yii\helpers\ArrayHelper; , yardımcıyı kullanabilmek için yazmak gerekir.
Gogol

5

In ActiveFormKullanımdan hemen:

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

5

Bu, veri üretmekle ilgilidir ve bu nedenle modelden daha doğru bir şekilde yapılır. Verilerin açılır kutuda görüntülenme şeklini değiştirmek isteyip istemediğinizi hayal edin, bir soyadı veya başka bir şey ekleyin. Her açılır kutuyu bulmanız ve arrayHelper. Bir açılır listeye ilişkin verileri döndürmek için modellerimde bir işlev kullanıyorum, bu nedenle görünümlerde kodu tekrarlamak zorunda kalmam. Ayrıca burada filtre belirtebilme ve bu modelden oluşturulan her açılır menü için uygulanmasını sağlama avantajına sahiptir;

/* Model Standard.php */

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

Bunu görünüm dosyanızda şu şekilde kullanabilirsiniz;

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

1

Listenin sonuna geldiyseniz. Biraz php kodu kaydedin ve ihtiyacınız olan her şeyi DB'den geri getirin:

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

0

Html :: activeDropDownList ($ model, 'id', ArrayHelper :: map (AttendanceLabel :: find () -> all (), 'id', 'label_name'), ['istem' => 'Katılım Durumu']) ;


-3

Aşağıdakiler de yapılabilir. Başa eklenen simgesi eklemek istiyorsanız. Bu yardımcı olacaktır.

<?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();?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.