история комментариев на аякс

1688
Здравствуйте. Теперь это выглядет так
и это больше не модуль. Просто дополнение к комментариям. Выводит историю каждого комментария отдельно. Если используете этот вариант модуль следует отключить или удалить.

1.Заменить ф-цию
Код PHP:
  1. public function getRComment($id)
в /components/comments/model.php на эту
Код PHP:
  1.  
  2. public function getRating($id,$target_id) {
  3.  
  4.  
  5. $sql = "SELECT r.*,
  6. u.nickname as nickname,
  7. u.login as login,c.id as cid
  8.  
  9. FROM cms_ratings r
  10. LEFT JOIN cms_comments c ON c.target_id=$target_id AND r.item_id=c.id
  11. LEFT JOIN cms_users u ON u.id = r.user_id
  12. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  13. WHERE item_id=$id ";
  14.  
  15.  
  16. $result = $this->inDB->query($sql);
  17.  
  18. if (!$this->inDB->num_rows($result)) { return false; }
  19.  
  20. while($rating = $this->inDB->fetch_assoc($result)){
  21.  
  22. $rating ['rnick'] = implode($this->r_User($rating ['user_id']));
  23. $rating ['rlogin'] = implode($this->l_User($rating ['user_id']));
  24.  
  25. $ratings[] = $rating ;
  26.  
  27. }
  28. return $ratings;
  29.  
  30. }
создать файл history.php следующего содержания
Код PHP:
  1. <?php
  2. /******************************************************************************/
  3. // //
  4. // InstantCMS v1.10.4 //
  5. // http://instantcms.ru/ //
  6. // //
  7. // written by InstantCMS Team, 2007-2014 //
  8. // produced by InstantSoft, (www.instantsoft.ru) //
  9. // //
  10. // LICENSED BY GNU/GPL v2 //
  11. // //
  12. /******************************************************************************/
  13.  
  14. define('PATH', $_SERVER['DOCUMENT_ROOT']);
  15. include(PATH.'/core/ajax/ajax_core.php');
  16.  
  17. $do = cmsCore::request('action', 'str', 'add');
  18. $target = cmsCore::request('target', 'str', '');
  19. $target_id = cmsCore::request('target_id', 'int', 0);
  20. $comment_id = cmsCore::request('id', 'int', 0);
  21.  
  22. if ($do == 'view' && !$comment_id) { cmsCore::halt(); }
  23.  
  24. cmsCore::loadModel('comments');
  25. $model = new cms_model_comments();
  26.  
  27. // Проверяем включен ли компонент
  28. if(!$inCore->isComponentEnable('comments')) { cmsCore::halt(); }
  29.  
  30. if ($do=='view'){
  31.  
  32. $inCore = cmsCore::getInstance();
  33. $inDB = cmsDatabase::getInstance();
  34. $inUser = cmsUser::getInstance();
  35.  
  36. $spyer = $model->getRating($comment_id,$target_id);
  37.  
  38. cmsPage::initTemplate('components', 'com_comments_history')->
  39. assign('do', $do)->
  40. assign('spyer', $spyer)->
  41. assign('is_user', $inUser->id)->
  42. display('com_comments_history.tpl');
  43.  
  44. cmsCore::halt();
  45. }
  46. ?>
и поместить его в /components/comments/
В /components/comments/frontend.php в строке 39 ( у меня) добавить 'SHOW_HISTORY' станет так:
Код PHP:
  1. $inPage->addHeadJsLang(array('EDIT_COMMENT','CONFIRM_DEL_COMMENT','COMMENT_IN_LINK','SHOW_HISTORY'));
В файл /languages/ru/components/comments.php добавить
Код PHP:
  1. $_LANG['HISTORY'] = 'История';
  2. $_LANG['SHOW_HISTORY'] = 'История рейтинга';
В файл /components/comments/js/comments.js добавить ф-цию
Код PHP:
  1. function showHistory(comment_id){
  2. core.message(LANG_SHOW_HISTORY);
  3. $.post('/components/comments/history.php', {action: 'view',id: comment_id}, function(data) {
  4. if(data) {
  5. $('#popup_ok').show();
  6. $('#popup_message').html(data);
  7. $('#popup_progress').hide();
  8. }
  9. });
  10.  
  11. }
Создать файл com_comments_history.tpl
Код PHP:
  1. {foreach key=cid item=spyers from=$spyer}
  2.  
  3. <table style="width:400px; height:auto">
  4. <tr>
  5. <td width="100"><a href="{profile_url login=$spyers.rlogin}" >{$spyers.rnick}</a></td>
  6.  
  7. <td width="100">
  8. <span class="">
  9. {if $spyers.points>0}
  10. <span class="cmm_good">+{$spyers.points}</span>
  11. {else}<span class="cmm_bad">-{$spyers.points}{/if}</span>
  12. </span>
  13. </td>
  14.  
  15. <td width="150">{$spyers.pubdate}</td>
  16. </tr>
  17. </table>
  18.  
  19. {/foreach}
