Jump to content
Larry Ullman's Book Forums

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;
    }

Share this post


Link to post
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,

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...