Как использовать пользовательский фильтр для виджета Yii2 ListView?
в моем контроллере я визуализировал $dataProvider
$searchModel = new StudentSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
вот функция поиска 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;
}
в представлении я использовал $dataprivider в виджете ListView, как показано ниже
  <div class="listView">
   <?php
    echo ListView::widget([
   'dataProvider' => $dataProvider,
    'itemView' => '_student_list',
    ]);
    ?>
  </div>
In ' _student_list.php ' я перечислил студентов
фильтры
  <div class="listFilter">
   <input type="text" name="firstname"/>
   <input type="text" name="age"/>
 </div>
теперь я хочу фильтровать студентов по имени или возрасту. Как я могу это сделать? Если у вас есть решение этой проблемы прошу помочь. Спасибо.
1 ответов
1) добавить форму фильтра в представление:
<?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) готовить StundentSearch модель вернуться dataProvider в зависимости от полученных GET параметры.
эти атрибуты должны быть указаны в правилах для их массового назначения.
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;
}
