จะสร้างรายการแบบหล่นลงใน yii2 ได้อย่างไร?


85

วิธีที่จะทำให้dropdownในyii2การใช้activeformและรูปแบบหรือไม่? เนื่องจากวิธีการทั้งหมดได้เปลี่ยนไปyii2แล้วจะทำอย่างไรในวิธีใหม่


คำถามนี้ถูกแก้ไขหรือไม่ ถ้าใช่คำถามเริ่มต้นคืออะไร
Kshitiz

@Dency GB ฉันกำลังมองหาคำตอบสำหรับคำถามอื่นของฉันที่คล้ายกันนี้ .. เป็นไปได้ไหมที่คุณจะได้ดู? ลิงก์ที่นี่
Mohan Prasad

คำตอบ:


123

มันเป็นเหมือน

<?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 ทำไม? มันเหมือนกับวิดเจ็ตคุณสามารถดึงข้อมูลในมุมมองของคุณได้และไม่ใช่การต่อต้านรูปแบบ แต่คุณไม่สามารถสร้างแบบสอบถามที่สร้างบางสิ่งในฐานข้อมูลและอื่น ๆ ได้
Auine

3
@ ของแท้คุณสร้างรูปแบบของคุณเองหรือไม่? mvc, mvvm ฯลฯ ล้วนอธิบายถึงการแยกความกังวล ข้อมูลพร็อพเพอร์ตี้ควรเกี่ยวข้องกับการแสดงข้อมูลที่ได้รับเท่านั้น - ไม่ควรดำเนินการค้นหา GET และอื่น ๆ หากคุณไม่ต้องการยึดติดกับรูปแบบใดรูปแบบหนึ่งนั่นก็ยอดเยี่ยมเช่นกัน - แต่จะทำให้สิ่งต่างๆยากขึ้นเมื่อ คุณต้องเปลี่ยนมุมมองเพื่อรองรับแพลตฟอร์มต่างๆในอนาคต คำตอบที่ได้รับการแก้ไขที่ผู้เขียนระบุไว้ข้างต้นเป็นทางออกที่ดีกว่าใน MVC โดยมี find () ในตัวควบคุมและส่งข้อมูลไปยังมุมมองการแสดงผล
AndrewPK

94

ดูเหมือนว่าคุณจะพบคำตอบของคุณแล้ว แต่เมื่อคุณพูดถึงแบบฟอร์มที่ใช้งานอยู่ฉันจะให้ข้อมูลเพิ่มเติมอีกครั้งแม้ว่าจะแตกต่างกันเพียงเล็กน้อยก็ตาม

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

ฉันต้องการลบหมายเลขธรรมดาออกจากรายการที่แสดงโดยอัตโนมัติ
Mohammad Aghayari

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 และ @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']);
?>

รูปแบบที่ใช้งานและข้อมูลจากตารางฐานข้อมูล

เราจะใช้ ArrayHelper ดังนั้นก่อนอื่นให้เพิ่มลงในช่องว่างชื่อโดย

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

ArrayHelper มีฟังก์ชันการใช้งานเต็มรูปแบบมากมายซึ่งสามารถใช้ในการประมวลผลแผนที่อาร์เรย์ () เป็นฟังก์ชันที่เราจะใช้ที่นี่ฟังก์ชันนี้ช่วยในการสร้างแผนที่ (ของคู่คีย์ - ค่า) จากอาร์เรย์หลายมิติหรืออาร์เรย์ของวัตถุ

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

ไม่ใช่รูปแบบที่ใช้งานอยู่ แต่เป็นข้อมูลจากตารางฐานข้อมูล

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

ฉันมีปัญหาเดียวกันตัวแปร $ 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; เพื่อให้สามารถใช้ตัวช่วยได้
Gogol


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();?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.