Jump to content
Larry Ullman's Book Forums

Filter Gridview By Url Parameter


melaniecarr23
 Share

Recommended Posts

I want to be able to click on a link from the registration gridview, and filter the results of the players gridview so only the players I selected show up.  Right now, it's not filtering.  I get all the players.

 

I have the following tables:

- registrations

- players

 

From the registrations/index gridview I have a link so I can edit players:

<?= DynaGrid::widget([
        'columns' => [
            ['attribute'=>'playersEditLink', 'format'=>'raw'],
            [
            'label'=>'Player(s)',
            'format' => 'raw',
            'value' => function ($dataProvider) {
                $str = '';
                foreach($dataProvider->players as $name) {
                    $str .= ' ';
                    $str .= $name->first.' ';
                    $str .= $name->last.'<br />';
                }
                return nl2br($str);
            },
            'filter' => function ($dataProvider) {
                $str = '';
                foreach($dataProvider->players as $name) {
                    $str .= ' ';
                    $str .= $name->first.' ';
                    $str .= $name->last.'<br />';
                }
                return nl2br($str);
            },
            ],
            //'transactionID',
            // divisionLevel dropdown editable column
            [
                    'class' => 'kartik\grid\EditableColumn',
                    'header' => 'Division Level',
                    'attribute' => 'divisionLevelID',
                    'value'  => 'divisionLevelName',
                    'pageSummary' => true,
                    'editableOptions'=> function ($model, $key, $index, $widget) {
                        $divisionlevels = ArrayHelper::map(DivisionLevelAssignment::find()->where(['active'=>1])->orderBy('divisionlevelID')->asArray()->all(),'divisionlevelID','exportName');
                            return [
                                    'header' => 'Division Level',
                                    'size' => 'sm',
                                    'inputType' => 'dropDownList',
                                    'displayValueConfig' => $divisionlevels,
                                    'data' => $divisionlevels
                            ];
                    }
            ],
            // field dropdown editable column
            [
                    'class' => 'kartik\grid\EditableColumn',
                    'attribute' => 'field',
                    'value'  => 'fieldName',
                    'pageSummary' => true,
                    'editableOptions'=> function ($model, $key, $index, $widget) {
                        $fields = ArrayHelper::map(Fields::find()->all(), 'id','name');
                            return [
                                    'header' => 'Field',
                                    'size' => 'sm',
                                    'inputType' => 'dropDownList',
                                    'displayValueConfig' => $fields,
                                    'data' => $fields
                            ];
                    }
            ],
            // editable net column
            [
                'class'=>'kartik\grid\EditableColumn',
                'attribute'=>'net',
                'editableOptions'=>[
                    'header'=>'Net',
                    'inputType'=>'textInput',
                    'options'=>['pluginOptions'=>['min'=>1, 'max'=>60]]
                ],
                'hAlign'=>'right',
                'vAlign'=>'middle',
                'width'=>'50px'
            ],
            // editable team column
            [
                'class'=>'kartik\grid\EditableColumn',
                'attribute'=>'team',
                'editableOptions'=>[
                    'header'=>'Team #',
                    'inputType'=>'textInput',
                    'options'=>['pluginOptions'=>['min'=>1, 'max'=>5]]
                ],
                'hAlign'=>'right',
                'vAlign'=>'middle',
                'width'=>'50px'
            ],

            // 'team',
            // 'notes:ntext',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    'storage'=>DynaGrid::TYPE_SESSION,
    'theme'=>'panel-danger',
    'gridOptions'=>[
        'dataProvider'=>$dataProvider,
        'filterModel'=>$searchModel,
        'panel'=>['heading'=>'<h3 class="panel-title">Library</h3>'],
    ],
    'options'=>['id'=>'dynagrid-1'] // a unique identifier is important
]); ?>

This gives me a column that links to players/index&registrationID=29

 

My problem here is that I can't seem to get the GridView for Players to filter results so only players with a registrationID = 29 will show up.

 

PlayersController:

public function actionIndex()
    {
        $searchModel = new PlayersSearch();
        if (isset($_GET['registrationID']))
            $searchModel->attributes = $_GET['registrationID'];
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        

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

PlayersSearchModel:

public function search($params)
    {
        $query = players::find();

        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        // setup sorting attributes BEFoRE $this->load($params)
        $dataProvider->setSort([
            'attributes' =>[
                'ID',
                'registrationID',
                'fullName' => [
                    'asc' => [
                        'first' => SORT_ASC, 
                        'last' => SORT_ASC],
                    'desc' => [
                        'first' => SORT_DESC,
                        'last' => SORT_DESC],
                    'label' => 'Full Name',
                    'default' => SORT_ASC
                    ],
                'email',
                'phone',
                'city',
                'state',
            ]
        ]);


        if (isset($_GET['PlayersSearch']) && !($this->load($params) && $this->validate())) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            $query->joinWith(['registration']);
            return $dataProvider;
        }
        
        // grid filtering conditions
        $query->andFilterWhere(['ID' => $this->ID]);
        $query->andFilterWhere(['registrationID' => $this->registrationID]);
        $query->andFilterWhere(['first' => $this->first]);
        $query->andFilterWhere(['last' => $this->last]);
        $query->andFilterWhere(['email' => $this->email]);
        $query->andFilterWhere(['phone' => $this->phone]);
        $query->andFilterWhere(['city' => $this->city]);
        $query->andFilterWhere(['state' => $this->state]);


        $query->andWhere('first LIKE "%' . $this->fullName . '%" ' . 'OR last LIKE "%' . $this->fullName . '%"');

        return $dataProvider;
    }
Link to comment
Share on other sites

I can highly recommend getting yourself a program like Charles Web Proxy.  It is especially useful for helping to solve these issues because you can see everything that is being passed back and forth - especially when it comes to AJAX / CURL etc.

 

Helped come to the same resolution you've had, and solved my puzzles in a matter of minutes instead of days.

 

Hope that helps,

Link to comment
Share on other sites

 Share

×
×
  • Create New...