[ИЩУ РЕШЕНИЕ] Как вывести дополнительные поля в админке?

ЕСТЬ РЕШЕНИЕ InstantCMS 2.X

Создаем дополнительные поля в профиле пользователей при заполнении анкеты на сайте. Как вывести эти поля в единую таблицу в админке?

#1 28 августа 2022 в 19:48

В настройках профилей пользователей можно создать дополнительные поля, например: телефон, название организации, ФИО и прочие комбинации.


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


Например: если пользователь регистрируется и мы просим указать его номер телефона, то можно настроить — показывать номер телефона только админу, или группе пользователей рангом пониже. 


Но вот со стороны админки не понятно, как выводить эти поля в списке?


При переходе в закладку пользователи (instant 2.15.2) у нас есть таблица с сортировкой: Никнейм, email, последний ip, регистрация, репутация, рейтинг, блок, удален и действия. 


Можно ли изменить выводимые блоки и на основе созданных дополнительных полей выводить такие колонки как: никнейм, email, дата последнего входа, телефон. организация и действия?


Никак не могу найти в настройках как оптимизировать эти таблицы. Прошу помощи. 

#3 30 августа 2022 в 17:15

Большое спасибо за ориентиры Loadырь, где и что нужно править. Все получилось!


Возможно кому-то в будущем такое решение также потребуется.

Мои действия были следующие:


Редактируем (и/или) добавляем новые поля, которые необходимо выводить

В моем случае это были пользователи при регистрации и заполнении анкеты. 

Соответственно сначала создаем дополнительные поля для пользователей в админке сайта: «Пользователи» — «Настройки». Создали дополнительные поля, присвоили им имена на латинице.


Далее нам необходимо, чтобы в разделе «Пользователи» выводились заданные выше поля. Для этого: 

Переходим на хостинг по адресу: /system/controllers/admin/grids и находим там файл grid_users.php

Внутри него редактируем и добавляем блоки типа: 

  1. 'phone' => array(
  2. 'title' => LANG_PHONE,
  3. 'class' => 'd-none d-xxl-table-cell',
  4. 'width' => 80,
  5. 'filter' => 'exact',
  6. 'handler' => function($value){
  7. return '<span class="'. html_signed_class($value).'">'.html_signed_num($value).'</span>';
  8. }
  9. ),


Где 'phone' — системное имя нового дополнительного поля, а 'title' => LANG_PHONE, как будет подписано поле в заголовке.

Таких блоков вы ставите ровно столько, сколько нужно выводить дополнительных полей в админке в разделе «Пользователи».


Далее нам нужно указать те самые заголовки 'title' => LANG_PHONE, чтобы в таблице они читались красиво и понятно.

Для этого идем снова на хостинг по адресу: /system/languages/ru и находим файл language.php.

В этом файле прописываем (визуально будет понятно где) 

  1. define('LANG_KARMA', 'Телефон');

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


Большое спасибо Loadырь за ориентиры! У меня все получилось. ЗЫ: программирование не знаю, но код настолько просто читается, что даже я справился. Всем удачи. 

Добавлено спустя 3 часа

Есть еще вопрос, сориентируте пожалуйста. Какая функция вызывает определение даты последней активности пользователя на сайте?

#5 13 сентября 2022 в 21:56

Сергей Сергеевич  БОЛЬШОЕ спасибо! все работает идеально! Потрясающее решение вопроса! 

#6 26 мая 2024 в 01:11

Правка файлов особо не нужна — там есть хуки.

Сергей Сергеевич

Подскажите, а как вывести тип подписки и дату окончания подписки(в биллинге) в этой таблице(пользователи)? Спасибо. 

#7 29 мая 2024 в 10:34

