Yii2 - динамический поиск gridView - PullRequest
0 голосов
/ 19 июня 2019

У меня есть таблица с записями за несколько лет (2017, 2018, 2019 и т. Д.).Мне нужно, чтобы по умолчанию gridView показывал больше года (в этом примере это «2019»).Я сделал это таким образом.это нормально?

MaintenanceController.php

        $greaterYear = Maintenance::find()->select(['year'])->where(['id_type' => $id_type])->orderBy(['year' => SORT_DESC])->one();
        $searchModel->year = $greaterYear->year;

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

        return $this->render('view', [
            'model' => $this->findModel($id_type),
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
?>

но мне нужен фильтр с другими годами, теперь у меня уже есть связь с другими годами, как это:

view.php

<?php echo Html::a('2017', '', ['class' => 'year label label-default', 'id' => '2017']) ; ?>

теперь мне нужен фильтр gridView, когда я нажимаю на ссылку других лет, я сделал этот "трюк", используя Pjax, но я думаю, что это не хорошо, и еслия скрываю «год» от gridView, очевидно, не работает.

view.php

<?php
$script = <<< JS
$(function(){
    $('body').on('click', '.year', function(e) {
        e.preventDefault();
        $('input[name="PlanoManutencaoSearch[ano]"').val($(this).attr("id"));
        $("#w0").yiiGridView("applyFilter");
    });
});
JS;
$this->registerJs($script);
?>

какой способ реализации этого?

noteя использую этот gridView с параметрами в URL, например, this/controller/action?id_type=8, поэтому URL не может быть полностью изменен, и мне нужно, чтобы это было возможно, добавить фильтр из других «атрибутов» (URL является инкрементным).

Обновление Добавление файла полного вида.

<div class="maintenance-view">

    <div class="panel-group">
        <div class="panel panel-primary">
            <div class="panel-heading">Filter</div>
            <div class="panel-body">
                <?php echo Html::a('2019', '', ['class' => 'year label label-default', 'id' => '2019']) ; ?>
                <?php echo Html::a('2018', '', ['class' => 'year label label-default', 'id' => '2018']) ; ?>
                <?php echo Html::a('2017', '', ['class' => 'year label label-default', 'id' => '2017']) ; ?>
            </div>
        </div>
    </div>

    <?php Pjax::begin(); ?>    <?php echo GridView::widget([
        'dataProvider' => $dataProvider,
        //'filterModel' => $searchModel,

        'columns' => [
                'year',
                ['attribute' => 'id_client',
                    'value' => function($model){
                        if (isset($model->idClient->name)) {
                            return $model->idClient->name;
                        }
                    }
                ],
        ],
    ]); ?>
    <?php Pjax::end(); ?>
</div>

<?php
$script = <<< JS
$(function(){
    $('body').on('click', '.year', function(e) {
        e.preventDefault();
        $('input[name="PlanoManutencaoSearch[ano]"').val($(this).attr("id"));
        $("#w0").yiiGridView("applyFilter");
    });

});
JS;
$this->registerJs($script);
?>

В этом случае мне нужно при загрузке страницы показывать записи в gridView с "year" = "2019" ($greaterYear->year (переменная изконтроллер)).И когда я нажимаю label с другим годом (например, "2017"), gridView показывает только запись с year = "2017".

1 Ответ

0 голосов
/ 21 июня 2019

Если вы хотите вручную передать фильтр searchModel:

Раскомментируйте свой фильтрModel *

<?php echo GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel, //<--- Renable....
    ...
?>

Ссылка фильтра

<?php
$route = '?PlanoManutencaoSearch[ano]=2019';
echo Html::a('2019', $route, ['class' => 'year label label-default', 'id' => '2019']) ; 
?>
...