Як скласти випадаючий список у yii2?


85

Як зробити dropdownin yii2за допомогою an activeformі моделі? Оскільки всі методи змінилися в yii2, як це робиться в новому?


Чи відредаговано це запитання? Якщо так, то яке було початкове питання.
Kshitiz

@Dency GBI Я шукаю відповіді на моє ще одне запитання, подібне до цього .. Чи можна для вас поглянути на це ?? Посилання тут
Мохан Прасад

Відповіді:


122

Це як

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

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

ArrayHelper у Yii2 замінює дані списку CHtml у Yii 1.1. [Будь ласка, завантажте дані масиву з вашого контролера]

РЕДАГУВАТИ

Завантажте дані з вашого контролера.

Контролер

$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

11
Будь ласка, не слід наслідувати цей приклад, і у ваших поданнях буде логіка отримання / побудови даних!
AndrewPK,

@AndrewPK: чи не могли б ви навести приклад того, як ви хочете, щоб це було зроблено? Імовірно, переданий через контролер?
almcnicoll

@AndrewPK чому? це як віджети, ви можете отримувати дані у своїх переглядах, і це не є анти-шаблоном. Але ви не можете створювати запити, які створюють щось у базі даних тощо
Ойен

2
@Auine ви створили свій власний шаблон? mvc, mvvm тощо, усі описують поділ проблем. подання повинно будь-коли займатися відображенням даних, які йому було надано - воно не повинно виконувати запити, GET тощо. Якщо ви не хочете дотримуватися одного з цих шаблонів, це теж круто - але це ускладнює ситуацію, коли вам потрібно поміняти місцями подання, щоб у майбутньому підтримувати різні платформи. Відредагована відповідь, яку автор надав вище, є більш ідеальним рішенням у MVC - наявність find () у контролері та передача даних у візуалізацію подання.
AndrewPK

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.

Я хочу видалити звичайний номер зі списку, який автоматично відображається.
Мохаммед Агаярі

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

активна форма та дані з таблиці db

ми будемо використовувати 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]);?>
Р.Н. Кушваха

У мене та ж проблема, змінна $ 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; щоб мати можливість користуватися помічником.
Гоголь

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-коду і просто поверніть все з БД, як вам потрібно, ось так:

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

0

Html :: activeDropDownList ($ model, 'id', ArrayHelper :: map (AttendanceLabel :: find () -> all (), 'id', 'label_name'), ['prompt' => 'Статус відвідуваності']) ;


-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();?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.