Как вывести в компонент люди "users" количество сообщений

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X
#1 17 декабря 2017 в 11:53
Друзья как можно вывести в компонент люди в раздел "users" количество сообщений, которые отправили пользователи. делал разные способы но не получается.

#2 17 декабря 2017 в 14:28
Ап
#3 17 декабря 2017 в 14:38
Нико,
Что за сообщения? В какой таблице базы хранится количество сообщений (или сами сообщения, если нет готовой цифры подсчитанных сообщений)?
#4 17 декабря 2017 в 16:14


Нико,
Что за сообщения? В какой таблице базы хранится количество сообщений (или сами сообщения, если нет готовой цифры подсчитанных сообщений)?

Ris

Да я так и сделал но не получается из фильтров. Я его делаю в виджете на главном если напишу код постепенно сможете как то помочь с подсказками?
#5 17 декабря 2017 в 17:52

постепенно сможете как то помочь с подсказками ?

Нико
В общем-то главная подсказка уже подсказана:
  1. $this->model->filterEqual("user_id", $user_id);
  2. $mess_count = $this->model->getCount('таблица_с_сообщениями', '*');
#6 17 декабря 2017 в 18:12


постепенно сможете как то помочь с подсказками ?

Нико
В общем-то главная подсказка уже подсказана:
  1. $this->model->filterEqual("user_id", $user_id);
  2. $mess_count = $this->model->getCount('таблица_с_сообщениями', '*');

Ris

Смотрите я вывожу его как виджет на главном вот



Вот сам виджет

  1. <?php
  2. class widgetUsersList extends cmsWidget {
  3.  
  4. public function run(){
  5.  
  6. $show = $this->getOption('show', 'all');
  7. $dataset = $this->getOption('dataset', 'latest');
  8. $groups = $this->getOption('groups');
  9. $list_fields = $this->getOption('list_fields');
  10.  
  11. $user = cmsUser::getInstance();
  12. $model = cmsCore::getModel('users');
  13.  
  14. $model->filterEqual("id", $user->id); Вот добавил.
  15. $mess_count = $model->getCount('users_messages', 'is_new'); Вот добавил.
  16.  
  17. $fields = array();
  18.  
  19. if($list_fields){
  20.  
  21. $content_model = cmsCore::getModel('content');
  22. $content_model->setTablePrefix('')->orderBy('ordering');
  23. $content_model->filterIn('id', $list_fields);
  24. $fields = $content_model->getContentFields('cms_users');
  25.  
  26. }
  27.  
  28. list($fields, $model) = cmsEventsManager::hook('profiles_list_filter', array($fields, $model));
  29.  
  30. switch ($show){
  31.  
  32. case 'friends':
  33. if (!$user->is_logged) { return false; }
  34. $model->filterFriends($user->id);
  35. break;
  36.  
  37. case 'friends_online':
  38. if (!$user->is_logged) { return false; }
  39. $model->filterFriends($user->id);
  40. $model->joinInner('sessions_online', 'online', 'i.id = online.user_id');
  41. break;
  42.  
  43. }
  44.  
  45. switch ($dataset){
  46. case 'latest': $model->orderBy('date_reg', 'desc');
  47. break;
  48. case 'rating': $model->orderBy('karma desc, rating desc');
  49. break;
  50. case 'popular': $model->orderBy('friends_count', 'desc');
  51. break;
  52. case 'date_log': $model->orderBy('date_log', 'desc');
  53. break;
  54. }
  55.  
  56. if ($groups){
  57. $model->filterGroups($groups);
  58. }
  59.  
  60. $profiles = $model->limit($this->getOption('limit', 10))->getUsers();
  61. if (!$profiles) { return false; }
  62.  
  63. if($fields){
  64. foreach ($profiles as $key => $profile) {
  65. foreach($fields as $field){
  66.  
  67. if (!isset($profile[$field['name']])) { continue; }
  68. if ($field['groups_read'] && !$user->isInGroups($field['groups_read'])) { continue; }
  69. if (!$profile[$field['name']] && $profile[$field['name']] !== '0') { continue; }
  70.  
  71. if (!isset($field['options']['label_in_list'])) {
  72. $label_pos = 'none';
  73. } else {
  74. $label_pos = $field['options']['label_in_list'];
  75. }
  76.  
  77. $field_html = $field['handler']->setItem($profile)->parseTeaser($profile[$field['name']]);
  78. if (!$field_html) { continue; }
  79.  
  80. $profiles[$key]['fields'][$field['name']] = array(
  81. 'label_pos' => $label_pos,
  82. 'type' => $field['type'],
  83. 'name' => $field['name'],
  84. 'title' => $field['title'],
  85. 'html' => $field_html
  86. );
  87.  
  88. }
  89. }
  90. }
  91.  
  92. return array(
  93. 'profiles' => $profiles,
  94. 'style' => $this->getOption('style', 'list'),
  95. 'is_avatars' => $this->getOption('is_avatars')
  96. );
  97.  
  98. }
  99.  
  100. }
После добавления фильтруется все пользователи и остается в только свой.
#7 17 декабря 2017 в 18:36
Нико,
Так теперь этот $mess_count надо как-то в шаблоне виджета вывести.
И в return добавьте
  1. 'mess_count' => $mess_count
#8 17 декабря 2017 в 18:52


Нико,
Так теперь этот $mess_count надо как-то в шаблоне виджета вывести.
И в return добавьте

  1. 'mess_count' => $mess_count

Ris

Мне просто нужно как то вот этот чат вывести с боку и что бы всегда было открыто типо этого


Вот добавил в шаблон

return array(
'profiles' => $profiles,
'mess_count' => $mess_count,
'style' => $this->getOption('style', 'list'),
'is_avatars' => $this->getOption('is_avatars')
);

