Er Sahaj Arora
Er Sahaj Arora

Reputation: 862

Fatch value in Dependent dropdown in Yii2

I created a Dependent drop-down now i want to fetch these values on update page. How can i do ?

I created 2 drop-down - 1st Client and 2nd Staff on update page i got the value of client but i did not get the value of staff (Because it is dependent drop-down)

Form

   <?php  
    //First drop-down  
    echo $form->field($model, 'client')->dropDownList($Client, 
     ['prompt'=>'-Select Client-',
      'onchange'=>'
        $.post
        ( 
            "'.urldecode(
      Yii::$app->urlManager->createUrl
      ('leads/lists&id=')).'"+$(this).val(), function( data ) 
         {
          $( "select#staff_id" ).html( data );
        });
    ']); ?> 

     // depend dropdown
    <?php echo $form->field($model, 'staff')
          ->dropDownList
           (     
                 ['prompt'=>'-Choose a Sub Category-'],
                 ['id'=>'staff_id','value'=>$Staff]
            );
    ?>

Controller

public function actionLists($id)
{
    $sql = "select * from staff  where client='$id' ";
   //exit;
    $models = Staff::findBySql($sql)->asArray()->all();   
    //echo "<pre>";print_r($model);exit;

    if(sizeof($models) >0){
        echo "<option>-Choose a Sub Category-</option>";
        foreach($models as $model){
            echo "<option value='".$model['id']."'>".$model['fname']."</option>";
        }
    }
    else{
        echo "<option>-Choose a Sub Category-</option><option></option>";
    }

}

Upvotes: 3

Views: 486

Answers (2)

Serghei Leonenco
Serghei Leonenco

Reputation: 3507

You have to create separate function in your controller (like an example):

public function actionLists($id)
    {               
        $posts = \common\models\Post::find()
                ->where(['category_id' => $id])
                ->orderBy('id DESC')
                ->all();

        if (!empty($posts)) {
            $option = '<option>-Select Option-</option>';
            foreach($posts as $post) {
                $options .= "<option value='".$post->id."'>".$post->title."</option>";
            }
            return $options;
        } else {
            return "<option>-</option>";
        }

    }

and in view file (example):

use yii\helpers\ArrayHelper;
$dataCategory=ArrayHelper::map(\common\models\Category::find()->asArray()->all(), 'id', 'name');
    echo $form->field($model, 'category_id')->dropDownList($dataCategory, 
             ['prompt'=>'-Choose a Category-',
              'onchange'=>'
                $.post( "'.Yii::$app->urlManager->createUrl('post/lists?id=').'"+$(this).val(), function( data ) {
                  $( "select#title" ).html( data );
                });
            ']); 

    $dataPost=ArrayHelper::map(\common\models\Post::find()->asArray()->all(), 'id', 'title');
    echo $form->field($model, 'title')
        ->dropDownList(
            $dataPost,           
            ['id'=>'title']
        );

This is from Yii docs: https://www.yiiframework.com/wiki/723/creating-a-dependent-dropdown-from-scratch-in-yii2

Upvotes: 0

jithin
jithin

Reputation: 920

first add $modelsStaff variable to your create and update actions like below:

<?
public function actionCreate() 
{ 
    $modelsStaff=null;
    $model = new model(); 
    if ($model->load(Yii::$app->request->post()) && $model->save()) 
    { 
        return $this->redirect(['view', 'id' => $model->id]); 
    } 
    else
    {
        return $this->render('create', [ 'model' => $model,'modelsStaff'=>$modelsStaff]); 
    } 
}
public function actionUpdate($id) 
{ 
    $model = $this->findModel($id); 
    if ($model->load(Yii::$app->request->post()) && $model->save()) 
    { 
        return $this->redirect(['view', 'id' => $model->id]); 
    } 
    else
    {
        $sql = "select * from staff  where client='$model->client'";
        $modelsStaff = Staff::findBySql($sql)->asArray()->all();    
        return $this->render('update', [ 'model' => $model,'modelsStaff'=>$modelsStaff]); 
    } 
}

?>

In your update action find all staff using $model->client and get all staff under this client and update your view like this

<?php  
    //First drop-down  
    echo $form->field($model, 'client')->dropDownList($Client, 
     ['prompt'=>'-Select Client-',
      'onchange'=>'
        $.post
        ( 
            "'.urldecode(
      Yii::$app->urlManager->createUrl
      ('leads/lists?id=')).'"+$(this).val(), function( data ) //<---
         {
          $( "select#staff_id" ).html( data );
        });
    ']); ?> 

     // depend dropdown
    <?php echo $form->field($model, 'staff')->dropDownList
           ($modelsStaff,    
                 ['prompt'=>'-Choose a Sub Category-'],
                 ['id'=>'staff_id','value'=>$Staff]
            );
    ?>

Upvotes: 1

Related Questions