Jak stworzyć listę rozwijaną w Yii2?

85

Jak wykonać dropdownin yii2przy użyciu activeformmodelu i? Skoro wszystkie metody się zmieniły yii2, jak to się robi w nowej?

Dency GB
źródło
Czy to pytanie jest redagowane. Jeśli tak, jakie było pierwsze pytanie.
Kshitiz
@Dency GBSzukam odpowiedzi na inne moje pytanie podobne do tego .. Czy możesz na to spojrzeć ?? Link tutaj
Mohan Prasad,

Odpowiedzi:

122

To jest jak

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

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

ArrayHelper w Yii2 zastępuje dane listy CHtml w Yii 1.1. [Proszę załadować dane tablicy z kontrolera]

EDYTOWAĆ

Załaduj dane ze swojego kontrolera.

Kontroler

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

Z uwagi

<?= Html::activeDropDownList($model, 's_id',$items) ?>
Dency GB
źródło
1
Przypomnijmy, że Yii2 wykorzystuje przestrzenie nazw, stąd w rozwiązaniu „użyj przestrzeni nazw”. Zajęło mi chwilę, zanim pomyślałem, do czego służą.
johnsnails
11
Proszę nie podążać bezpośrednio za tym przykładem i mieć w swoich widokach logikę pobierania / budowania danych!
AndrewPK
@AndrewPK: czy możesz podać przykład, jak wolisz, aby to było zrobione? Prawdopodobnie przeszedł przez kontroler?
almcnicoll
@AndrewPK dlaczego? jest jak widżety, możesz pobierać dane w swoich widokach i nie jest to anty-wzorzec. Ale nie możesz tworzyć zapytań, które tworzą coś w db i tak dalej
Auine
2
@Auine, czy stworzyłeś własny wzór? mvc, mvvm itp., wszystkie opisują oddzielenie problemów. widok powinien zawsze zajmować się tylko wyświetlaniem danych, które został podany - nie powinien wykonywać zapytań, GET itp. Jeśli nie chcesz stosować się do jednego z tych wzorców, to też jest fajne - ale utrudnia to, gdy musisz zamienić widoki, aby w przyszłości obsługiwać różne platformy. Edytowana odpowiedź podana powyżej przez autora jest bardziej idealnym rozwiązaniem w MVC - posiadanie funkcji find () w kontrolerze i przekazywanie danych do renderowania widoku.
AndrewPK
93

Wygląda na to, że już znalazłeś odpowiedź, ale skoro wspomniałeś o aktywnej formie, dodam jeszcze jedną, nawet jeśli różni się ona tylko nieznacznie.

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

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

    ActiveForm::end();
?>
ippi
źródło
@DencyGB najprostszym i myślę, że jedynym rozwiązaniem byłoby podanie nazwy pierwszego pola wyboru i manipulowanie .on('change')zdarzeniem w jquery w celu wypełnienia drugiego pola na podstawie wyboru pierwszego.
Arman P.,
Chcę usunąć zwykły numer z listy, która wyświetla się automatycznie.
Mohammad Aghayari
56

Powyżej jest kilka dobrych rozwiązań, a moje to tylko połączenie dwóch (przyszedłem tutaj, szukając rozwiązania).

Rozwiązanie @Sarvar Nishonboyev jest dobre, ponieważ utrzymuje tworzenie etykiety danych wejściowych formularza i bloku pomocy dla komunikatów o błędach.

Poszedłem z:

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

Ponownie, pełne uznanie dla: @Sarvar Nishonboyev's i @ippi

johnsnails
źródło
21

Wydaje się, że jest wiele dobrych odpowiedzi na to pytanie, więc postaram się udzielić szczegółowej odpowiedzi

aktywny formularz i zakodowane dane

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

lub

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

aktywny formularz i dane z tabeli db

będziemy używać ArrayHelper, więc najpierw dodaj go do przestrzeni nazw przez

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

ArrayHelper ma wiele pełnych funkcji, które mogą być użyte do przetwarzania tablic. Map () jest tą, której użyjemy tutaj, ta funkcja pomaga utworzyć mapę (par klucz-wartość) z wielowymiarowej tablicy lub tablicy obiektów.

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

nie jest częścią aktywnego formularza

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

lub

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

nie jest to aktywny formularz, ale dane z tabeli db

<?php
    echo Html::activeDropDownList($model, 'filed_name',ArrayHelper::map(User::find()->all(),'id','username'),['prompt'=>'Select User']);
?>
Midhun
źródło
15

Spójrz na to:

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-']) ?>
Sarvar Nishonboev
źródło
10

Może się mylę, ale myślę, że zapytanie SQL z widoku to zły pomysł

To jest mój sposób

W kontrolerze

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


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

I w widoku

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

Lub za pomocą ActiveForm

<?php $form = ActiveForm::begin(); ?>
 <?= $form->field($model, 'item_id')->dropDownList($items) ?>
<?php ActiveForm::end(); ?>
DespeiL
źródło
Mówi o niezdefiniowanych elementach zmiennych podczas uzyskiwania dostępu do widoku. W ten sposób dodałem kod do kontrolera $this->view->params['items'] = $items;i na mojej stronie widoku<?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
Mam ten sam problem, zmienna $ items jest moim zdaniem pusta
MeV
8
<?= $form->field($model, 'attribute_name')->dropDownList(
         ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
        ['prompt' => 'Select']
) ?>

To ci pomoże ... Nie zapomnij użyć pliku klasy w nagłówku.

Kalai S
źródło
1
W górnej części pliku widoku trzeba pisać, use yii\helpers\ArrayHelper; aby móc korzystać z pomocnika.
Gogol,
5

W ActiveFormwystarczy użyć:

<?=
    $form->field($model, 'state_id')
         ->dropDownList(['prompt' => '---- Select State ----'])
         ->label('State')
?>
Bhola Singh
źródło
5

Chodzi o generowanie danych, a więc jest to lepiej zrobione z modelu. Wyobraź sobie, że kiedykolwiek chciałbyś zmienić sposób wyświetlania danych w rozwijanym polu, powiedz, dodaj nazwisko lub coś w tym stylu. Musisz znaleźć każde rozwijane pole i zmienić arrayHelper. Używam funkcji w moich modelach, aby zwrócić dane do listy rozwijanej, więc nie muszę powtarzać kodu w widokach. Ma również tę zaletę, że mogę tutaj określić filtr i zastosować je do każdego menu utworzonego z tego modelu;

/* Model Standard.php */

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

Możesz użyć tego w swoim pliku widoku w ten sposób;

echo $form->field($model, 'attribute')
        ->dropDownList(
            $model->dropDown
        );
Joe Miller
źródło
1

Jeśli dotarłeś do końca listy. Zapisz trochę kodu php i po prostu przywróć wszystko z DB, tak jak potrzebujesz:

 $items = Standard::find()->select(['name'])->indexBy('s_id')->column();
Reginald Goolsby
źródło
0

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

Gajendra Mehra
źródło
-3

Można również wykonać następujące czynności. Jeśli chcesz dołączyć ikonę przedrostka. To będzie pomocne.

<?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();?>
Kshitiz
źródło