4

yii2 で依存ドロップダウンを作成できますか?

私は2つのテーブルを持っています:

'id','name_country"
'id','name_city','country_id'

私のモデルには2つのメソッドがあります:

public function getCountryList()
{
$models = NetCountry::find()->asArray()->all();
return ArrayHelper::map($models, 'id', 'country_name');
} 

public function getCityList($parent_id) { 
$models = \common\models\City::find()->where(['parent_id' => $country_id])->asArray()->all();
return ArrayHelper::map($models, 'id', 'name_city','country_id');
}

私は最初のフィールドを持っています:

 <?= $form->field($model, 'country')->dropDownList($model->countryList),['id'=>'parent_id'];

そして2番目

<?= $form->field($model, 'city')->dropDownList($model->cityList);

コントローラーに「送信」し、AJAX (JSON を使用) でparent_id返す必要があります。city_list

これどうやってするの?Yii1 で例を見ましたが、Yii2 はどうですか?

4

4 に答える 4

8

サードパーティのライブラリを使用せずに yii2 で依存ドロップダウンを作成するのは、yii1 と同じくらい簡単です。要件に従って、以下に記述された次のコードを試す必要があります。gii を使用して、それぞれのテーブルのモデル、ビュー、コントローラーを作成します。

あなたが書いた国、都市のような2つのテーブルがあるとします。次に、次のコードを 1 つのコントローラー (国など) のビュー ファイルに書き込みます。

         <?php
                    use yii\helpers\ArrayHelper;
                    use yii\widgets\ActiveForm;
                    ?>
               <div>
            <?php
     $dataCountry=ArrayHelper::map(\app\models\Country::find()->
     asArray()->all(),'id', 'name');    
                  $form = ActiveForm::begin();
                echo $form->field($model, 'id')->dropDownList($dataCountry, 
                                     ['prompt'=>'-Choose a Name-',
                                         'class'=>'adjust',
                          'onchange'=>'
             $.post("'.Yii::$app->urlManager->createUrl('city/lists?id=').
           '"+$(this).val(),function( data ) 
                   {
                              $( "select#city" ).html( data );
                            });
                        ']); 

                $dataPost=ArrayHelper::map(\app\models\City::find()->
                 asArray()->all(), 'id', 'city');
              echo $form->field($model, 'id')
                    ->dropDownList(
                        $dataPost,   
                         ['id'=>'city',
                             'class'=>'adjust'
                             ]
                    );
                 ActiveForm::end(); 
               ?>
            </div>

この後、都市の別のコントローラーで次のコードを次のように記述します。

 <?php

namespace app\controllers;

class CityController extends \yii\web\Controller
{
        public function actionLists($id)
      {
         //echo "<pre>";print_r($id);die;
         $countPosts = \app\models\City::find()
         ->where(['country_id' => $id])
         ->count();

         $posts = \app\models\City::find()
         ->where(['country_id' => $id])
         ->orderBy('id DESC')
         ->all();

         if($countPosts>0){
         foreach($posts as $post){

         echo "<option value='".$post->id."'>".$post->city."</option>";
         }
         }
         else{
         echo "<option>-</option>";
         }

 }
}

それから動作するURLに実行します!

編集: URL の構造を修正しました。http リクエストが機能するようになりました。

于 2014-08-23T10:37:46.763 に答える
0

上記のコードは正しく動作しません。行にエラーがあります

$.post("'.Yii::$app->urlManager->createUrl('city/lists&id=').'"+$(this).val(),function( data ) 

コンソールにエラーが表示されます: Not Found (#404): Unable to resolve the request: subcategory/lists&id=54

これに対する解決策はありますか私のコントローラーは以下のようになります

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

         if($posts){
         foreach($posts as $post){

         echo "<option value='".$post->id."'>".$post->name."</option>";
         }
         }
         else{
         echo "<option>-</option>";
         }

    }

URLからIDを削除してコントローラにハードコーディングすると、正しく動作します。

これに対する解決策を見つけました。次のようにビューを変更してください

 <?= $form->field($model, 'category_id')->dropDownList($data,['prompt'=>'-Choose a Category-',

                                                            'onchange'=>'
             $.get( "'.Url::toRoute('product/catlists').'", { id: $(this).val() } )
                            .done(function( data )
                   {
                              $( "select#product-sub_categoryid" ).html( data );
                            });
                        ']); ?> 

このようなコントローラー

public function actionCatlists($id)
    {
        $mymodel = new Product ();
        $size = $mymodel->modelGetCategory ( 'product_sub_category',$id );
        if($size){
            echo '<option value="">Choose Sub category</option>';
            foreach($size as $post){
                echo "<option value='".$post['id']."'>".$post['name']."</option>";
            }
        }
        else{
            echo '<option value="0">Not Specified</option>';
        }

    }

これをビューに含めることを忘れないでください

use yii\helpers\Url;
于 2015-01-20T08:52:07.313 に答える