Задать вопрос
@EvgMul

Несколько GridView на одной странице?

Проблема в следующем. На одной странице расположено 2 gridView. Если начинаю искать что-то в одном гриде, то этот фильтр срабатывает на оба. Не могу понять в чем проблема. dataProvider и filterModel разные для каждого грида.
Ниже код скину. Подскажите пожалуйста, как настроить отдельный поиск друг от друга. Подозреваю, что это из-за того, что GET у них просто одинаковый, а может и нет. В общем я слабо в этом понимаю, надеюсь на вашу помощь.

Страница представления index.php
echo 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.php
class 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 один и тот же, но логика поиска в гридах абсолютно одинаковая. Неужели придется делать второй такой же класс, чтобы решить проблему?
  • Вопрос задан
  • 602 просмотра
Подписаться 2 Оценить 2 комментария
Решения вопроса 1
padlyuck
@padlyuck
Вы правы, это происходит из-за того, что имена полей у фильтров одинаковые. Смотрите в сторону filterUrl у GridView. Так вы сможете отправлять фильтры на разные экшены.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы