Como fazer uma lista suspensa no yii2?

85

Como fazer um dropdownem yii2usando um activeforme um modelo? Já que todos os métodos mudaram em yii2, como isso é feito no novo?

Dency GB
fonte
Esta questão foi editada. Se sim, qual foi a pergunta inicial.
Kshitiz
@Dency GB Estou procurando respostas para minha outra pergunta semelhante a esta .. É possível você dar uma olhada nisso ?? Link aqui
Mohan Prasad

Respostas:

123

É como

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

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

O ArrayHelper no Yii2 substitui os dados da lista CHtml no Yii 1.1. [Carregue os dados do array do seu controlador]

EDITAR

Carregue dados de seu controlador.

Controlador

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

Em vista

<?= Html::activeDropDownList($model, 's_id',$items) ?>
Dency GB
fonte
1
Lembre-se de que o Yii2 faz uso de namespaces, portanto, 'use namespaces' na solução. Levei um tempo para pensar para que serviam.
johnsnails
11
Por favor, não siga este exemplo diretamente e tenha lógica de busca / construção de dados em suas visualizações!
AndrewPK
@AndrewPK: você poderia dar um exemplo de como você prefere que isso seja feito? Provavelmente passado pelo controlador?
almcnicoll,
@AndrewPK por quê? são como widgets, você pode buscar dados em suas visualizações e não é anti-padrão. Mas você não pode criar consultas que criem algo em db e assim por diante
Auine
3
@Auine você criou seu próprio padrão? mvc, mvvm, etc., todos descrevem uma separação de interesses. uma visão só deve se preocupar com a exibição de dados que foi fornecida - ela não deve realizar consultas, GETs, etc. Se você não quiser aderir a um desses padrões, isso também é legal - mas torna as coisas mais difíceis quando você precisa trocar as visualizações para oferecer suporte a diferentes plataformas no futuro. A resposta editada que o autor forneceu acima é a solução mais ideal em MVC - ter o find () no controlador e passar os dados para a exibição de renderização.
AndrewPK
94

Parece que você já encontrou sua resposta, mas como mencionou o formulário ativo, contribuirei com mais um, mesmo que seja um pouco diferente.

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

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

    ActiveForm::end();
?>
ippi
fonte
@DencyGB é o mais simples e acho que a única solução seria dar o nome do primeiro campo de seleção e manipular o .on('change')evento em jquery para preencher o segundo campo com base na seleção do primeiro.
Arman P.
Quero remover o número comum da lista que mostra automaticamente.
Mohammad Aghayari
56

Existem algumas boas soluções acima, e a minha é apenas uma combinação de duas (vim aqui em busca de uma solução).

A solução de @Sarvar Nishonboyev é boa porque mantém a criação do rótulo de entrada do formulário e bloco de ajuda para mensagens de erro.

Eu fui com:

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

Mais uma vez, crédito total para: @Sarvar Nishonboyev's e @ippi

johnsnails
fonte
21

Parece que há muitas respostas boas para essa pergunta. Portanto, tentarei dar uma resposta detalhada

formulário ativo e dados codificados

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

ou

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

formulário ativo e dados de uma tabela db

vamos usar ArrayHelper, então primeiro adicione-o ao espaço de nomes

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

ArrayHelper tem muitas funções completas de uso que podem ser usadas para processar arrays map () é o que vamos usar aqui, esta função ajuda a fazer um mapa (de pares chave-valor) a partir de um array multidimensional ou um array de objetos.

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

não faz parte de um formulário ativo

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

ou

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

não um formulário ativo, mas dados de uma tabela db

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

Dê uma olhada nisso:

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
fonte
10

Talvez eu esteja errado, mas acho que a consulta SQL do modo de exibição é uma má ideia

Esta é a minha maneira

No controlador

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


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

E em vista

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

Ou usando ActiveForm

<?php $form = ActiveForm::begin(); ?>
 <?= $form->field($model, 'item_id')->dropDownList($items) ?>
<?php ActiveForm::end(); ?>
DespeiL
fonte
Diz itens variáveis ​​indefinidos ao acessar a visualização. Eu usei desta forma adicionei código ao controlador $this->view->params['items'] = $items;e na minha página de visualização<?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 11/10/2015
Tenho o mesmo problema, a variável $ items está vazia na minha opinião
MeV de
8
<?= $form->field($model, 'attribute_name')->dropDownList(
         ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
        ['prompt' => 'Select']
) ?>

Isso ajudará você ... Não se esqueça de usar o arquivo de classe no cabeçalho.

Kalai S
fonte
1
No topo do arquivo de visão, é necessário escrever use yii\helpers\ArrayHelper; para poder usar o helper.
Gogol
5

Em ActiveFormuso apenas:

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

Trata-se de gerar dados e, portanto, é feito de forma mais adequada a partir do modelo. Imagine se você alguma vez quisesse alterar a forma como os dados são exibidos na caixa suspensa, digamos, adicionar um sobrenome ou algo assim. Você teria que localizar cada caixa suspensa e alterar o arrayHelper. Eu uso uma função em meus modelos para retornar os dados para uma lista suspensa, então não preciso repetir o código nas visualizações. Também tem a vantagem de poder especificar o filtro aqui e aplicá-los a todos os menus suspensos criados a partir deste modelo;

/* Model Standard.php */

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

Você pode usar isso em seu arquivo de visualização assim;

echo $form->field($model, 'attribute')
        ->dropDownList(
            $model->dropDown
        );
Joe Miller
fonte
1

Se você chegou ao fim da lista. Salve algum código php e traga tudo de volta do banco de dados conforme necessário, como isto:

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

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

Gajendra Mehra
fonte
-3

O seguinte também pode ser feito. Se você deseja anexar o ícone prefixar. Isso será útil.

<?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
fonte