Хак: Оценка записей на стене пользователя (1.х)

+17
1.97K

Все привет!

Встала задача: добавить оценку записей на стене пользователей
Странно, но "из коробки" такой функционал отсутствует. Поискал на форуме и блогах — решения не нашел. Решил сделать.
На работу ушло минут 15-20 с учетом поиска и изучения имеющего функционала в других компонентах.

Я не жадный — делюсь с сообществом!

v


Модернизацию делал на основе компонента "Комментарии пользователей"
Пересчитывать рейтинг при удалении записи со стены я не стал, т.к. человек опубликует запись, получит минусов, удалит запись и его рейтинг пересчитается. Не честная игра!

Ниже расписываю шаги:
1. Добавляем вывод элементов голосования с различными проверками
файл: /templates/_default_/components/com_users_wall.tpl
добавляем в контейнер <div class="usr_wall_title"> после вывода заголовка и даты следующий код:
  1.  
  2. {if !user_id || $record.is_voted || $record.author_id==$user_id}
  3. <span class="cmm_votes">
  4. {if $record.rating>0}
  5. <span class="cmm_good">+{$record.rating}</span>
  6. {elseif $record.rating<0}
  7. <span class="cmm_bad">{$record.rating}</span>
  8. {else}
  9. {$record.rating}
  10. {/if}
  11. </span>
  12. {else}
  13. <span class="cmm_votes" id="votes{$record.id}">
  14. <table cellpadding="0" cellspacing="0"><tr>
  15. <td><a href="javascript:void(0);" onclick="voteWall({$record.id}, -1);" title="{$LANG.BAD_COMMENT}"><img alt="-" src="/templates/{template}/images/icons/comments/vote_down.gif" style="margin-left:8px;margin-right: 5px;"/></a></td>
  16. <td>{$record.rating|rating}</td>
  17. <td><a href="javascript:void(0);" onclick="voteWall({$record.id}, 1);" title="{$LANG.GOOD_COMMENT}"><img alt="+" src="/templates/{template}/images/icons/comments/vote_up.gif" style="margin-left:5px"/></a></td>
  18. </tr></table>
  19. </span>
  20. {/if}
  21.  
2. Объявляем функцию голосования
в файле /components/users/js/profile.js объявляем в самом конце новую функцию:
  1.  
  2. function voteWall(record_id, vote){
  3.  
  4. $('span#votes'+record_id).html('<img src="/images/ajax-loader.gif" />');
  5. $.ajax({
  6. type: "POST",
  7. url: "/components/users/vote.php",
  8. data: "record_id="+record_id+"&vote="+vote,
  9. success: function(data){
  10. $('span#votes'+record_id).html(data);
  11. }
  12. });
  13.  
  14. }
  15.  
3. Создаем скрипт оценки (копия /components/comments/vote.php с небольшими правками)
в каталоге /components/users/ создаем файл vote.php со следующим содержимым:
  1.  
  2. <?php
  3. /******************************************************************************/
  4. // //
  5. // InstantCMS v1.10.3 //
  6. // http://instantcms.ru/ //
  7. // //
  8. // written by InstantCMS Team, 2007-2013 //
  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. if(!$inUser->id) { cmsCore::halt(); }
  19.  
  20. if(!$inCore->isComponentEnable('users')) { cmsCore::halt(); }
  21.  
  22. cmsCore::loadLib('karma');
  23.  
  24. $record_id = cmsCore::request('record_id', 'int');
  25. $vote = cmsCore::request('vote', 'int');
  26.  
  27. if(!$record_id || abs($vote) != 1) { cmsCore::halt(); }
  28.  
  29. $com_user_id = $inDB->get_field('cms_user_wall', "id='$record_id'", 'author_id');
  30. if(!$com_user_id) { cmsCore::halt(); }
  31.  
  32. if ($inUser->id != $com_user_id){
  33. cmsSubmitKarma('wall', $record_id, $vote);
  34. }
  35.  
  36. $karma = cmsKarma('wall', $record_id);
  37.  
  38. if ($karma['points']>0){
  39. $karma['points'] = '<span class="cmm_good">+'.$karma['points'].'</span>';
  40. } elseif ($karma['points']<0){
  41. $karma['points'] = '<span class="cmm_bad">'.$karma['points'].'</span>';
  42. }
  43.  
  44. echo $karma['points'];
  45.  
  46. ?>
  47.  
4. В функцию getUserWall класса user.class.php дописываем пару строк
файл /core/classes/user.class.php после строки:
  1.  
  2. $record['avatar'] = cmsUser::getUserAvatarUrl($record['author_id'], 'small', $record['imageurl'], $record['is_deleted']);
  3.  
дописываем следующее:
  1.  
  2. $record['is_my'] = ($inUser->id == $record['author_id']);
  3. if ($inUser->id){
  4. $record['is_voted'] = $record['is_my'] ? true : cmsUser::isRateUser('wall', $inUser->id, $record['id']);
  5. } else {
  6. $record['is_voted'] = true;
  7. }
  8.  
5. Добавляем в таблицу cms_rating_targets новую запись:
  1.  
  2. INSERT INTO cms_rating_targets (target, component, is_user_affect, user_weight, target_table, target_title) VALUES ('wall', 'users', 1, 3, 'cms_user_wall', 'Запись на стене пользователя');
  3.  
6. В таблицу cms_user_wall добавляем новое поле rating
  1.  
  2. ALTER TABLE cms_user_wall ADD COLUMN rating int(11) NOT NULL DEFAULT '0';
  3.  
Надеюсь, ничего не забыл. У меня все работает, проверяйте и пишите.
P.S. Дописывалось под 1.10.4, но работать должно на всей ветке.

Всем хорошего весеннего настроения!

Ну и вдруг кому захочется поблагодарить за работу:
Яндекс.Деньги — 41001235605991
WMR — R291063117803
0
eoleg eoleg 9 лет назад #
+
По моему Денис Вас. чтото такое делал, но там было со списком плюсаторов и минусаторов.
0
irbis irbis 9 лет назад #
Напишите ссылку, пожалуйста, я не нашел на сайте подобное. Конечно, я и не особо время на поиск тратил. ))
0
eoleg eoleg 9 лет назад #
у Дениса Васильевича нужно спрашивать если я не ошибаюсь, я тоже на сайте не нашел
0
WD Sx21 WD Sx21 6 лет назад #
Сделал все по инструкции!НА стене есть кнопки голосования-но при нажатии ничего!

Еще от автора

Компонент "Совместные покупки"
Всем привет! Уже как год лежит готовый компонент для организации "Совместных покупок".
Хак: добавление комментариев в ленту активности
Всем привет! Решил выложить свою мини-доработку по добавлению комментария в ленту активности.
Хак: поворот фото в Фотоальбомах
Всем привет! Давно ничего не писал, как обычно нет на все времени.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.