Ну и в файл com_comments_list.tpl вставить ссылку после
Код PHP:
  1. {else}
  2. {$comment.rating}
  3. {/if}
  4. </span>
Код PHP:
  1. <span>
  2. <div style="float:right " ><a class="ajaxlink" href="javascript:" onclick="showHistory('{$comment.id}', '{csrf_token}')">{$LANG.HISTORY}</a></div>
  3. </span>
Вроде всё.

P.S.кнопку "продолжить" в окне убирать не стал, не хочется что то менять в системе. А переделывать лень.
P.P.S.
Для тех кому религия не позволяет пользоваться Аяксом, файл history.php выглядет так
Код PHP:
  1. cmsCore::loadModel('comments');
  2. $model = new cms_model_comments();
  3.  
  4. $target = cmsCore::request('target', 'str', '');
  5. $target_id = cmsCore::request('target_id', 'int', 0);
  6. $comment_id = cmsCore::request('comment_id', 'int');
  7.  
  8. if($hdo == 'view'){
  9. $spyer = $model->getRating($comment_id,$target_id);
  10. print_r($id);
  11.  
  12. cmsPage::initTemplate('components', 'com_comments_history')->
  13. assign('do', $do)->
  14. assign('spyer', $spyer)->
  15. assign('is_user', $inUser->id)->
  16. display('com_comments_history.tpl');
  17. }


Ссылка в com_comments_list.tpl


Код PHP:
  1.  
  2. <span>
  3. <div style="float:right" ><a class="ajaxlink" href="/comments/{$comment.id}/history.html">{$LANG.HISTORY}</a></div>
  4. </span>
  5.  

В файл components/comments/frontend.php добавляем


Код PHP:
  1.  
  2. if ($do == 'history'){
  3.  
  4. $hdo = cmsCore::request('hdo','str','');
  5.  
  6. include 'components/comments/history.php';
  7.  
  8. }
  9.  

В файл components/comments/router.php добавляем


Код PHP:
  1.  
  2. $routes[] = array(
  3. '_uri' => '/^comments/([0-9]+)/history.html$/i',
  4. 'do' => 'history',
  5. 'hdo' => 'view',
  6. 1 => 'comment_id'
  7. );
  8.  
P.S.Пользователь Web4ik нашёл небольшой баг и в своём сообщении любезно предоставил решение
История рейтинга комментариев | Векторные иконки в меню
Комментарии (17)
Stecc 15 ноября 2014 в 23:48 0
Lora, спасибо вам огромное
Stecc 15 ноября 2014 в 23:50 0
При нажатие кнопки "Продолжить" никаких действий не происходит, да и помоему там вообще кнопки не нужны, кроме как ЗАКРЫТЬ сверху крестиком..
Lora 16 ноября 2014 в 00:11 +2
Придётся изменить форму, а она "одна на всех". Как то не хочется.
Stecc 16 ноября 2014 в 01:47 0
А может просто открывать стату в новом окне, без всяких аякс форм?
Lora 16 ноября 2014 в 03:10 +2
Можно. Немного попоже.
Lora 16 ноября 2014 в 04:53 +2
Готово. Добавил в пост.
Stecc 16 ноября 2014 в 13:23 0
Спасибо большое добрый человечек) smile
Lora 16 ноября 2014 в 18:40 +2
Успехов.
web4ik 12 июня 2015 в 22:30 0
Код PHP:
  1.  
  2. <?php
  3. /******************************************************************************/
  4. // //
  5. // InstantCMS v1.10.4 //
  6. // http://instantcms.ru/ //
  7. // //
  8. // written by InstantCMS Team, 2007-2014 //
  9. // produced by InstantSoft, (www.instantsoft.ru) //
  10. // //
  11. // LICENSED BY GNU/GPL v2 //
  12. // //
  13. /******************************************************************************/
  14.  
  15. define('PATH', $_SERVER['DOCUMENT_ROOT']);
  16. include(PATH.'/core/ajax/ajax_core.php');
  17.  
  18. $do = cmsCore::request('action', 'str', 'add');
  19. $target = cmsCore::request('target', 'str', '');
  20. $target_id = cmsCore::request('target_id', 'int', 0);
  21. $comment_id = cmsCore::request('id', 'int', 0);
  22.  
  23. if ($do == 'view' && !$comment_id) { cmsCore::halt(); }
  24.  
  25. cmsCore::loadModel('comments');
  26. $model = new cms_model_comments();
  27.  
  28. // Проверяем включен ли компонент
  29. if(!$inCore->isComponentEnable('comments')) { cmsCore::halt(); }
  30.  
  31. if ($do=='view'){
  32.  
  33. $inCore = cmsCore::getInstance();
  34. $inDB = cmsDatabase::getInstance();
  35. $inUser = cmsUser::getInstance();
  36.  
  37. $spyer = $model->getRating($comment_id,$target_id);
  38.  
  39. cmsPage::initTemplate('components', 'com_comments_history')->
  40. assign('do', $do)->
  41. assign('spyer', $spyer)->
  42. assign('is_user', $inUser->id)->
  43. display('com_comments_history.tpl');
  44.  
  45. cmsCore::halt();
  46. }
  47. ?>
  48.  
