2015-02-21 23 views
7

Trong điều khiển của tôi, tôi trả $ dataProviderLàm cách nào để sử dụng bộ lọc tùy chỉnh cho tiện ích ListView yii2?

$searchModel = new StudentSearch(); 
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

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

Đây là chức năng tìm kiếm của StudentSearch

public function search($params) 
{ 
    $query = Student::find(); 

     $query->andFilterWhere([ 
     'student_id' => $this->student_id, 
     'age' => $this->age, 

    ]); 

    $query->andFilterWhere(['like', 'firstname', $this->firstname]); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 


    if (!($this->load($params) && $this->validate())) { 
     return $dataProvider; 
    } 

    return $dataProvider; 
} 

theo quan điểm của tôi đã sử dụng $ dataprivider trong widget ListView như dưới đây

<div class="listView"> 

    <?php 
    echo ListView::widget([ 
    'dataProvider' => $dataProvider, 
    'itemView' => '_student_list', 
    ]); 
    ?> 

    </div> 

Trong '_student_list .php 'Tôi đã liệt kê các sinh viên

bộ lọc của tôi

<div class="listFilter"> 
    <input type="text" name="firstname"/> 
    <input type="text" name="age"/> 
</div> 

Bây giờ tôi muốn lọc Học sinh theo tên hoặc tuổi. Tôi có thể làm cái này như thế nào? Nếu bạn có bất kỳ giải pháp cho vấn đề này xin vui lòng giúp đỡ. Cảm ơn bạn.

+0

Vui lòng thêm mã của mô hình 'StudentSearch'. – arogachev

Trả lời

6

1) Thêm hình bộ lọc để xem của bạn:

<?php 

use yii\helpers\Html; 
use yii\widgets\ActiveForm; 

/* @var $form yii\widgets\ActiveForm */ 
?> 

<div class="student-form"> 
    <?php $form = ActiveForm::begin(['method' => 'get']); ?> 

    <?= $form->field($searchModel, 'firstname') ?> 

    <?= $form->field($searchModel, 'age') ?> 

    <div class="form-group"> 
     <?= Html::submitButton('Apply', ['class' => 'btn btn-success']) ?> 
    </div> 

    <?php ActiveForm::end(); ?> 
</div> 

2) Chuẩn bị StundentSearch mô hình để trở dataProvider tùy thuộc vào nhận GET tham số.

Các thuộc tính này phải được chỉ định trong quy tắc để chỉ định chúng một cách ồ ạt.

public function rules() 
{ 
    return [ 
     ['firstname', 'string'], 
     ['age', 'integer'], 
    ]; 
} 

public function scenarios() 
{ 
    // bypass scenarios() implementation in the parent class 
    return Model::scenarios(); 
} 

public function search($params) 
{ 
    $query = Student::find(); 

    $dataProvider = new ActiveDataProvider(['query' => $query]); 

    if (!($this->load($params) && $this->validate())) { 
     return $dataProvider; 
    } 

    $query->andFilterWhere(['age' => $this->age]) 
     ->andFilterWhere(['like', 'firstname', $this->firstname]); 

    return $dataProvider; 
} 
+0

Cập nhật câu trả lời, chỉ cần thay đổi thành '$ searchModel' vì đó là mô hình được sử dụng. – arogachev

+0

Nó liệt kê tất cả kết quả. Có lẽ chúng ta đã quên một cái gì đó? – Guwanch

+0

Mã có vẻ OK cho tôi. Bạn đã thêm thuộc tính vào 'rules()' chưa? – arogachev

Các vấn đề liên quan