KOTOFF.NET
  • Главная
  • Пользователи
  • Контакты
  • Статистика
  • Правила
  • О нас
  • Вход / Регистрация

Yii2 (ч4) — Поиск, фильтр и сортировка GridView по связным данным

Статьи / PHP

Сегодня закончим тему GridView и доделаем начатое. С прошлого урока у нас осталась таблица пользователей с их данными, которую предстоит немного доработать: сделаем фильтрацию, сортировку и поиск по связным данным моделей.


Сейчас в тестовом проекте имеется вот такая таблица. Нетрудно заметить, что столбцы с местом работы и должностью юзеров не адаптированы под фильтр, сортировку и поиск:


Так-с, приступим. Для начала переходим к классу MemberSearch. В него необходимо добавить два публичных свойства: первое для места работы, второе для должности:

public string $org_name = '';
public string $worker_position = '';

Свойства можно, кстати, назвать как угодно.

В этом же классе есть метод rules(), в него необходимо вписать только что созданные свойства (org_name и worker_position):

public function rules() : array
{
    return [
        [ [ 'id', 'joined' ], 'integer' ],
        [ [ 'name', 'org_name', 'worker_position' ], 'safe' ],
    ];
}

 

Точно такие же коррективы вносим и в класс Member для метода attributeLabels():

public function attributeLabels() : array
{
    return [
        'oid' => 'Место работы',
        'name' => 'Имя',
        'joined' => 'Дата регистрации',
        'org_name' => 'Место работы',
        'worker_position' => 'Должность',
    ];
}

И, пожалуй, это был единственный момент, который нужно было подправить в этом классе.


Теперь возвращаемся обратно к MemberSearch, ищем там метод search(), внутри которого находим строку:

$query = Member::find();

 И меняем её на:

$query = Member::find()->joinWith( [
    'worker' => function( $w )
    {
        $w->joinWith( 'organization' );
    }
] );

Также стоит удостовериться в наличии связи getWorker() в классе Member:

public function getWorker() : \yii\db\ActiveQuery
{
    return $this->hasOne( Worker::class, [ 'uid' => 'id' ] );
}

И в наличии связи getOrganization() в классе Worker:

public function getOrganization() : \yii\db\ActiveQuery
{
    return $this->hasOne( Organization::class, [ 'id' => 'oid' ] );
}

Если их нет - добавьте. В противном случае работать ничего не будет.


Далее вновь возвращаемся к search() класса MemberSerach и в DataProvider добавляем сортировку:

$dataProvider = new \yii\data\ActiveDataProvider( [
    'query' => $query,
    'sort' => [
        'attributes' => [
            'name',
            'joined',
            'org_name' => [
                'asc' => [ 'organizations.name' => SORT_ASC ],
                'desc' => [ 'organizations.name' => SORT_DESC ],
            ],
            'worker_position' => [
                'asc' => [ 'workers.position' => SORT_ASC ],
                'desc' => [ 'workers.position' => SORT_DESC ],
            ],
        ]
    ],
] );


Ну, и добавляем фильтры:

$query
    ->andFilterWhere( [ 'like', 'name', $this->name ] )
    ->andFilterWhere( [ 'like', 'organizations.name', $this->org_name ] )
    ->andFilterWhere( [ 'like', 'position', $this->worker_position ] );


Окей, с этим мы разобрались и в конечном итоге MemberSearch.php выглядит следующим образом:

<?php

namespace app\models;


class MemberSearch extends Member
{

    public string $worker_position = '';
    public string $org_name = '';


    public function rules() : array
    {
        return [
            [ [ 'id', 'joined' ], 'integer' ],
            [ [ 'name', 'org_name', 'worker_position' ], 'safe' ],
        ];
    }

    public function scenarios() : array
    {
        return \yii\base\Model::scenarios();
    }

    public function search( $params ) : \yii\data\ActiveDataProvider
    {
        $query = Member::find()->joinWith( [
            'worker' => function( $w )
            {
                $w->joinWith( 'organization' );
            }
        ] );


        $dataProvider = new \yii\data\ActiveDataProvider( [
            'query' => $query,
            'sort' => [
                'attributes' => [
                    'name',
                    'joined',
                    'org_name' => [
                        'asc' => [ 'organizations.name' => SORT_ASC ],
                        'desc' => [ 'organizations.name' => SORT_DESC ],
                    ],
                    'worker_position' => [
                        'asc' => [ 'workers.position' => SORT_ASC ],
                        'desc' => [ 'workers.position' => SORT_DESC ],
                    ],
                ]
            ],
        ] );

        $this->load( $params );

        if ( !$this->validate() )
        {
            return $dataProvider;
        }


        $query
            ->andFilterWhere( [ 'like', 'name', $this->name ] )
            ->andFilterWhere( [ 'like', 'organizations.name', $this->org_name ] )
            ->andFilterWhere( [ 'like', 'position', $this->worker_position ] );


        return $dataProvider;
    }

}