Вот тут необходимо поставить
Код PHP:
  1. cmsPage::initTemplate('components', 'com_comments_history.tpl')->
Иначе выдает ошибку instant 1.10.4
web4ik 12 июня 2015 в 22:43 0
Добавил данное решение на instant 1.10.4
При тестировании заметил следующую ошибку, (ставил на уже работающий инстант).
При голосовании заметил что когда добавляю голос, то там уже задним числом выдает еще кого-то, хотя комментарий добавлен только сегодня был.
Итого:
1.Статья добавлена сегодня.
2.Комментарий добавлен сегодня.
3.В статистике пишется +1 к комментарию
4.Открываешь посмотреть историю там еще показывает как будто бы кто-то голосовал, год назад, хотя такого быть не могло.
5.Проблема не с единичным комментарием, так происходит раз через два, часто.
Вот скрин:

Помогите пожалуйста разобраться в чем может быть проблема.
Заранее спасибо.
web4ik 13 июня 2015 в 16:30 +1
Спасибо HiAndy помог разобраться.
Дело в том, что отслеживается голосование за target_id
Если в таблице cms_ratings есть голоса за разный контент, но с одинаковым id - они все будут выведены в списке проголосовавших.

Надо доработать выборку из базы следующим образом:
Код PHP:
  1.  
  2. Код PHP:
  3. $sql = "SELECT r.*,
  4. u.nickname as nickname,
  5. u.login as login,c.id as cid
  6.  
  7. FROM cms_ratings r
  8. LEFT JOIN cms_users c ON item_id=$target_id AND r.item_id=c.id
  9. LEFT JOIN cms_users u ON u.id = r.user_id
  10.  
  11. WHERE target = 'comment' AND item_id=$id LIMIT 20";
  12.  
web4ik 14 июня 2015 в 14:49 0
Опишу подробнее во избежание ошибок и непонятностей.
(вот этот код который в функции public function getRating($id,$target_id)
Код PHP:
  1. $sql = "SELECT r.*,
  2. u.nickname as nickname,
  3. u.login as login,c.id as cid
  4.  
  5. FROM cms_ratings r
  6. LEFT JOIN cms_comments c ON c.target_id=$target_id AND r.item_id=c.id
  7. LEFT JOIN cms_users u ON u.id = r.user_id
  8. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  9. WHERE item_id=$id ";
заменить на этот:
Код PHP:
  1. $sql = "SELECT r.*,
  2. u.nickname as nickname,
  3. u.login as login,c.id as cid
  4.  
  5. FROM cms_ratings r
  6. LEFT JOIN cms_users c ON item_id=$target_id AND r.item_id=c.id
  7. LEFT JOIN cms_users u ON u.id = r.user_id
  8.  
  9. WHERE target = 'comment' AND item_id=$id LIMIT 20";
Ris 6 февраля 2016 в 16:45 0
Лёгкая модификация с небольшим облегчением кода, да простит меня автор - Lora.

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

Получаем весь компромат за одну выборку:
Спойлер
Функции r_user и l_user нинужны. Дополнения в роутере тоже.
Просмотр истории - только для админов, ибо нефиг!

Вот это распаковать в корень:
http://instantcms.ru/users/files/download5793.html
Если шаблон не дефолтный - туда в компоненты тоже засунуть файлы tpl из архива.
abasia 3 сентября 2018 в 18:29 0
Архив не доступен(((
Ris 3 сентября 2018 в 19:17 0
Значит кто-то из администрации сайта удалил. Я не трогал.
Я сейчас попробую это же сделать при помощи плагина. То есть без правки системных файлов.
Ris 3 сентября 2018 в 20:39 0
Посмотрел. Смысла городить плагины нет.
Вроде вот этот файл:
https://instantcms.ru/users/files/download5883.html
abasia 3 сентября 2018 в 23:54 0
Спасибо!