2016-06-21 8 views
0
私は私のコントローラとその作業にsqlDataProviderを作成している

を使用せずに、GridViewの中に検索フィールドを作成します。私の問題は、検索モデルを使用していないので、検索フィールドを提供する方法がわかりません。はどのように検索モデル

これは私のコントローラのコードである

public function actionAnalisa() 
{ 
    $sql = "SELECT 
      tbl_permohonan.permohonan_id As permohonan_id, 
      user.id As id, 
      tbl_moderator.bm_id As bm_id, 
      tbl_bhgnmod.unit_kampuscawangan As unit_kampuscawangan, 
      tbl_bahagian.bahagian_nama As bahagian_nama, 
      tbl_unit.unit_nama As unit_nama 

      FROM tbl_permohonan 

      INNER JOIN user 
      ON tbl_permohonan.user_id=user.id 

      INNER JOIN tbl_moderator 
      ON user.id=tbl_moderator.user_id 

      INNER JOIN tbl_bhgnmod 
      ON tbl_moderator.bm_id=tbl_bhgnmod.bm_id 

      INNER JOIN tbl_bahagian 
      ON tbl_bhgnmod.bahagian_id=tbl_bahagian.bahagian_id 

      INNER JOIN tbl_unit 
      ON tbl_bhgnmod.unit_id=tbl_unit.unit_id"; 

    $dataProvider = new SqlDataProvider([ 
       'sql' => $sql, 
       ]); 

    return $this->render('analisis', [ 
     // 'searchModel' => $searchModel, 
     'dataProvider' => $dataProvider, 
    ]); 
} 

これが私の見解である

<?= GridView::widget([ 
      'dataProvider' => $dataProvider, 
      'columns' => [ 
       ['class' => 'yii\grid\SerialColumn'], 

       'permohonan_id', 
       'id', 
       'bm_id', 
       'unit_kampuscawangan', 
       'bahagian_nama', 
       'unit_nama', 
       //~ ['class' => 'yii\grid\ActionColumn'], 
      ], 
     ]); ?> 
+0

フィルタのためのモデルを作成します。グリッド設定の 'filterModel'にモデルを追加してください。 – Vitaly

答えて

3
、これは可能性を提供するので、私は、特に検索フィールドを提供するために探してたときに、生のSQLを使用しないことを助言する

アプリケーション内の脆弱性を発見し、SQLインジェクション攻撃の可能性を最大限に引き出します。 here概説されるよう代わりに私は、YiisクエリビルダまたはDAOの使用を奨励するでしょう。そうは言って

は、私がYiis作り付けのクエリビルダを使用してコードを書き換えています。

public function actionAnalisa() 
{ 
    // store any $_GET parameters passed for filtering via GridView 
    $params = Yii::$app->request->queryParams; 

    // use query builder instead of raw SQL to avoid SQL injection attacks 
    $query = (new Query()) 
     ->select([ 
      'permohonan_id' => 'tbl_permohonan.permohonan_id', 
      'id' => 'user.id', 
      'bm_id' => 'tbl_moderator.bm_id', 
      'unit_kampuscawangan' => 'tbl_bhgnmod.unit_kampuscawangan', 
      'bahagian_nama' => 'tbl_bahagian.bahagian_nama', 
      'unit_nama' => 'tbl_unit.unit_nama' 
     ]) 
     ->from('tbl_permohonan') 
     ->join('INNER JOIN', 'user', 'tbl_permohonan.user_id=user.id') 
     ->join('INNER JOIN', 'tbl_moderator', 'user.id=tbl_moderator.user_id') 
     ->join('INNER JOIN', 'tbl_bhgnmod', 'tbl_moderator.bm_id=tbl_bhgnmod.bm_id') 
     ->join('INNER JOIN', 'tbl_bahagian', 'tbl_bhgnmod.bahagian_id=tbl_bahagian.bahagian_id') 
     ->join('INNER JOIN', 'tbl_unit', 'tbl_bhgnmod.unit_id=tbl_unit.unit_id'); 

    // Adds additional WHERE conditions to the existing query but ignores empty operands 
    $query->andFilterWhere(['like', 'tbl_permohonan.permohonan_id', $params['pid']]) 
      ->andFilterWhere(['like', 'user.id', $params['id']]) 
      ->andFilterWhere(['like', 'tbl_moderator.bm_id', $params['bm_id']]) 
      ->andFilterWhere(['like', 'tbl_bhgnmod.unit_kampuscawangan', $params['unitk']]) 
      ->andFilterWhere(['like', 'tbl_bahagian.bahagian_nama', $params['banama']]) 
      ->andFilterWhere(['like', 'tbl_unit.unit_nama', $params['unnama']]); 

    // an ActiveDataProvider will accept a Query object instead of raw SQL 
    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 

    return $this->render('analisis', [ 
     'dataProvider' => $dataProvider, 
    ]); 
} 

念頭に置いて、コントローラーファイルの先頭に次の行を追加する必要があります。あなたのビューファイルのGridViewコントロール内の検索フィールドをレンダリングするために

use yii\data\ActiveDataProvider; 
use yii\db\Query; 

hereを説明するように、あなたは、filterModelを指定する必要があります。

GridView内の列を使用すると、フィルタ属性を指定できます。これにより、属性によって指定されたHTMLを使用して列の先頭にフィルタセルが表示されます。これらのフィルタは自動的に彼らがこのGridViewコントロール内で指定された名前を使用して、コントローラで扱われてきた理由である同じページにGET経由で送信されます。

<? 
use yii\helpers\Html; 
use yii\grid\GridView; 
?> 

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    // filterModel must be set to render filter cells within GridView 
    'filterModel' => true, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 
     [ 
      // specify attribute to display 
      'attribute' => 'permohonan_id', 
      // filter attribute accepts HTML to render 
      // in this case an input field of type string, with a name of 'pid' 
      'filter' => Html::input('string', 'pid') 
     ], 
     [ 
      'attribute' => 'id', 
      'filter' => Html::input('string', 'id') 
     ], 
     [ 
      'attribute' => 'bm_id', 
      'filter' => Html::input('string', 'bmid') 
     ], 
     [ 
      'attribute' => 'unit_kampuscawangan', 
      'filter' => Html::input('string', 'unitk') 
     ], 
     [ 
      'attribute' => 'bahagian_nama', 
      'filter' => Html::input('string', 'banama') 
     ], 
     [ 
      'attribute' => 'unit_nama', 
      'filter' => Html::input('string', 'unnama') 
     ], 
    ], 
]); ?> 
+0

ご返信ありがとうございます。私はあなたのコードを試してみますが、このエラー 「未定義のインデックス:PID」を取得 – NoBody

+0

私の間違いを。今働いている。おかげでたくさん:) – NoBody

+0

ありがとう!これは本当にうまくいっていて、私はそれをカスタム検索クラス内で使用しました。 – DrBorrow

関連する問題