2015-02-21 12 views
7

W moim kontrolera I renderowane $ dataProviderJak używać niestandardowego filtru dla widgetu Yii2 ListView?

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

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

Tu jest funkcja wyszukiwania z 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; 
} 

w widoku użyłem $ dataprivider w widget ListView jak poniżej

<div class="listView"> 

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

    </div> 

W „_student_list .php "Wymieniłem studentów:

moje filtry

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

Teraz chcę filtrować uczniów według imion lub wieku. Jak mogę to zrobić? Jeśli masz jakieś rozwiązanie tego problemu, proszę o pomoc. Dziękuję Ci.

+0

Proszę dodać kod modelu "StudentSearch". – arogachev

Odpowiedz

6

1) Dodaj formę filtra do widoku:

<?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) Przygotuj StundentSearch modelu wrócić dataProvider zależności od otrzymanych GET parametrów.

Atrybuty te muszą być określone w regułach w celu ich masowego przypisania.

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

Zaktualizowano odpowiedź, po prostu zmień ją na '$ searchModel', ponieważ jest to używany model. – arogachev

+0

Podano wszystkie wyniki. Może coś zapomnieliśmy? – Guwanch

+0

Kod wygląda dobrze dla mnie. Czy dodałeś atrybuty do 'rules()'? – arogachev

Powiązane problemy