MIK
MIK

Reputation: 906

Yii2 Grid view sort and filteration using custom label

In my user table I have fields like firstname and lastname. then I generated a views using Gii.In my index page now I have Firstname,Lastname,Username etc....

I concatenated my fistname and lastname as Name.

[
  'attribute'=>'firstname',
  'label' => 'Name',
  'format' => 'raw',
  'value' => function ($data) {
   return Html::a($data->Name);
   },
],     

In Model

public function getName()
{
    return $this->firstname.' '.$this->lastname;
}

unfortunately I am unable to search the name field with last name... I need to filter the field with both firstname and lastname.
Can anyone please help me....
Thanks in advance.

Upvotes: 3

Views: 2363

Answers (1)

Ripper
Ripper

Reputation: 1162

This is how you setup search model (I did not include your other columns, so dont forget on those)

You can find more here: http://www.yiiframework.com/wiki/621/filter-sort-by-calculated-related-fields-in-gridview-yii-2-0/

class UserSearch extends User
{
    public $name;

    public function rules()
    {
        return [
            [['name'], 'safe'],
            // some other rules ...
        ];
    }

    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

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

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

        $dataProvider->sort->attributes['name'] = [
            'asc' => ['lastname' => SORT_ASC, 'firstname' => SORT_ASC],
            'desc' => ['lastname' => SORT_DESC, 'firstname' => SORT_DESC],
            'label' => 'Name',
            'default' => SORT_ASC
        ];

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions

        // some other filters ...
        $query->andFilterWhere([
           'or',
            ['like', 'lastname', $this->name],
            ['like', 'firstname', $this->name],
        ]);

        return $dataProvider;
    }
}

And in your gridview instead of

[
  'attribute'=>'firstname',
  // ...
],   

just use

[
  'attribute'=>'name',
],

Upvotes: 2

Related Questions