Универсальный каталог(голосование)

#1 1 августа 2011 в 12:40
В УК есть функция "оценка" Оценить запись в каталоге можно только 1 раз.
Можно ли сделать, что бы оценку можно было давать раз в сутки. И как это сделать или хотя бы приблизительно где искать.
#2 1 августа 2011 в 12:50
Возможно ошибаюсь. Обычно такие голосовалки завязаны либо на сессии либо на куки…
#3 1 августа 2011 в 15:36
Как это в универсальном каталоге сделать?
#4 1 августа 2011 в 17:53
Поглядите на этот код. Ограничение по ip и LIMIT 1.

файл components\catalog\frontend.php

  1. function ratingData($item_id){
  2. $inCore = cmsCore::getInstance();
  3. $inDB = cmsDatabase::getInstance();
  4. $sql = "SELECT *, IFNULL(AVG(points), 0) as rating, COUNT(id) as votes
  5. FROM cms_uc_ratings
  6. WHERE item_id = $item_id
  7. GROUP BY item_id";
  8. $result = $inDB->query($sql) ;
  9. if ($inDB->num_rows($result)){
  10. $data = $inDB->fetch_assoc($result);
  11. } else {
  12. $data['rating'] = 0;
  13. $data['votes'] = 0;
  14. }
  15. return $data;
  16. }
  17.  
  18. function buildRating($rating){
  19. $inCore = cmsCore::getInstance();
  20. $inDB = cmsDatabase::getInstance();
  21. global $_LANG;
  22. $rating = round($rating, 2);
  23. $html = '<a href="#" title="'.$_LANG['RATING'].': '.$rating.'">';
  24. for($r = 1; $r < 5; $r++){
  25. if (round($rating) > $r){
  26. $html .= '<img src="/images/ratings/starfull.gif" border="0" style="padding:0;border:0;margin:0" />';
  27. } else {
  28. $html .= '<img src="/images/ratings/starhalf.gif" border="0" style="padding:0;border:0;margin:0" />';
  29. }
  30. }
  31. $html .= '</a>';
  32. return $html;
  33. }
  34.  
  35. function alreadyVoted($item_id){
  36. $inCore = cmsCore::getInstance();
  37. $inDB = cmsDatabase::getInstance();
  38. $ip = $_SERVER['REMOTE_ADDR'];
  39. $sql = "SELECT points FROM cms_uc_ratings WHERE item_id = $item_id AND ip = '$ip' LIMIT 1";
  40. $result = $inDB->query($sql) ;
  41. if ($inDB->num_rows($result)){
  42. $data = $inDB->fetch_assoc($result);
  43.  
  44. return (int)$data['points'];
  45. }
  46. return false;
  47. }
  48.  
  49. function ratingForm($ratingdata, $item_id){
  50. $inCore = cmsCore::getInstance();
  51. $inDB = cmsDatabase::getInstance();
  52. $inUser = cmsUser::getInstance();
  53. $userid=$inUser->id;
  54. global $_LANG;
  55. $html = '';
  56. $html .= '<form name="rateform" action="" method="POST"><div class="uc_detailrating" style="margin:20px 0"><table><tr>' ."\n";
  57. $html .= '<td width="90">'."\n";
  58. $html .= '<strong>'.$_LANG['RATING'].':</strong> <span style="font-family:Georgia, Times New Roman, Times, serif; font-size:16px">'.round($ratingdata['rating'], 2).'</span>'."\n";
  59. $html .= '</td>'."\n";
  60. $html .= '<td width="100" valign="middle">'."\n";
  61. $html .= buildRating($ratingdata['rating'])."\n";
  62. $html .= '</td>'."\n";
  63. $html .= '<td width="50">'."\n";
  64. $html .= ''.$_LANG['VOTES'].': '."\n";
  65. $html .= '</td>'."\n";
  66. $html .= '<td width="40" valign="middle">'."\n";
  67. $html .= '<span style="font-family:Georgia, Times New Roman, Times, serif; font-size:16px">'.$ratingdata['votes'].'</span>'."\n";
  68. $html .= '</td>'."\n";
  69.  
  70.  
  71. $userdata = $inDB->get_field('cms_uc_items', "id=$item_id", 'user_id');
  72. if ($userdata==$userid) {} else {
  73.  
  74. $html .= '<td width="100">'."\n";
  75. $html .= '<strong>'.$_LANG['YOUR_VOTE'].':</strong>'."\n";
  76. $html .= '</td>'."\n";
  77.  
  78.  
  79. $html .= '<td width="" align=left> '."\n";
  80.  
  81.  
  82. $myvote = alreadyVoted($item_id);
  83. if (!$myvote){
  84.  
  85. $html .= '<input type="hidden" name="rating" value="1"/>'."\n";
  86. $html .= '<input type="hidden" name="item_id" value="'.$item_id.'"/>'."\n";
  87.  
  88.  
  89.  
  90. $html .= '<select name="points" style="width:50px" onchange="document.rateform.submit();">'."\n";
  91. $html .= '<option value="-1"> -- </option>'."\n";
  92. for($p=1; $p<=5; $p++) { $html .= '<option value="'.$p.'">'.$p.'</option>'."\n"; }
  93. $html .= '</select>'."\n";
  94.  
  95. } else {
  96. $html .= '<span style="font-family:Georgia, Times New Roman, Times, serif; font-size:16px">'.$myvote.'</span>';
  97. }
  98. $html .= '</td>'."\n";
  99. }
  100. $html .= '</tr></table></div></form>'."\n";
  101. return $html;
  102. }
  103.  

  1. //////////////////////////// RATING SUBMISSION ///////////////////////////////////////////////////////////////////
  2. if ($inCore->inRequest('rating')){
  3. $inUser = cmsUser::getInstance();
  4. $user_id = $inUser->id;
  5. $points = $inCore->request('points', 'int', 0);
  6. $item_id = $inCore->request('item_id', 'int', 0);
  7. $ip = $_SERVER['REMOTE_ADDR'];
  8. if (!alreadyVoted($item_id)){
  9. $inDB->query("INSERT INTO cms_uc_ratings (item_id, points, ip, user_id) VALUES ($item_id, $points, '$ip', '$user_id')") ;
  10. $inDB->query("DELETE FROM cms_uc_ratings WHERE item_id = $item_id AND ip = '0.0.0.0'") ;
  11. $url = $_SERVER['REQUEST_URI'];
  12. header('Location: '.$url);
  13. else
  14. echo '';
  15. exit();
  16. }
  17. }
