Вывод групп пользователей и подсчёт пользователей getCount

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

Помогите разобраться с подсчётом пользователей новичку

#1 18 августа 2021 в 18:26

Очень хочется разобраться с движком и хоть многие вещи уже более-менее понятны, все равно есть тяжёлые места.

Вот есть задача вывести группы пользователей с подсчётом пользователей.

За основу я взял виджет (список пользователей)

В файле widget.tpl

  1. $groups = $this->getOption('groups'); // выбор групп которые нужно отобразить
  2. $user_online = $this->getOption('user_online'); //чекбокс отображение количества пользователей онлайн
  3.  
  4. $user = cmsUser::getInstance();
  5. $model = cmsCore::getModel('users'); // Получил список пользователей
  6. $groups_title = $model ->getGroups(); //Получил список групп
  7. $total = $model ->getUsersCount(); // получил количество всех пользователей
  8.  
  9. if ($groups){
  10. $model->filterGroups($groups);
  11. }
  12.  

И тут я приплыл, функция filerGroups фильтрует пользователей, но не группы.

Помогите понять как реализовать вывод групп пользователей и подсчёт участников.

Очень хочется вникнуть но тяжело без подсказок.

 

#2 18 августа 2021 в 20:18

 Sanchez,  а Вы точно самокат не изобретаете?

Есть же виджет «Список групп» прямо из коробки и там есть подсчет числа участников.

Или просто принципиально нужно самому сделать?

#3 18 августа 2021 в 21:44

 Sanchez,  а Вы точно самокат не изобретаете?

Есть же виджет «Список групп» прямо из коробки и там есть подсчет числа участников.

Или просто принципиально нужно самому сделать?

Ris

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

Нужен вывод:

Администраторы — 7 / 2(online)

Модераторы — 22 / 15(online)

Новые — 150 / 22(online)

#4 18 августа 2021 в 23:28

Дьявол в деталях.

Виджета по выводу групп пользователей я не нашёл если не трудно ткните пожалуйста где он.

Группы (сообщества) и группы (роли пользователей) — две большие разницы. ☺️

Список групп есть в виджетах.

А то, что Вы хотите сделать, это список пользователей с распределением по ролям.

 

 

Изображение 

 

#5 19 августа 2021 в 12:55

Дьявол в деталях.

Виджета по выводу групп пользователей я не нашёл если не трудно ткните пожалуйста где он.

Группы (сообщества) и группы (роли пользователей) — две большие разницы. ☺️

Список групп есть в виджетах.

А то, что Вы хотите сделать, это список пользователей с распределением по ролям.

 

 

Изображение 

 

Ris

Вопрос остаётся открытым. Есть тут ктонибудь, кто сможет отталкиваясь от знания движка описать логику получения этих данных !?

#6 19 августа 2021 в 13:19

Привязка пользователей к группам хранится в таблице cms_users_groups_members. Чистый запрос выглядит:

  1. SELECT COUNT(`user_id`) AS member_count, g.title
  2. FROM `cms_users_groups_members` AS i
  3. LEFT JOIN `cms_users_groups` AS g ON g.id = i.group_id
  4. GROUP BY i.group_id;

Изображение

Кодом будет выглядеть вот так:

  1. $model = cmsCore::getModel('users');
  2.  
  3. $model->select('COUNT(i.user_id)', 'member_count');
  4. $model->select('g.title', 'title');
  5. $model->joinLeft('users_groups', 'g', 'g.id = i.group_id');
  6. $model->groupBy('i.group_id');
  7.  
  8. $stats = $model->get('users_groups_members');

 

Таблица с онлайн юзерами — cms_sessions_online. Кто онлайн, регулируется ячейкой date_created, пример тут.

#7 19 августа 2021 в 14:51

Привязка пользователей к группам хранится в таблице cms_users_groups_members. Чистый запрос выглядит:

  1. $model = cmsCore::getModel('users');
  2.  
  3. $model->select('COUNT(i.user_id)', 'member_count');
  4. $model->select('g.title', 'title');
  5. $model->joinLeft('users_groups', 'g', 'g.id = i.group_id');
  6. $model->groupBy('i.group_id');
  7.  
  8. $stats = $model->get('users_groups_members');
Fuze

Огромное тебе спасибо!!! Ответ прям полный, Все данные что нужны получил, кроме адреса.)))  Могу я задать ещё один вопрос?

Как сформировать ссылки на эти же группы!?  Я конечно сейчас сам попробую в движке поискать, но понимания как они формируются не будет. А это не очень хорошо для дальнейшей работы. Виджет конечно опубликую бесплатно, не гоже чужими знаниями пиариться )))

#8 19 августа 2021 в 16:50

Как сформировать ссылки на эти же группы!?

Sanchez
  1. $model = cmsCore::getModel('users');
  2.  
  3. $model->select('COUNT(i.user_id)', 'member_count');
  4. $model->select('g.title', 'title');
  5. // Для вкладки на странице списка юзеров
  6. $model->select('g.name', 'name')->select('g.is_filter', 'is_filter');
  7. $model->joinLeft('users_groups', 'g', 'g.id = i.group_id');
  8. $model->groupBy('i.group_id');
  9.  
  10. $stats = $model->get('users_groups_members', function ($item, $model) {
  11. // Ссылка на фильтр в списке пользователей
  12. $item['ds_slug'] = $item['is_filter'] ? href_to('users', $item['name']) : '';
  13. return $item;
  14. });

 

Изображение