На фотке 1 появился с рядом именем но контакты пропали остался только пользователь под своим ид
#9 17 декабря 2017 в 19:29
Нико,
php ни на что не ругается? Отладка включена? В консоли никаких предупреждений?
#10 17 декабря 2017 в 19:35


Нико,
php ни на что не ругается? Отладка включена? В консоли никаких предупреждений?

Ris

Нет все работает, мы просто отфильтровали

  1. $model->filterEqual("id", $user->id);
#11 17 декабря 2017 в 19:36


Нико,
php ни на что не ругается? Отладка включена? В консоли никаких предупреждений?

Ris

#12 17 декабря 2017 в 19:51
Нико,
А, так тогда
  1. $this->model->filterEqual("from_id", $user_id);
#13 17 декабря 2017 в 20:08


Нико,
А, так тогда

  1. $this->model->filterEqual("from_id", $user_id);

Ris

Я знаю что вы говорите но не сработает, а join делал не получается для виджета сделать это.

  1. <?php
  2. class widgetUsersList extends cmsWidget {
  3.  
  4. public function run(){
  5.  
  6. $show = $this->getOption('show', 'all');
  7. $dataset = $this->getOption('dataset', 'latest');
  8. $groups = $this->getOption('groups');
  9. $list_fields = $this->getOption('list_fields');
  10.  
  11. $user = cmsUser::getInstance();
  12. $model = cmsCore::getModel('users');
  13.  
  14. //$model->filterEqual("from_id", $user->id);
  15. //$mess_count = $model->getCount('users_messages', 'is_new');
  16.  
  17. $fields = array();
  18.  
  19. if($list_fields){
  20.  
  21. $content_model = cmsCore::getModel('content');
  22. $content_model->setTablePrefix('')->orderBy('ordering');
  23. $content_model->filterIn('id', $list_fields);
  24. $fields = $content_model->getContentFields('cms_users');
  25.  
  26. }
  27.  
  28. list($fields, $model) = cmsEventsManager::hook('profiles_list_filter', array($fields, $model));
  29.  
  30. switch ($show){
  31.  
  32. case 'friends':
  33. if (!$user->is_logged) { return false; }
  34. $model->filterFriends($user->id);
  35. break;
  36.  
  37. case 'friends_online':
  38. if (!$user->is_logged) { return false; }
  39. $model->filterFriends($user->id);
  40. $model->joinInner('sessions_online', 'online', 'i.id = online.user_id');
  41. break;
  42.  
  43. }
  44.  
  45. switch ($dataset){
  46. case 'latest': $model->orderBy('date_reg', 'desc');
  47. break;
  48. case 'rating': $model->orderBy('karma desc, rating desc');
  49. break;
  50. case 'popular': $model->orderBy('friends_count', 'desc');
  51. break;
  52. case 'date_log': $model->orderBy('date_log', 'desc');
  53. break;
  54. }
  55.  
  56. if ($groups){
  57. $model->filterGroups($groups);
  58. }
  59.  
  60. $profiles = $model->limit($this->getOption('limit', 10))->getUsers();
  61. if (!$profiles) { return false; }
  62.  
  63. if($fields){
  64. foreach ($profiles as $key => $profile) {
  65. foreach($fields as $field){
  66.  
  67. if (!isset($profile[$field['name']])) { continue; }
  68. if ($field['groups_read'] && !$user->isInGroups($field['groups_read'])) { continue; }
  69. if (!$profile[$field['name']] && $profile[$field['name']] !== '0') { continue; }
  70.  
  71. if (!isset($field['options']['label_in_list'])) {
  72. $label_pos = 'none';
  73. } else {
  74. $label_pos = $field['options']['label_in_list'];
  75. }
  76.  
  77. $field_html = $field['handler']->setItem($profile)->parseTeaser($profile[$field['name']]);
  78. if (!$field_html) { continue; }
  79.  
  80. $profiles[$key]['fields'][$field['name']] = array(
  81. 'label_pos' => $label_pos,
  82. 'type' => $field['type'],
  83. 'name' => $field['name'],
  84. 'title' => $field['title'],
  85. 'html' => $field_html
  86. );
  87.  
  88. }
  89. }
  90. }
  91.  
  92. return array(
  93. 'profiles' => $profiles,
  94. 'mess_count' => $mess_count,
  95. 'style' => $this->getOption('style', 'list'),
  96. 'is_avatars' => $this->getOption('is_avatars')
  97. );
  98.  
  99. }
  100.  
  101. }
  102.  
Код виджета
#14 17 декабря 2017 в 21:22
Нико,
В смысле нужно в виджете вывода юзеров вывести, сколько он сообщений написал?
Сейчас гляну, как сделать.
=====================================================================
В общем найдите в файле \templates\default\controllers\users\widgets\list\list.tpl.php строку:
  1. <a href="<?php echo $url; ?>"><?php html($profile['nickname']); ?></a>
И замените на такую:
  1. <a href="<?php echo $url; ?>"><?php html($profile['nickname']); echo ' ('.cmsCore::getModel('messages')->filterEqual('from_id', $profile['id'])->getCount('users_messages', 'id').')';?></a>
Будет выглядеть так:
#15 17 декабря 2017 в 22:43


Нико,
В смысле нужно в виджете вывода юзеров вывести, сколько он сообщений написал?
Сейчас гляну, как сделать.
=====================================================================
В общем найдите в файле \templates\default\controllers\users\widgets\list\list.tpl.php строку:

  1.  
  2.  

Ris

Да спасибо большое вывелось, а вот так если сделать будет исчислять только непрочитанные.
  1. filterEqual('is_new', 1)->
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.