IS_VOTED?

Организовать проверку на проголосованность юзера.

#16 6 февраля 2015 в 22:35
в комментариях, в первой ветке, проголосовавшие юзеры запоминаются в таблице cms_comment_votes

Но за каждый вопрос голосуют десятки юзеров. И их через запятую в одно поле?

HiAndy
Да именно так бы я и сделал, учитывая структуру базы данных
#17 6 февраля 2015 в 22:36

Но за каждый вопрос голосуют десятки юзеров. И их через запятую в одно поле?

HiAndy
да, именно. Для этого нужно использовать implode/explode
#18 6 февраля 2015 в 23:07
Rossoman,
Спасибо за совет, но боюсь при моем знании пехапе я пока не готов к реализации данного метода.
Пока попробую изучить, что написали умные люди в файле components/comments/model.php

  1. public function getComments($only_published=true, $is_tree=false, $from_module = false) {
  2.  
  3. $inUser = cmsUser::getInstance();
  4.  
  5. $comments = array();
  6.  
  7. global $_LANG;
  8.  
  9. $published = $only_published ? 'c.published = 1' : '1=1';
  10.  
  11. $sql = "SELECT c.*,
  12. IFNULL(u.nickname, 0) as nickname,
  13. IFNULL(u.login, 0) as login,
  14. IFNULL(u.is_deleted, 0) as is_deleted,
  15. IFNULL(p.imageurl, 0) as imageurl,
  16. IFNULL(p.gender, 0) as gender
  17. FROM cms_comments c
  18. LEFT JOIN cms_users u ON u.id = c.user_id
  19. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  20. WHERE {$published}
  21. {$this->inDB->where}
  22.  
  23. {$this->inDB->group_by}
  24.  
  25. {$this->inDB->order_by}\n";
  26.  
  27. if ($this->inDB->limit){
  28. $sql .= "LIMIT {$this->inDB->limit}";
  29. }
  30.  
  31. $result = $this->inDB->query($sql);
  32.  
  33. $this->inDB->resetConditions();
  34.  
  35. if (!$this->inDB->num_rows($result)) { return array(); }
  36.  
  37. while($comment = $this->inDB->fetch_assoc($result)){
  38.  
  39. $comment['level'] = 0;
  40. $comment['is_editable'] = $this->isEditable($comment['pubdate']);
  41. $comment['fpubdate'] = cmsCore::dateFormat($comment['pubdate'], true, true);
  42.  
  43. if ($comment['guestname']){
  44. $comment['author'] = $comment['guestname'];
  45. $comment['is_profile'] = false;
  46. $comment['ip'] = in_array($this->config['cmm_ip'], array(1,2)) ? $comment['ip'] : '';
  47. } else {
  48. $comment['author']['nickname'] = $comment['nickname'];
  49. $comment['author']['login'] = $comment['login'];
  50. $comment['is_profile'] = true;
  51. $comment['user_image'] = cmsUser::getUserAvatarUrl($comment['user_id'], 'small', $comment['imageurl'], $comment['is_deleted']);
  52. $comment['ip'] = ($this->config['cmm_ip'] == 2 && $comment['ip']) ? $comment['ip'] : '';
  53. }
  54.  
  55. switch ($comment['gender']){
  56. case 'm': $comment['gender'] = $_LANG['COMMENTS_MALE'];
  57. break;
  58. case 'f': $comment['gender'] = $_LANG['COMMENTS_FEMALE'];
  59. break;
  60. default: $comment['gender'] = $_LANG['COMMENTS_GENDER'];
  61. }
  62.  
  63. $comment['show'] = (!$this->config['min_karma'] || $comment['rating'] >= $this->config['min_karma_show']) || cmsUser::userIsAdmin($comment['user_id']);
  64. $comment['is_my'] = ($inUser->id == $comment['user_id']);
  65. if ($inUser->id){
  66. $comment['is_voted'] = $comment['is_my'] ? true : cmsUser::isRateUser('comment', $inUser->id, $comment['id']);
  67. } else {
  68. $comment['is_voted'] = true;
  69. }
  70.  
  71. $comments[] = $comment;
  72.  
  73. }
  74.  
  75. if($is_tree){
  76. $comments = $this->buildTree(0, 0, $comments);
  77. }
  78.  
  79. return $from_module ? cmsCore::callEvent('GET_COMMENTS_MODULE', $comments) : cmsCore::callEvent('GET_COMMENTS', $comments);
  80.  
  81. }