#9 19 августа 2021 в 17:37

Привязка пользователей к группам хранится в таблице cms_users_groups_members. Чистый запрос выглядит:

  1. SELECT COUNT(`user_id`) AS member_count, g.title
  2. FROM `cms_users_groups_members` AS i
  3. LEFT JOIN `cms_users_groups` AS g ON g.id = i.group_id
  4. GROUP BY i.group_id;

Изображение

Кодом будет выглядеть вот так:

  1. $model = cmsCore::getModel('users');
  2.  
  3. $model->select('COUNT(i.user_id)', 'member_count');
  4. $model->select('g.title', 'title');
  5. $model->joinLeft('users_groups', 'g', 'g.id = i.group_id');
  6. $model->groupBy('i.group_id');
  7.  
  8. $stats = $model->get('users_groups_members');

 

Таблица с онлайн юзерами — cms_sessions_online. Кто онлайн, регулируется ячейкой date_created, пример тут.

Fuze

Спасибо, побольше бы таких материалов). 

#10 19 августа 2021 в 17:53

Как сформировать ссылки на эти же группы!?

Sanchez
  1. $model = cmsCore::getModel('users');
  2.  
  3. $model->select('COUNT(i.user_id)', 'member_count');
  4. $model->select('g.title', 'title');
  5. // Для вкладки на странице списка юзеров
  6. $model->select('g.name', 'name')->select('g.is_filter', 'is_filter');
  7. $model->joinLeft('users_groups', 'g', 'g.id = i.group_id');
  8. $model->groupBy('i.group_id');
  9.  
  10. $stats = $model->get('users_groups_members', function ($item, $model) {
  11. // Ссылка на фильтр в списке пользователей
  12. $item['ds_slug'] = $item['is_filter'] ? href_to('users', $item['name']) : '';
  13. return $item;
  14. });
Fuze

Уважаемый Fuse, ваши труды дорогого стоят. Очень мощный фреймворк сделали, а главное это качественный Национальный Продукт.

Очень хочется вникнуть в работу с InstantCMS

Вот что я понял указал ниже в комментариях, там же что не понял.

  1. $model = cmsCore::getModel('users'); // Получили всех пользователей
  2.  
  3. $model->select('COUNT(i.user_id)', 'member_count'); // получили количество пользователей по столбцу user_id и перевели их в переменную member_count
  4. // Что такое i в COUNT(i.user_id) и g в 'g.title' ниже?
  5. $model->select('g.title', 'title'); //Получили столбец title и перенесли его в переменную title
  6. // Для вкладки на странице списка юзеров
  7. $model->select('g.name', 'name')->select('g.is_filter', 'is_filter'); //Получили столбец name и is_filter перенесли их в переменные name и is_filter
  8. $model->joinLeft('users_groups', 'g', 'g.id = i.group_id'); // Понял только что в таблице users_groups сравнили два столбца, опять, что такое g и i
  9. $model->groupBy('i.group_id'); // собрали все совпадения в group_id
  10.  
  11. $stats = $model->get('users_groups_members', function ($item, $model) { // тут мы получаем таблицу users_groups_members и функцию(голова чуть не лопнула)))) не понял что такое получили в функцию ($item, $model) и откуда.
  12. // Ссылка на фильтр в списке пользователей
  13. $item['ds_slug'] = $item['is_filter'] ? href_to('users', $item['name']) : ''; // понял только что в массив с ключом ds_slug поместили ссылку, а как ссылку получили не понял.
  14. return $item;
  15. });

Не понимаю как получили вначале столбцы не указывая таблицу.

Поправьте где не прав и подскажите где не понял, пожалуйста.

#11 19 августа 2021 в 19:37

// Получили всех пользователей

Sanchez

Получили объект модели пользователей. Никаких пользователей мы не получали.

получили количество пользователей по столбцу user_id и перевели их в переменную member_count

Sanchez

Нет. Мы начинаем строить SQL запрос.

Понял только что в таблице users_groups сравнили два столбца, опять, что такое g и i

Sanchez

Нет. Начните изучать SQL и станет всё ясно. В двух словах не объяснить.

тут мы получаем таблицу users_groups_members

Sanchez

Нет. Тут мы непосредственно выполняем подготовленный выше запрос SQL, записывая результат в переменную $stats. После чего вам нужно передать её в шаблон и в нём через foreach вывести что необходимо.

Поправьте где не прав и подскажите где не понял, пожалуйста.

Sanchez

Везде не поняли) У вас, судя по всему, слишком начальный уровень. Я готов что-то пояснять в рамках разумного в контексте InstantCMS, но в контексте всего PHP, увы нет. Кстати, у нас есть документация как по моделям, так и в целом для разработчиков.

#12 19 августа 2021 в 19:55
Везде не поняли) У вас, судя по всему, слишком начальный уровень. Я готов что-то пояснять в рамках разумного в контексте InstantCMS, но в контексте всего PHP, увы нет. Кстати, у нас есть документация как по моделям, так и в целом для разработчиков.
Fuze

Конструктивно )))  Да всё правильно в PHP новичок, но вот MySQL совсем плохо, на сервере таблицы не вопрос, но вот всё что касается запросов к БД беда.  Надо подтягивать. Вам спасибо БОЛЬШОЕ за вашу отзывчивость, это очень надо, хоть и не просто. Общаться с новичками и объяснять как работать с вашим продуктом не просто))))

Тему не закрываю, так как нет аналогов. Пусть будет.

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