Нам осталось всего-навсего поменять атрибуты в нужных столбцах таблицы в виде:

[
    'attribute' => 'org_name',
    'value' => function( $member )
    {
        return $member->worker->organization->name ?? '-';
    },
],

[
    'attribute' => 'worker_position',
    'content' => function( $member )
    {
        return $member->worker->position ?? '-';
    },
],

Вид index целиком:

<?php
/* @var $this yii\web\View */
/* @var $searchModel app\models\MemberSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->params['breadcrumbs'][] = $this->title;
?>

<div class="member-index">

    <h1><?= \yii\helpers\Html::encode( $this->title ) ?></h1>

    <p>
        <?= \yii\helpers\Html::a( 'Добавить пользователя', [ 'create' ], [ 'class' => 'btn btn-success' ] ) ?>
    </p>

    <?php \yii\widgets\Pjax::begin() ?>

    <?= \yii\grid\GridView::widget( [
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'layout' => '{items}{pager}',

        'columns' => [

            [
                'attribute' => 'name',
                'content' => function( $member )
                 {
                     return "<b>{$member->name}</b>";
                 },
            ],

            [
                'attribute' => 'joined',
                'value' => function( $member )
                {
                    return date( 'd.m.y', $member->joined );
                },
            ],

            [
                'attribute' => 'org_name',
                'value' => function( $member )
                {
                    return $member->worker->organization->name ?? '-';
                },
            ],

            [
                'attribute' => 'worker_position',
                'content' => function( $member )
                {
                    return $member->worker->position ?? '-';
                },
            ],

            [
                'class' => \yii\grid\ActionColumn::class,
                'urlCreator' => function( $action, \app\models\Member $model, $key, $index, $column )
                {
                    return \yii\helpers\Url::toRoute( [ $action, 'id' => $model->id ] );
                }
            ],

        ],
    ] ); ?>

    <?php \yii\widgets\Pjax::end() ?>

</div>


И уже на этом завершающем этапе можно посмотреть на проделанную работу. Сортировка появилась, поля для поиска тоже.


Конец😉 

  • 5id15
  • 09.09.2022
  • 4 618
  • 0
Yii2 (ч1) — Установка и настройка ЧПУ
Yii2 (ч1) — Установка и настройка ЧПУ
16-08-2022, 15:32, PHP
Yii2 (ч2) — Основы работы с БД и настройка связей в моделях
Yii2 (ч2) — Основы работы с БД и настройка связей в моделях
18-08-2022, 17:10, PHP
Yii2 (ч3) — Работа с GridView
Yii2 (ч3) — Работа с GridView
6-09-2022, 23:39, PHP
Создание динамической картинки со своим текстом и изображением с помощью PHP и использованием Imagick
Создание динамической картинки со своим текстом и изображением с помощью PHP и использованием Imagick
14-01-2021, 15:17, Статьи / PHP
[VK BOT] Полезные функции (команды) для бота вк
[VK BOT] Полезные функции (команды) для бота вк
24-07-2019, 15:30, Статьи / PHP
Movie

Нет комментариев. Не желаешь оставить первый комментарий?

Перед публикацией, советую ознакомится с правилами!

{login}

Твой комментарий..

Заказывай!
Разработка ботов на заказ, любой сложности, обращаться:
 VK KOTOFF.net - Сообщество, в личные сообщения или по контактам указанным там 
 mail: [email protected]

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Планируете ли вернуться к динамической обложке?
Скрипт для скачивания видео с YouTube на PHP
Уже не работает.
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 115
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 936
Добавлено за сутки: +0
Пользователей: 4124
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter

Полезные ссылки
  • О проекте
  • Наши контакты
  • Администрация
  • Рекламные материалы
  • Идеи и предложения
  • Ответы на вопросы
Информация
  • Условия сделки
  • Способы оплаты
  • Поддержка / F.A.Q
  • Онлайн документация
  • Статистика сайта
  • Список пользователей
Услуги/Работа
  • Разработка ботов ВК
  • Обновление проекта
  • Консультация/поддержка
KOTOFF.net

Copyright © Footer 2019-2023. All right reserved.
KOTOFF.net - Уроки по PHP, SQL, IT новости
Быстрый вход

Используйте социальные сети для быстрой регистрации и авторизации.

Google
ВКонтакте
Яндекс
Mail.ru
Создать аккаунт / Регистрация
Авторизация

Я забыл свой пароль