#5 2 августа 2011 в 14:49
Я так понял, что лимит стоит 1 раз на один ип. А вот как правильно написать, что бы можно было 1 раз в 24 часа? для это нужны кукисы?
#6 2 августа 2011 в 15:31
Если сделать возможность голосовать 1 раз в сутки. по типу как в доске объявлений в настройках можно выставить 1 объявление в сутки.
то есть прописать права для пользователя 1 раз в сутки голосовать. как бы только это сделать)
#7 2 августа 2011 в 16:18
не нужны нам КУКУ :)

я тут поднятие объявления один раз в сутки(т.е. просто обновлял дату на текущию) реализовывал. на основе этой функци… поглядите.


  1.  
  2.  
  3. function upData($item_id){
  4. $inCore = cmsCore::getInstance();
  5. $inDB = cmsDatabase::getInstance();
  6. $sql = "SELECT up FROM cms_uc_items WHERE id = $item_id";
  7. $result = $inDB->query($sql) ;
  8. if ($inDB->num_rows($result)){
  9. $up_data = $inDB->fetch_assoc($result);
  10. } else {
  11. $up_data['up'] = 0;
  12.  
  13. }
  14.  
  15. return $up_data;
  16. }
  17. function buildUp($up){
  18. $inCore = cmsCore::getInstance();
  19. $inDB = cmsDatabase::getInstance();
  20. global $_LANG;
  21. $up = round($up, 2);
  22. $html = ''.$up.'';
  23. return $html;
  24. }
  25.  
  26. function alreadyUp($item_id){
  27. $inCore = cmsCore::getInstance();
  28. $inDB = cmsDatabase::getInstance();
  29. $inUser = cmsUser::getInstance();
  30. $user_id = $inUser->id;
  31. $sql = "SELECT up FROM cms_uc_items WHERE id = '$item_id' AND user_id = '$user_id'";
  32. $result = $inDB->query($sql) ;
  33. if ($inDB->num_rows($result)){
  34. $up_data = $inDB->fetch_assoc($result);
  35. return (int)$up_data['up'];
  36.  
  37. }
  38. return false;
  39. }
  40.  
  41. function alreadyUp2($item_id){
  42. $inCore = cmsCore::getInstance();
  43. $inDB = cmsDatabase::getInstance();
  44. $inUser = cmsUser::getInstance();
  45. $user_id = $inUser->id;
  46. $sql = "SELECT up FROM cms_uc_items WHERE id = '$item_id' AND user_id = '$user_id'";
  47. $result = $inDB->query($sql) ;
  48. if ($inDB->num_rows($result)){
  49. $up_data = $inDB->fetch_assoc($result);
  50. return $up_data['up'];
  51.  
  52. }
  53. return false;
  54. }
  55.  
  56. function upForm($update, $item_id){
  57. $inCore = cmsCore::getInstance();
  58. $inDB = cmsDatabase::getInstance();
  59. $update = date('Y-m-d');
  60. global $_LANG;
  61. $myup = alreadyUp($item_id);
  62. $html = '';
  63.  
  64. $html .= '<form name="upform" action="" method="POST" style="display:inline;margin-left:10px">' ."\n";
  65. if (!$myup){
  66. $html .= '<input type="hidden" name="item_id" value="'.$item_id.'"/>'."\n";
  67. $html .= '<input type="hidden" name="update" value="'.$update.'"/>'."\n";
  68. $html .= '<input type="button" onclick="document.upform.submit();" value="'.$_LANG['up'].'" style="font-size:14px">'."\n";
  69. }
  70. if (alreadyUp2($item_id) == '0000-00-00') { $html .= '';}
  71.  
  72. elseif (alreadyUp2($item_id) == date('Y-m-d')){
  73. $html .= '<div class="o" style="padding:5px;background:yellow;float:left">'.$_LANG['up2'].'</div>';
  74. }
  75. elseif (alreadyUp2($item_id) < date('Y-m-d')){
  76. $html .= '<input type="hidden" name="item_id" value="'.$item_id.'"/>'."\n";
  77. $html .= '<input type="hidden" name="update" value="'.$update.'"/>'."\n";
  78. $html .= '<input type="button" onclick="document.upform.submit();" value="'.$_LANG['up'].'" style="font-size:14px">'."\n";
  79. }
  80.  
  81. else { $html .= alreadyUp2($item_id); }
  82.  
  83. $html .= '</form>'."\n";
  84.  
  85. return $html;
  86. }
  87.  
  88.  
и далее
  1. $upForm = upForm($updata, $item['id']);
и далее передаем форму в шаблон
  1. $smarty->assign('upForm', $upForm);

и в базу заносим
  1.  
  2. if ($inCore->inRequest('update')){
  3. $update = date('Y-m-d H:i');
  4. $update = $inCore->request('update', 'str', 0);
  5. $item_id = $inCore->request('item_id', 'int', 0);
  6.  
  7. $inDB->query("UPDATE cms_uc_items SET up='$update' WHERE id=$item_id") ;
  8.  
  9. $url = $_SERVER['REQUEST_URI'];
  10. header('Location: '.$url);
  11. else
  12. echo '';
  13. exit();
  14.  
  15. }
п.с. если вдруг кого заинтиресует эта функция могу подробное описание сделать…
#8 2 августа 2011 в 22:10
Я еще не настолько сильно разбираюсь в пхп к сожалению( только начинаю. По этому я примерно понимаю, что тут описано но как это переделать в УК и осуществить не знаю. А обновление даты происходит автоматически или руками обновлять?
#9 16 ноября 2011 в 09:27

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

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