Путём длительных экспериментов смог вывести название подписки и дату окончания (из биллинга) в админке пользователей. Но Когда захотел сделать это поле ссылкой, то столкнулся с такой проблемой, так как я использовал для вывода поле существующее в БД — plan_id то ссылкой становились лишь те поля, в которых есть подписка. Код я добавил в хук Сергея грид_админ_юзерс и выглядит так: 

  1. // Получение данных о планах и их названиях
  2. $plans_data = [];
  3. $plans_result = cmsDatabase::getInstance()->query("
  4. SELECT bp.id AS plan_id, bp.title AS plan_title, bpl.id, bpl.date_until
  5. FROM st_billing_plans bp
  6. LEFT JOIN st_billing_plans_log bpl ON bp.id = bpl.plan_id
  7. ");
  8. if ($plans_result) {
  9. while ($row = $plans_result->fetch_assoc()) {
  10. $plans_data[$row['plan_id']] = [
  11. 'title' => $row['plan_title'],
  12. 'date_until' => $row['date_until']
  13. ];
  14. }
  15. }

вот так выввод настроен:

  1. // Добавление поля "Подписка" с названием плана и датой окончания подписки
  2. $grid['columns']['plan_id'] = [
  3. 'title' => 'Подписка до(план)',
  4. 'handler' => function ($user) use ($plans_data) {
  5. $plan_id = $user['plan_id'];
  6. if (isset($plans_data[$plan_id])) {
  7. $plan = $plans_data[$plan_id];
  8. $plan_title = $plan['title'];
  9. $userid = $plan['userid'];
  10. $date_until = isset($plan['date_until']) ? date('d.m.Y', strtotime($plan['date_until'])) : 'Нет подписки';
  11. // Отладочная информация
  12. ob_start();
  13. var_dump($plan_id);
  14. $debug_output = ob_get_clean();
  15. file_put_contents('upload/000/debug.txt', $debug_output, FILE_APPEND);
  16. // КОНЕЦ Отладочная информация
  17.  
  18. return '<a href="/users/' . $userid . '/balance">' . $date_until . ', (' . $plan_title . ')</a>';
  19. } else {
  20. return '<a href="/users/' . $user['id'] . '/balance">Нет подписки</a>';
  21. }
  22. }
  23. ];
  24.  

Но ссылка работает только в тех случаях когда есть подписка, в остальных случаях user['id'] = null  и поэтому ссылка выглядит так = /users/ /balance

Есть знатоки, которые могут помочь? я понимаю что сделал всё через жопу, но другого варианта не нашёл... 

#8 29 мая 2024 в 11:11
  • SELECT bp.id AS plan_id, bp.title AS plan_title, bpl.id, bpl.date_until
  • FROM st_billing_plans bp
  • LEFT JOIN st_billing_plans_log bpl ON bp.id = bpl.plan_id
Саня

Запрос какой-то сомнительный. У вас в списке у разных пользователей с одинаковой подпиской даты окончания разные выводятся?

#9 29 мая 2024 в 11:32

Запрос какой-то сомнительный. У вас в списке у разных пользователей с одинаковой подпиской даты окончания разные выводятся?

Loadырь

Проверил, вы правы. Когда тестировал были разные подписки и поэтому не замечал ошибки. Нужно переписывать запрос. Есть возможность помочь настроить это так как должно работать? И Скажите сколько будет стоить.

#10 29 мая 2024 в 11:33

Должно быть что-то типа такого

  1. $plans_data = $this->model->
  2. select('bp.title', 'plan_title')->
  3. joinLeft('billing_plans', 'bp', 'i.plan_id = bp.id')->
  4. orderBy('date_until', 'desc')->
  5. groupBy('user_id')->
  6. get('billing_plans_log', false, 'user_id');
  7.  
  8. $grid['columns']['plan_id'] = array(
  9. 'title' => LANG_BILLING_CP_DB_PLANS,
  10. 'handler' => function ($value, $row) use ($plans_data) {
  11. if (!empty($plans_data[$row['id']])) {
  12. return '<a href="/users/' . $row['id'] . '/balance">' . date("Y-m-d", strtotime($plans_data[$row['id']]['date_until'])) . ', (' . $plans_data[$row['id']]['plan_title'] . ')</a>';
  13. } else {
  14. return '<a href="/users/' . $row['id'] . '/balance">---</a>';
  15. }
  16. }
  17. );
  18.  
#11 29 мая 2024 в 11:42

Должно быть что-то типа такого

Loadырь

Охренеть, я 2 дня потратил, и ничего нормально не работало. А вы за 2 минуты. Всё работает. Спасибо. Донат отправил.

#12 29 мая 2024 в 11:46

И тут есть нюансы:

Сортировкапользователейпо этому столбцу происходит по полю plan_id, а там не даты, а цифры-идентификаторы планов. Можно отключить, но тогда совсем не будет сортировки. Поэтому имейте это в виду.

Также у пользователей выводятся самые «долгоиграющие» подписки. Другими словами у пользователя могут быть три подписки из них активные две и только одна показывается, которая закончится в последнюю очередь.

Добавлено спустя 2 минуты

Донат отправил.

Саня

Спасибо

#13 29 мая 2024 в 11:51
могут быть три подписки из них активные две и только одна показывается, которая закончится в последнюю очередь.
Loadырь

В моём случае именно так и надо. Спасибо. 

#14 29 мая 2024 в 12:39

Можно ещё разукрасить, чтобы просроченные выделялись красным цветом

  1. $plans_data = $this->model->
  2. select('bp.title', 'plan_title')->
  3. joinLeft('billing_plans', 'bp', 'i.plan_id = bp.id')->
  4. orderBy('date_until', 'desc')->
  5. groupBy('user_id')->
  6. get('billing_plans_log', false, 'user_id');
  7.  
  8. $time = time();
  9.  
  10. $grid['columns']['plan_id'] = array(
  11. 'title' => LANG_BILLING_CP_DB_PLANS,
  12. 'handler' => function ($value, $row) use ($plans_data, $time) {
  13. if (!empty($plans_data[$row['id']])) {
  14. $plan_time = strtotime($plans_data[$row['id']]['date_until']);
  15. $class = $plan_time < $time ? ' class="text-danger"' : '';
  16. return '<a' . $class . ' href="/users/' . $row['id'] . '/balance">' . date("Y-m-d", $plan_time) . ', (' . $plans_data[$row['id']]['plan_title'] . ')</a>';
  17. } else {
  18. return '<a href="/users/' . $row['id'] . '/balance">---</a>';
  19. }
  20. }
  21. );
  22.  
#15 29 мая 2024 в 13:25

чтобы просроченные выделялись красным цветом

Loadырь

Биллинг убирает подписку когда она просрочена, по идее нужно красить тех у кого осталось менее 3х дней до окончания подписки. 

Идея интересная, себе добавил. Только изменил

       $time = time();

на

        $time1 = time();
        $time = strtotime('+3 days', $time1); // Unix timestamp через 3 дня

Проверил, вроде работает. 

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.