TeamSearch.php 6.96 KB
<?php

    namespace common\models;

    use Yii;
    use yii\base\Model;
    use yii\data\ActiveDataProvider;
    use common\models\Team;

    /**
     * TeamSearch represents the model behind the search form about `common\models\Team`.
     */
    class TeamSearch extends Team
    {

        public $user;

        public $department;

        public $experience_from_from;

        public $experience_from_to;

        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [
                    [
                        'team_id',
                        'user_id',
                        'department_id',
                        'user_add_id',
                        'experience_from',
                        'experience_from_from',
                        'experience_from_to',
                    ],
                    'integer',
                ],
                [
                    [
                        'experience_from_from',
                    ],
                    'default',
                    'value' => 0,
                ],
                [
                    [
                        'experience_from_to',
                    ],
                    'default',
                    'value' => 100,
                ],
                [
                    [
                        'department',
                        'firstname',
                        'lastname',
                        'user',
                        'middlename',
                        'link',
                        'position',
                        'date_add',
                        'photo',
                        'country_id',
                    ],
                    '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)
        {
            $query = Team::find();

            // add conditions that should always apply here

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

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

            $query->joinWith(Department::tableName());

            $dataProvider->setSort([
                'attributes' => [
                    'team_id',
                    'position',
                    'country_id',
                    'user'            => [
                        'asc'  => [
                            'lastname'   => SORT_ASC,
                            'firstname'  => SORT_ASC,
                            'middlename' => SORT_ASC,
                        ],
                        'desc' => [
                            'lastname'   => SORT_DESC,
                            'firstname'  => SORT_DESC,
                            'middlename' => SORT_DESC,
                        ],
                    ],
                    'link'            => [
                        'asc'  => [
                            'link' => SORT_DESC,
                        ],
                        'desc' => [
                            'link' => SORT_ASC,
                        ],
                    ],
                    'department'      => [
                        'asc'  => [
                            Department::tableName() . '.name' => SORT_ASC,
                        ],
                        'desc' => [
                            Department::tableName() . '.name' => SORT_DESC,
                        ],
                    ],
                    'experience_from' => [
                        'asc'  => [
                            'experience_from' => SORT_DESC,
                        ],
                        'desc' => [
                            'experience_from' => SORT_ASC,
                        ],
                    ],
                ],
            ]);

            // grid filtering conditions
            $query->andFilterWhere([
                'team_id'       => $this->team_id,
                'user_id'       => $this->user_id,
                'department_id' => $this->department_id,
                'date_add'      => $this->date_add,
                'user_add_id'   => $this->user_add_id,
            ]);

            $query->andFilterWhere([
                'between',
                'experience_from',
                $this->experience_from_to ? ( date('Y') - $this->experience_from_to ) : ( date('Y') - 100 ),
                $this->experience_from_from ? ( date('Y') - $this->experience_from_from ) : date('Y'),
            ]);

            if(!empty( $this->link ) || $this->link === '0') {
                $query->andFilterWhere([
                    $this->link ? '>' : '=',
                    'char_length(link)',
                    0,
                ]);
            }

            $query->andFilterWhere([
                'like',
                'firstname',
                $this->firstname,
            ])
                  ->andFilterWhere([
                      'like',
                      'lastname',
                      $this->lastname,
                  ])
                  ->andFilterWhere([
                      'like',
                      'middlename',
                      $this->middlename,
                  ])
                  ->andFilterWhere([
                      'like',
                      'position',
                      $this->position,
                  ])
                  ->andFilterWhere([
                      'like',
                      'photo',
                      $this->photo,
                  ])
                  ->andFilterWhere([
                      'like',
                      'country_id',
                      $this->country_id,
                  ])
                  ->andFilterWhere([
                      'or',
                      [
                          'like',
                          'lastname',
                          $this->user,
                      ],
                      [
                          'like',
                          'firstname',
                          $this->user,
                      ],
                      [
                          'like',
                          'middlename',
                          $this->user,
                      ],
                  ])
                  ->andFilterWhere([
                      'like',
                      'department.name',
                      $this->department,
                  ]);

            return $dataProvider;
        }
    }