Wie erstelle ich eine Dropdown-Liste in yii2?

85

Wie eine zu machen , dropdownin yii2eine mit activeformund ein Modell? yii2Wie wird es in der neuen Methode gemacht, da sich alle Methoden geändert haben ?

Dency GB
quelle
Wird diese Frage bearbeitet? Wenn ja, was war die erste Frage?
Kshitiz
@Dency GBI sucht nach Antworten auf meine andere ähnliche Frage. Kannst du sie dir ansehen? Link hier
Mohan Prasad

Antworten:

121

Es ist wie

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

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

ArrayHelper in Yii2 ersetzt die CHtml-Listendaten in Yii 1.1. [Bitte laden Sie Array-Daten von Ihrem Controller]

BEARBEITEN

Laden Sie Daten von Ihrem Controller.

Regler

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

Im Hinblick auf

<?= Html::activeDropDownList($model, 's_id',$items) ?>
Dency GB
quelle
1
Erinnern Sie daran, dass Yii2 Namespaces verwendet, daher die 'Namespaces verwenden' in der Lösung. Ich habe eine Weile gebraucht, um zu überlegen, wofür sie da waren.
Johnsnails
11
Bitte folgen Sie diesem Beispiel nicht direkt und haben Sie Datenabruf- / Gebäudelogik in Ihren Ansichten!
AndrewPK
@AndrewPK: Können Sie ein Beispiel dafür geben, wie Sie dies bevorzugen? Vermutlich vom Controller durchgegangen?
Almcnicoll
@ AndrewPK warum? Es ist wie mit Widgets, Sie können Daten in Ihren Ansichten abrufen und es ist kein Anti-Pattern. Aber Sie können keine Abfragen erstellen, die etwas in db und so weiter
erstellen
2
@Auine hast du dein eigenes Muster erstellt? mvc, mvvm usw. beschreiben alle eine Trennung von Bedenken. Eine Ansicht sollte sich immer nur mit der Anzeige der Daten befassen, die sie erhalten hat - sie sollte keine Abfragen, GETs usw. ausführen. Wenn Sie sich nicht an eines dieser Muster halten möchten, ist das auch cool - aber es macht die Dinge schwieriger, wenn Sie müssen Ansichten austauschen, um in Zukunft verschiedene Plattformen zu unterstützen. Die bearbeitete Antwort, die der Autor oben angegeben hat, ist eine idealere Lösung in MVC - das find () im Controller zu haben und die Daten an das Rendering der Ansicht zu übergeben.
AndrewPK
90

Es scheint, dass Sie Ihre Antwort bereits gefunden haben, aber da Sie die aktive Form erwähnt haben, werde ich mit einer weiteren beitragen, auch wenn sie sich nur geringfügig unterscheidet.

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

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

    ActiveForm::end();
?>
ippi
quelle
@DencyGB am einfachsten und ich denke, die einzige Lösung wäre, den ersten Namen des .on('change')Auswahlfelds anzugeben und das Ereignis in jquery zu manipulieren, um das zweite Feld basierend auf der Auswahl des ersten zu füllen.
Arman P.
Ich möchte die normale Nummer aus der Liste entfernen, die automatisch angezeigt wird.
Mohammad Aghayari
56

Es gibt oben einige gute Lösungen, und meine ist nur eine Kombination aus zwei (ich bin hierher gekommen, um nach einer Lösung zu suchen).

Die Lösung von @Sarvar Nishonboyev ist gut, da die Erstellung des Formulareingabeetiketts und des Hilfeblocks für Fehlermeldungen beibehalten wird.

Ich ging mit:

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

Nochmals die volle Anerkennung an: @Sarvar Nishonboyev's und @ippi

Johnsnails
quelle
21

Es scheint, dass es viele gute Antworten auf diese Frage gibt. Also werde ich versuchen, eine detaillierte Antwort zu geben

aktive Form und fest codierte Daten

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

oder

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

aktive Form und Daten aus einer DB-Tabelle

Wir werden ArrayHelper verwenden, also fügen Sie es zuerst dem Namensraum von hinzu

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

ArrayHelper hat viele Vollfunktionen, die zur Verarbeitung von Arrays verwendet werden können. Map () ist diejenige, die wir hier verwenden werden. Diese Funktion hilft dabei, eine Map (aus Schlüssel-Wert-Paaren) aus einem mehrdimensionalen Array oder einem Array von Objekten zu erstellen.

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

nicht Teil eines aktiven Formulars

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

oder

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

kein aktives Formular, sondern Daten aus einer DB-Tabelle

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

Schauen Sie sich das an:

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

Vielleicht irre ich mich, aber ich denke, dass eine SQL-Abfrage aus der Sicht eine schlechte Idee ist

Das ist mein Weg

In der Steuerung

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


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

Und in Sicht

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

Oder mit ActiveForm

<?php $form = ActiveForm::begin(); ?>
 <?= $form->field($model, 'item_id')->dropDownList($items) ?>
<?php ActiveForm::end(); ?>
DespeiL
quelle
Beim Zugriff auf die Ansicht werden undefinierte Variablenelemente angezeigt. Ich habe auf diese Weise Code zum Controller hinzugefügt $this->view->params['items'] = $items;und auf meiner Ansichtsseite<?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
Ich habe das gleiche Problem, die Variable $ items ist meiner Ansicht nach leer
MeV
8
<?= $form->field($model, 'attribute_name')->dropDownList(
         ArrayHelper::map(Table_name::find()->all(),'id','field_name'),
        ['prompt' => 'Select']
) ?>

Dies wird Ihnen helfen ... Vergessen Sie nicht, die Klassendatei im Header zu verwenden.

Kalai S.
quelle
1
Über die Ansichtsdatei muss geschrieben use yii\helpers\ArrayHelper; werden, um den Helfer verwenden zu können.
Gogol
5

In ActiveFormnur verwenden:

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

Hier geht es darum, Daten zu generieren, und dies geschieht besser aus dem Modell heraus. Stellen Sie sich vor, Sie möchten jemals die Art und Weise ändern, in der Daten im Dropdown-Feld angezeigt werden, z. B. einen Nachnamen oder etwas hinzufügen. Sie müssten jedes Dropdown-Feld finden und das ändern arrayHelper. Ich verwende eine Funktion in meinen Modellen, um die Daten für ein Dropdown-Menü zurückzugeben, sodass ich den Code in Ansichten nicht wiederholen muss. Es hat auch den Vorteil, dass ich hier Filter angeben und sie auf jedes Dropdown anwenden kann, das aus diesem Modell erstellt wurde.

/* Model Standard.php */

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

Sie können dies in Ihrer Ansichtsdatei wie folgt verwenden.

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

Wenn Sie es bis zum Ende der Liste geschafft haben. Speichern Sie etwas PHP-Code und bringen Sie einfach alles aus der Datenbank zurück, wie Sie es brauchen:

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

Folgendes kann ebenfalls durchgeführt werden. Wenn Sie das Präfix-Symbol anhängen möchten. Dies wird hilfreich sein.

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