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

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

1.Заменить ф-цию
  1. public function getRComment($id)
в /components/comments/model.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 следующего содержания
  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' станет так:
  1. $inPage->addHeadJsLang(array('EDIT_COMMENT','CONFIRM_DEL_COMMENT','COMMENT_IN_LINK','SHOW_HISTORY'));
В файл /languages/ru/components/comments.php добавить
  1. $_LANG['HISTORY'] = 'История';
  2. $_LANG['SHOW_HISTORY'] = 'История рейтинга';
В файл /components/comments/js/comments.js добавить ф-цию
  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
  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 вставить ссылку после
  1. {else}
  2. {$comment.rating}
  3. {/if}
  4. </span>
  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 выглядет так
  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


  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 добавляем


  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 добавляем


  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 нашёл небольшой баг и в своём сообщении любезно предоставил решение
0
Stecc Stecc 9 лет назад #
Lora, спасибо вам огромное
0
Stecc Stecc 9 лет назад #
При нажатие кнопки "Продолжить" никаких действий не происходит, да и помоему там вообще кнопки не нужны, кроме как ЗАКРЫТЬ сверху крестиком..
+2
Lora Lora 9 лет назад #
Придётся изменить форму, а она "одна на всех". Как то не хочется.
0
Stecc Stecc 9 лет назад #
А может просто открывать стату в новом окне, без всяких аякс форм?
+2
Lora Lora 9 лет назад #
Можно. Немного попоже.
+2
Lora Lora 9 лет назад #
Готово. Добавил в пост.
0
Stecc Stecc 9 лет назад #
Спасибо большое добрый человечек) smile
+2
Lora Lora 9 лет назад #
Успехов.
0
web4ik web4ik 8 лет назад #
Код 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. define('PATH', $_SERVER['DOCUMENT_ROOT']);
  14. include(PATH.'/core/ajax/ajax_core.php');
  15. $do = cmsCore::request('action', 'str', 'add');
  16. $target = cmsCore::request('target', 'str', '');
  17. $target_id = cmsCore::request('target_id', 'int', 0);
  18. $comment_id = cmsCore::request('id', 'int', 0);
  19. if ($do == 'view' && !$comment_id) { cmsCore::halt(); }
  20. cmsCore::loadModel('comments');
  21. $model = new cms_model_comments();
  22. // Проверяем включен ли компонент
  23. if(!$inCore->isComponentEnable('comments')) { cmsCore::halt(); }
  24. if ($do=='view'){
  25. $inCore = cmsCore::getInstance();
  26. $inDB = cmsDatabase::getInstance();
  27. $inUser = cmsUser::getInstance();
  28. $spyer = $model->getRating($comment_id,$target_id);
  29. cmsPage::initTemplate('components', 'com_comments_history')->
  30. assign('do', $do)->
  31. assign('spyer', $spyer)->
  32. assign('is_user', $inUser->id)->
  33. display('com_comments_history.tpl');
  34. cmsCore::halt();
  35. }
  36. ?>
Вот тут необходимо поставить
Код PHP:
  1. cmsPage::initTemplate('components', 'com_comments_history.tpl')->
Иначе выдает ошибку instant 1.10.4
0
web4ik web4ik 8 лет назад #
Добавил данное решение на instant 1.10.4
При тестировании заметил следующую ошибку, (ставил на уже работающий инстант).
При голосовании заметил что когда добавляю голос, то там уже задним числом выдает еще кого-то, хотя комментарий добавлен только сегодня был.
Итого:
1.Статья добавлена сегодня.
2.Комментарий добавлен сегодня.
3.В статистике пишется +1 к комментарию
4.Открываешь посмотреть историю там еще показывает как будто бы кто-то голосовал, год назад, хотя такого быть не могло.
5.Проблема не с единичным комментарием, так происходит раз через два, часто.
Вот скрин:

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

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

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

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

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

Еще от автора

IcmsBilling
Компонент для организации монетизации на сайте. Бесплатная версия.
Форматирование текста
Компонент позволяет выделять текстовой блок и назначать ему нужный класс. Для версии 2.15.2
Система баллов
Компонент "Управление баллами". Служит для создание системы поощрения путём начисления баллов.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.