Проблема в следующем. На одной странице расположено 2 gridView. Если начинаю искать что-то в одном гриде, то этот фильтр срабатывает на оба. Не могу понять в чем проблема. dataProvider и filterModel разные для каждого грида.
Ниже код скину. Подскажите пожалуйста, как настроить отдельный поиск друг от друга. Подозреваю, что это из-за того, что GET у них просто одинаковый, а может и нет. В общем я слабо в этом понимаю, надеюсь на вашу помощь.
Страница представления index.phpecho GridView::widget([
'dataProvider' => $newProvider,
'filterModel' => $newSearch,
'showHeader' => true,
'showFooter' => false,
'tableOptions' => [
'class' => 'table table-striped table-bordered table-condensed'
],
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'title',
'text',
'date',
'status' => [
'attribute' => 'status',
'format' => 'text',
'content' => function ($data) {
return Yii::t('ticket', $data->status);
},
],
$viewed => [
'attribute' => $viewed,
'label' => Yii::t('ticket', 'field_viewed'),
'content' => function ($data) {
if ($data->viewed_user == '1')
return Yii::t('ticket', 'viewed_ticket');
else
return Yii::t('ticket', 'not_viewed_ticket');
}
],
[
'class' => 'yii\grid\ActionColumn',
'template' => '{view} {delete}',
'header'=>Yii::t('ticket','title_actions_on_ticket'),
'buttons' => [
'delete' => function ($url, $model, $key) {
return Html::a('<span class="glyphicon glyphicon-remove"></span>', Url::to(['default/close','id' => $model->id]), [
'data-confirm' => Yii::t('ticket', 'confirm_closed_ticket'),
]);
},
'view' => function ($url, $model, $key) {
return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', Url::to(['default/view','id' => $model->id]));
},
],
],
],
]);
Страница контроллераpublic function actionIndex() {
$searchModel = new TicketSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
//Если простой пользователь, формируем ещё один провайдер для отображения тикетов от админа пользователю
if (!Yii::$app->user->isAdmin()) {
$newSearch = new TicketSearch();
$newProvider = $newSearch->search(Yii::$app->request->queryParams, true);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'newSearch' => $newSearch,
'newProvider' => $newProvider,
]);
}
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
Страница модели TicketSearch.phpclass TicketSearch extends Ticket
{
/**
* @inheritdoc
*/
public function rules()
{
return [
[['title', 'text', 'date','priority'] , 'safe'],
];
}
/**
* @inheritdoc
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params, $from = false)
{
//Если пользователь не администратор, отбираем только его тикеты
if (!Yii::$app->user->isAdmin()) {
//Если ищем тикеты от админа, адресованные конкретномю пользователю
if ($from) {
$condition = "to_users_id = ".Yii::$app->user->getId();
}
//Если ищем все тикеты авторизованного пользователя
else {
$condition = 'users_id = '.Yii::$app->user->getId();
}
$query = Ticket::find()->where($condition);
}
//Если админ, забираем все тикеты за исключение тикетов от админов
else {
$query = Ticket::find()->where('to_users_id is null');
}
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'forcePageParam' => false,
'pageSizeParam' => false,
'pageSize' => 5
]
]);
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
$filter = ['title' => $this->title,
'text' => $this->text,
'date' => $this->date,
'status' => $this->status,
'viewed_user' => $this->viewed_user,
'viewed_admin' => $this->viewed_admin,
'priority' => $this->priority];
$query->andFilterWhere($filter);
//$query->andFilterWhere(['like', 'name', $this->name]);
return $dataProvider;
}
}
Есть предположение о том, что не работает, потому что класс SearchTicket один и тот же, но логика поиска в гридах абсолютно одинаковая. Неужели придется делать второй такой же класс, чтобы решить проблему?