Сортировка по выражению

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
svil
Сообщения: 562
Зарегистрирован: 2018.02.12, 22:41

Сортировка по выражению

Сообщение svil » 2019.05.23, 19:37

В модели User есть функция дешифровка значения User::getPassword2(..), введенного пользователем
при регистрации. В виде я вывожу этот код, но как по нему сделать сортировку и поиск?

Код: Выделить всё

<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'id',
            [
                'attribute' => 'codeName',
                'value' => function($dataProvider){
                    return User::getPassword2($dataProvider->password, $dataProvider->password_hash);
                },
            ],

           
            'surname:ntext',
            'name:ntext',
            'thirdname:ntext',
            
            [
                'attribute' => 'companiesName',
                'value' => function($data_c){
                    return $data_c->companies->shortname;
                },
            ],

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>

Код: Выделить всё

<?php

namespace app\models;

use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\User;
use common\models\User as UserAlias;

/**
 * UserSearch represents the model behind the search form of `app\models\User`.
 */
class UserSearch extends User
{
    public $companiesName;
    public $codeName;
    public $poisk;


    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['id', 'status', 'created_at', 'updated_at', 'time_create', 'id_companies', 'basket'], 'integer'],
            [['password', 'auth_key', 'password_hash', 'password_reset_token', 'verification_token', 'surname', 'name', 'thirdname', 'job'], 'safe'],
            [['companiesName'], 'safe'],
            [['codeName'], '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 = User::find();

        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'key' => function ($query) {
                return UserAlias::getPassword2('$query->password','$query->password_hash');
            }
        ]);
        $poisk =  UserAlias::getPassword2('$query->password','$query->password_hash');

        $dataProvider->setSort([
            'attributes' => [
                'id',
                'surname',
                'name',
                'thirdname',
                'companiesName' => [
                    'asc' => ['companies.shortname' => SORT_ASC],
                    'desc' => ['companies.shortname' => SORT_DESC],
                    'label' => 'Компания'
                ],
                'codeName' => [
                    'asc' => [  'query.key' => SORT_ASC],
                    'desc' => [  'query.key' => SORT_DESC],
                    'label' => 'Код пользователя'
                ],
               // 'password',
              //  'password_hash',
               // 'time_create',

            ]
        ]);



        $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');
            $query->joinWith(['companies']);
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'id' => $this->id,
            'id_companies' => $this->id_companies,

        ]);
        $poisk =  UserAlias::getPassword2('password','password_hash');

              $query->andFilterWhere(['like', 'surname', $this->surname])
            ->andFilterWhere(['like', 'name', $this->name])
            ->andFilterWhere(['like', 'thirdname', $this->thirdname]);
           // ->andFilterWhere(['like', UserAlias::getPassword2('password','password_hash'), $this->codeName]);

        $query->joinWith(['companies' => function ($q) {
            $q->where('companies.shortname LIKE "%' . $this->companiesName . '%"');

        }]);
        return $dataProvider;
    }
}

Последний раз редактировалось svil 2019.05.23, 20:32, всего редактировалось 1 раз.

Аватара пользователя
svil
Сообщения: 562
Зарегистрирован: 2018.02.12, 22:41

Re: Сортировка по выражению

Сообщение svil » 2019.05.23, 19:42


Аватара пользователя
leonenco
Сообщения: 130
Зарегистрирован: 2017.01.30, 22:42

Re: Сортировка по выражению

Сообщение leonenco » 2019.05.24, 02:37

Код: Выделить всё

// создание провайдера данных с конфигурацией для сортировки и постраничной разбивки
$provider = new XyzDataProvider([
    'pagination' => [...],
    'sort' => [...],
]);
так и пробуйте

Код: Выделить всё

'sort' => [
    'attribute' => SORT_ASC,
    ....
}

Аватара пользователя
svil
Сообщения: 562
Зарегистрирован: 2018.02.12, 22:41

Re: Сортировка по выражению

Сообщение svil » 2019.05.24, 19:54

не получилось, лучше пример

Аватара пользователя
leonenco
Сообщения: 130
Зарегистрирован: 2017.01.30, 22:42

Re: Сортировка по выражению

Сообщение leonenco » 2019.05.25, 01:13

В моделе поиска у вас не дешефрованые данные, соответственно, либо шифровать входящие и сравнивать, либо дешифровать каждую запись.

Мне кажется в моделе UserSearch переписывать метод afterValidate. и шиффровать. Ну это так на скорую руку ответ. Вопрос требует мозгования.

Аватара пользователя
NeverDie
Сообщения: 69
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Re: Сортировка по выражению

Сообщение NeverDie » 2019.05.25, 09:20

Пароли не просто так хранятся в шифрованном виде. Их не надо дешировывать, выводить и делать по ним поиск.

Аватара пользователя
svil
Сообщения: 562
Зарегистрирован: 2018.02.12, 22:41

Re: Сортировка по выражению

Сообщение svil » 2019.05.25, 15:17

Этот пароль - код пользователя, по которому он входит в систему.
Дешифрованные коды видит только админ. Может и нет смысла по ним делать поиск и сортировку.
Меня не просили это делать, это я для себя, чтоб разобраться в принципе.

Ответить