Попробую сделать по аналогии.
По крайней мере в таблице cms_comments в столбце "рейтинг" ничего через запятую нет, А однажды оценивший комментарий пользователь повторно голосовалки не видит.
#19 6 февраля 2015 в 23:10


Rossoman,
Спасибо за совет, но боюсь при моем знании пехапе я пока не готов к реализации данного метода.
Пока попробую изучить, что написали умные люди в файле components/comments/model.php

  1. public function getComments($only_published=true, $is_tree=false, $from_module = false) {
  2.  
  3. $inUser = cmsUser::getInstance();
  4.  
  5. $comments = array();
  6.  
  7. global $_LANG;
  8.  
  9. $published = $only_published ? 'c.published = 1' : '1=1';
  10.  
  11. $sql = "SELECT c.*,
  12. IFNULL(u.nickname, 0) as nickname,
  13. IFNULL(u.login, 0) as login,
  14. IFNULL(u.is_deleted, 0) as is_deleted,
  15. IFNULL(p.imageurl, 0) as imageurl,
  16. IFNULL(p.gender, 0) as gender
  17. FROM cms_comments c
  18. LEFT JOIN cms_users u ON u.id = c.user_id
  19. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  20. WHERE {$published}
  21. {$this->inDB->where}
  22.  
  23. {$this->inDB->group_by}
  24.  
  25. {$this->inDB->order_by}\n";
  26.  
  27. if ($this->inDB->limit){
  28. $sql .= "LIMIT {$this->inDB->limit}";
  29. }
  30.  
  31. $result = $this->inDB->query($sql);
  32.  
  33. $this->inDB->resetConditions();
  34.  
  35. if (!$this->inDB->num_rows($result)) { return array(); }
  36.  
  37. while($comment = $this->inDB->fetch_assoc($result)){
  38.  
  39. $comment['level'] = 0;
  40. $comment['is_editable'] = $this->isEditable($comment['pubdate']);
  41. $comment['fpubdate'] = cmsCore::dateFormat($comment['pubdate'], true, true);
  42.  
  43. if ($comment['guestname']){
  44. $comment['author'] = $comment['guestname'];
  45. $comment['is_profile'] = false;
  46. $comment['ip'] = in_array($this->config['cmm_ip'], array(1,2)) ? $comment['ip'] : '';
  47. } else {
  48. $comment['author']['nickname'] = $comment['nickname'];
  49. $comment['author']['login'] = $comment['login'];
  50. $comment['is_profile'] = true;
  51. $comment['user_image'] = cmsUser::getUserAvatarUrl($comment['user_id'], 'small', $comment['imageurl'], $comment['is_deleted']);
  52. $comment['ip'] = ($this->config['cmm_ip'] == 2 && $comment['ip']) ? $comment['ip'] : '';
  53. }
  54.  
  55. switch ($comment['gender']){
  56. case 'm': $comment['gender'] = $_LANG['COMMENTS_MALE'];
  57. break;
  58. case 'f': $comment['gender'] = $_LANG['COMMENTS_FEMALE'];
  59. break;
  60. default: $comment['gender'] = $_LANG['COMMENTS_GENDER'];
  61. }
  62.  
  63. $comment['show'] = (!$this->config['min_karma'] || $comment['rating'] >= $this->config['min_karma_show']) || cmsUser::userIsAdmin($comment['user_id']);
  64. $comment['is_my'] = ($inUser->id == $comment['user_id']);
  65. if ($inUser->id){
  66. $comment['is_voted'] = $comment['is_my'] ? true : cmsUser::isRateUser('comment', $inUser->id, $comment['id']);
  67. } else {
  68. $comment['is_voted'] = true;
  69. }
  70.  
  71. $comments[] = $comment;
  72.  
  73. }
  74.  
  75. if($is_tree){
  76. $comments = $this->buildTree(0, 0, $comments);
  77. }
  78.  
  79. return $from_module ? cmsCore::callEvent('GET_COMMENTS_MODULE', $comments) : cmsCore::callEvent('GET_COMMENTS', $comments);
  80.  
  81. }
Попробую сделать по аналогии.
По крайней мере в таблице cms_comments в столбце "рейтинг" ничего через запятую нет, А однажды оценивший комментарий пользователь повторно голосовалки не видит.

HiAndy

В данной функции получаются все комментарии
#20 6 февраля 2015 в 23:23
Rossoman,
Меня интересует, как оно определяет is_voted?
И почему у меня не получается переделать данную процедуру просто скопировав функцию в модель моего компонента и переименовав все слова "comment" в "faq".
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.