- Совместимость
- не проверялся на совместимость
- Изменения в БД
- требуются
- Автор
- frost444
- Общественное достояние
- да
Описание: добавляет систему переписок на ваш ресурс.
Возможности:
Возможности:
- Обновление личных сообщений на AJAX
- Предпросмотр сообщений во всплывающем блоке
- Редактирование на AJAX
- Поиск пользователей при создании переписки на AJAX
- Инструкция по установке
-
PHP:
Автор мода: frost444 Отдельное спасибо пользователю: zver5001 //-----[Обновления]-----\\ |--(16.01.2013) 1) измененный код: functions.php, lang_main.php, page_header.tpl 2) изменен код в прилагаемых файлах: pm.php, functions_pm.php, new_pm.php(ajax), pm.php(ajax), QuickSearch.php(ajax), pm.tpl, slide_menu.css 3) добавлены файлы изображений: panel_icon/p-down.png | p-up.png info: (1) Улучшены библиотеки JQuery в TP соответственно идут в комплекте библиотеки. Все файлы заменить. (2) Добавлен поиск по тегам среди юзеров. (3) Прочая оптимизация и улучшения. |--(17.01.2013) 1) измененный код: functions.php, lang_main.php, admin_board.tpl, admin_board.php 2) изменен код в прилагаемых файлах: pm.php, functions_pm.php 3) добавлены файлы: cron/jobs/olp_pm_delete.php 4) добавлены 3 новых запроса в БД info: (1) Добавлена крон задача, по очистке старых переписок. (2) Добавлено склеивание сообщений, во избежении тайм флуда. \\-----[Обновления]-----// ####[ВЫПОЛНИТЬ]-----SQL CREATE TABLE IF NOT EXISTS `bb_pm` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sub` varchar(150) NOT NULL, `time` int(11) NOT NULL, `uid` int(11) NOT NULL, `firstpost` int(11) NOT NULL, `major` int(11) NOT NULL, `minor` int(11) NOT NULL, `pm_lock` tinyint(4) NOT NULL DEFAULT '0', `lastpost` int(11) NOT NULL, `lp_user` int(11) NOT NULL, `lastime` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `bb_pm_text` ( `tx_id` int(11) NOT NULL AUTO_INCREMENT, `pm_id` int(11) NOT NULL, `us_id` int(11) NOT NULL, `text` text NOT NULL, `time` bigint(11) NOT NULL, PRIMARY KEY (`tx_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `bb_pm_texthtml` ( `tx_id` int(11) unsigned NOT NULL DEFAULT '0', `us_id` int(11) NOT NULL, `pm_html` text NOT NULL, PRIMARY KEY (`tx_id`), FULLTEXT KEY `pm_html` (`pm_html`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `bb_pm_users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pid` int(11) NOT NULL, `puid` int(11) NOT NULL, `pm_type` tinyint(4) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; INSERT INTO bb_config (config_name, config_value) VALUES ('join_int_pm', '3'); INSERT INTO bb_config (config_name, config_value) VALUES ('max_pm_time', '300'); INSERT INTO `bb_cron` (`cron_active`, `cron_title`, `cron_script`, `schedule`, `run_day`, `run_time`, `run_order`, `last_run`, `next_run`, `run_interval`, `log_enabled`, `log_file`, `log_sql_queries`, `disable_board`, `run_counter`) VALUES (1, 'Удаление старых переписок', 'olp_pm_delete.php', 'daily', '', '04:00:00', 255, '0000-00-00 00:00:00', '0000-00-00 00:00:00', '00:00:00', 0, '', 0, 0, 0); ####[КОНЕЦ]-----SQL ####[ОТКРЫТЬ]-----.htaccess ----[добавить]----- RewriteEngine On RewriteRule ^pmRss.xml$ pm_rss.php [L] ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----init_bb.php -----[найти]----- define('POST_USERS_URL', 'u'); -----[добавить после]----- //PM MODE define('PRIVMS', "pm.php"); define('PRIVMS_REPLEY_URL', 'pm'); define('PRIVMS_ID', 'id'); define('PRIVMS_PAGE_URL', 'start'); define('PRIVMS_MODE_URL', "pm.php?" .'mode='); define('PRIVMS_IDS', 'id='); define('PRIVMS_POSTS_URLS', 'pm='); define('PRIVMS_ADD', 'add'); define('PRIVMS_USER', 'u='); define('PRIVMS_USERS', 'u'); define('PRIVMS_LIST', 'list'); define('PRIVMS_DEL_REP', 'delete_reply'); define('PRIVMS_DEL_PM', 'delete_pm'); define('PRIVMS_VIEW', 'view'); define('PRIVMS_SMILE', 'smilies'); define('PRIVMS_RSS', "pmRss.xml?"); define('PRIVMS_RSS_PAS', 'login_password='); define('PRIVMS_RSS_USR', 'login_username='); //PM MODE -----[найти]----- define('BB_PRIVMSGS_TEXT', 'bb_privmsgs_text'); -----[добавить после]----- //PM MODE define('BB_PM', 'bb_pm'); define('BB_PM_TEXT', 'bb_pm_text'); define('BB_PM_TEXTHTML', 'bb_pm_texthtml'); define('BB_PM_USERS', 'bb_pm_users'); //PM MODE ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----lang_main.php (eng) -----[найти]----- // tor_comment .... //end torrent status mod -----[заменить]----- / tor_comment $lang['TOR_MOD_TITLE'] = 'Changing the status of distribution - %s'; $lang['TOR_MOD_MSG'] = "Hello, %s.[br] Status [url=%s]your[/url] distribution is changed to [b]%s[/b]"; $lang['TOR_AUTH_TITLE'] = 'Changes in the design - %s'; $lang['TOR_AUTH_MSG'] = "Hello, %s.[br] Making my hand changed - [url=%s]%s[/url][br] Please re-check it."; $lang['TOR_AUTH_FIXED'] = 'Fixed'; $lang['TOR_AUTH_SENT_COMMENT'] = ' · <span class="seed bold">The information sent to the moderator. Expect.</span>'; //end torrent status mod ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----lang_main.php (rus) -----[найти]----- // tor_comment .... //end torrent status mod -----[заменить]----- // tor_comment $lang['TOR_MOD_TITLE'] = 'Изменение статуса раздачи - %s'; $lang['TOR_MOD_MSG'] = "Здравствуйте, %s.[br] Статус [url=%s]вашей[/url] раздачи изменен на [b]%s[/b]"; $lang['TOR_AUTH_TITLE'] = 'Изменение в оформлении - %s'; $lang['TOR_AUTH_MSG'] = "Здравствуйте, %s.[br] Оформление моей раздачи изменено - [url=%s]%s[/url][br] Просьба повторно её проверить."; $lang['TOR_AUTH_FIXED'] = 'Исправил'; $lang['TOR_AUTH_SENT_COMMENT'] = ' · <span class="seed bold">Информация отправлена модератору. Ожидайте.</span>'; //end torrent status mod -----[в самый конец добавить]----- //PM MODE $lang['PM_PM'] = 'Переписки'; $lang['PM_POST_NEW'] = 'Начать новую переписку'; $lang['PM_HAVE_NOT_RECENT'] = 'У Вас нет последних переписок.'; $lang['PM_OPT'] = 'Настройки переписки'; $lang['PM_PM_TO'] = 'Переписка: '; $lang['PM_NOT_DELETE_REP'] = 'Вы не можете удалить данное сообщение.'; $lang['PM_NOT_DELETE_PM'] = 'Вы не можете удалить дую переписку'; $lang['PM_TITLE_SMALL'] = 'Слишком короткий заголовок. Допустимо '; $lang['PM_TITLE_LONG'] = 'Слишком длинный заголовок. Допустимо '; $lang['PM_MESS_SMALL'] = 'Слишком короткое сообщение. Допустимо '; $lang['PM_MESS_LONG'] = 'Слишком длинное сообщение. Допустимо '; $lang['PM_MEMBER_SMALL'] = 'Участников должно быть больше.'; $lang['PM_MEMBER_LONG'] = 'Превышем лимит участников.'; $lang['PM_YOU_ALREADY_TO_PM'] = 'Вы уже состоите в переписке.'; $lang['PM_THIS_USER_CAN_NOT_ADDED_TO_PM'] = 'Данных юзеров нельзя добавлять в переписку: '; $lang['PM_CANNOT_DELETE_REP'] = 'Вы не можете удалить это сообщение.'; $lang['PM_CANNOT_DELETE_PM'] = 'Вы не можете удалить эту переписку.'; $lang['PM_NOT_EXIST'] = 'Переписки не существует'; $lang['PM_CAN_NOT_VIEW'] = 'Вы не можете просматривать чужие переписки.'; $lang['PM_USERS'] = 'Пользователи в переписке'; $lang['PM_USER'] = 'Участники'; $lang['PM_SEARCH_U'] = 'поиск по пользователям...'; $lang['PM_ADD'] = 'Добавить'; $lang['PM_NAMES_WRITE_TO'] = 'Имена участников писать через пробел.'; $lang['PM_YOU_INVITE'] = 'Вы можете пригласить не более %s пользовател(-я,-ей)'; $lang['PM_ENTER_TITLE'] = 'Введите заголовок переписки.'; $lang['PM_CREATE'] = 'Создать переписку'; $lang['PM_NO_YOU'] = 'У вас нет переписок'; $lang['PM_DELETED'] = 'Ваша переписка была успешно удалена'; $lang['PM_CLOSED'] = 'Переписка закрыта'; $lang['VIEW_ALL'] = 'Показать все...'; $lang['CLICK_RETURN_TO_BACK'] = '%sВернуться обратно%s'; $lang['CLICK_RETURN_TO_PM'] = '%sПереидти в переписку%s'; $lang['PM_MAX_JOIN_TIME_HOUR'] = 'Часов'; $lang['PM_MAX_TIME_DAY'] = 'Дней'; $lang['PM_ADDED_LATER'] = 'Добавлено спустя '; $lang['PM_CONFIG'] = 'Настройка переписок'; $lang['PM_JOIN_IN_PM'] = 'Интервал склеивания сообщений'; $lang['PM_JOIN_IN_PM_EXPLAIN'] = 'Интервал времени по какому мод склеивает сообщения'; $lang['PM_DELETE_IN_PM'] = 'Интервал удаления переписок'; $lang['PM_DELETE_IN_PM_EXPLAIN'] = 'Интервал времени по какому мод удаляет старые переписки'; //PM MODE //AJAX SEARCH MODE $lang['AJAX_SEARCH_NO_USER'] = 'Вы не ввели имя пользователя'; $lang['AJAX_SEARCH_NULL_RESULT'] = 'Поиск не дал результатов'; $lang['AJAX_SEARCH_NO_NAME'] = 'Вы не ввели текст для поиска'; $lang['AJAX_SEARCH_RESULT'] = 'Результат поиска'; //AJAX SEARCH MODE ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----ajax.php -----[найти]----- switch ($ajax->action) { -----[добавить после]----- case 'pm': require(INC_DIR .'bbcode.php'); require(INC_DIR .'functions_post.php'); require(INC_DIR .'functions_pm.php'); break; -----[найти]----- 'index_data' => array('guest'), -----[добавить после]----- 'new_pm' => array('user'), 'pm' => array('user'), 'QuickSearch' => array('user'), -----[найти последнюю скобку и перед ней добавить]----- function new_pm() { require(AJAX_DIR .'new_pm.php'); } function pm() { require(AJAX_DIR .'pm.php'); } function QuickSearch() { require(AJAX_DIR .'QuickSearch.php'); } ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----page_heaer.php -----[найти]----- $icon_pm = $images['pm_no_new_msg']; $pm_info = $lang['NO_NEW_PM']; $have_new_pm = $have_unread_pm = 0; if ($logged_in && empty($gen_simple_header) && !defined('IN_ADMIN')) { if ($userdata['user_new_privmsg']) { $have_new_pm = $userdata['user_new_privmsg']; $icon_pm = $images['pm_new_msg']; $pm_info = declension($userdata['user_new_privmsg'], $lang['NEW_PMS_DECLENSION'], $lang['NEW_PMS_FORMAT']); if ($userdata['user_last_privmsg'] > $userdata['user_lastvisit'] && defined('IN_PM')) { $userdata['user_last_privmsg'] = $userdata['user_lastvisit']; db_update_userdata($userdata, array( 'user_last_privmsg' => $userdata['user_lastvisit'], )); $have_new_pm = ($userdata['user_new_privmsg'] > 1); } } if (!$have_new_pm && $userdata['user_unread_privmsg']) { // synch unread pm count if (defined('IN_PM')) { $row = DB()->fetch_row(" SELECT COUNT(*) AS pm_count FROM ". BB_PRIVMSGS ." WHERE privmsgs_to_userid = ". $userdata['user_id'] ." AND privmsgs_type = ". PRIVMSGS_UNREAD_MAIL ." GROUP BY privmsgs_to_userid "); $real_unread_pm_count = (int) $row['pm_count']; if ($userdata['user_unread_privmsg'] != $real_unread_pm_count) { $userdata['user_unread_privmsg'] = $real_unread_pm_count; db_update_userdata($userdata, array( 'user_unread_privmsg' => $real_unread_pm_count, )); } } $pm_info = declension($userdata['user_unread_privmsg'], $lang['UNREAD_PMS_DECLENSION'], $lang['UNREAD_PMS_FORMAT']); $have_unread_pm = true; } } $template->assign_vars(array( 'HAVE_NEW_PM' => $have_new_pm, 'HAVE_UNREAD_PM' => $have_unread_pm, )); -----[заменить]----- $icon_pm = $images['pm_no_new_msg']; $pm_info = $lang['NO_NEW_PM']; $have_new_pm = $have_unread_pm = $pm_info_count = $pm_info_class = 0; if ($logged_in && empty($gen_simple_header) && !defined('IN_ADMIN')) { if ($userdata['user_new_privmsg']) { $have_new_pm = $userdata['user_new_privmsg']; $icon_pm = $images['pm_new_msg']; $pm_info = declension($userdata['user_new_privmsg'], $lang['NEW_PMS_DECLENSION'], $lang['NEW_PMS_FORMAT']); $pm_info_count = $userdata['user_new_privmsg']; $pm_info_class = "New"; if ($userdata['user_last_privmsg'] > $userdata['user_lastvisit'] && defined('IN_PM')) { $userdata['user_last_privmsg'] = $userdata['user_lastvisit']; db_update_userdata($userdata, array( 'user_last_privmsg' => $userdata['user_lastvisit'], )); $have_new_pm = ($userdata['user_new_privmsg'] > 1); } } if (!$have_new_pm && $userdata['user_unread_privmsg']) { // synch unread pm count if (defined('IN_PM')) { $row = DB()->fetch_row(" SELECT COUNT(*) AS pm_count FROM ". BB_PM_USERS ." WHERE puid = ". $userdata['user_id'] ." AND pm_type = ". PRIVMSGS_UNREAD_MAIL ." GROUP BY id "); $real_unread_pm_count = (int) $row['pm_count']; if ($userdata['user_unread_privmsg'] != $real_unread_pm_count) { $userdata['user_unread_privmsg'] = $real_unread_pm_count; db_update_userdata($userdata, array( 'user_unread_privmsg' => $real_unread_pm_count, )); } } $pm_info = declension($userdata['user_unread_privmsg'], $lang['UNREAD_PMS_DECLENSION'], $lang['UNREAD_PMS_FORMAT']); $pm_info_count = $userdata['user_unread_privmsg']; $pm_info_class = "Old"; $have_unread_pm = true; } } $template->assign_vars(array( 'HAVE_NEW_PM' => $have_new_pm, 'HAVE_UNREAD_PM' => $have_unread_pm, )); -----[найти]----- 'U_READ_PM' => "privmsg.php?folder=inbox". (($userdata['user_newest_pm_id'] && $userdata['user_new_privmsg'] == 1) ? "&mode=read&p={$userdata['user_newest_pm_id']}" : ''), -----[заменить]----- 'U_READ_PM' => "pm.php?mode=list", 'U_READ_PM_ADD' => "pm.php?mode=add", -----[найти]----- 'PM_INFO' => $pm_info, -----[ниже добавить]----- 'PM_INFO_COUNT' => !empty($pm_info_count) ? '<span class="pm'.$pm_info_class.'" title="'.$pm_info.'">'.$pm_info_count.'</span><span class="arrow'.$pm_info_class.'"></span>' : '', ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----mysql.php -----[найти]----- if (!empty($this->shutdown['post_html'])) { $post_html_sql = $this->build_array('MULTI_INSERT', $this->shutdown['post_html']); $this->query("REPLACE INTO ". BB_POSTS_HTML ." $post_html_sql"); } -----[после добавить]----- if (!empty($this->shutdown['pmhtml'])) { $post_html_sql = $this->build_array('MULTI_INSERT', $this->shutdown['pmhtml']); $this->query("REPLACE INTO ". BB_PM_TEXTHTML ." $post_html_sql"); } ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----functions.php -----[найти функцию с названием send_pm и полностью заменить на]----- function send_pm($user_id, $subject, $message, $poster_id = false, $lock_on = true) { global $userdata; include(INC_DIR . 'functions_pm.php'); $pm = new PrivateMS(); $subject = DB()->escape($subject); $message = DB()->escape($message); if($user_id == $userdata['user_id']) return false; if(!$poster_id) { $poster_id = $userdata['user_id']; } if($lock_on) { $lock = '1'; }else{ $lock = '0'; } $pm->add_pm(array( 'sub' => $subject, 'uid' => $poster_id, 'text' => $message, 'lastpost' => $poster_id, 'users' => $user_id, 'pm_lock' => $lock, ),false,false); } -----[в самый конец добавить]----- function undo_htmlspecialchars($input) { $input = preg_replace("/>/i", ">", $input); $input = preg_replace("/</i", "<", $input); $input = preg_replace("/"/i", "\"", $input); $input = preg_replace("/&/i", "&", $input); return $input; } ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----session.php -----[найти]----- function login ($args, $mod_admin_login = false) { global $bb_cfg; $username = !empty($args['login_username']) ? clean_username($args['login_username']) : ''; $password = !empty($args['login_password']) ? $args['login_password'] : ''; -----[заменить]----- function login ($args, $mod_admin_login = false, $encode = false) { global $bb_cfg; $username = !empty($args['login_username']) ? clean_username($args['login_username']) : ''; if($encode) $username = clean_username(mb_convert_encoding($args['login_username'],'UTF8', 'CP1251')); $password = !empty($args['login_password']) ? $args['login_password'] : ''; if($encode) $password = mb_convert_encoding($password,'UTF8', 'CP1251'); ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----main.js -----[найти]----- // // Menus // -----[перд добавить]----- // // Slide Menus // var SlideMenu = { openSpeed : 'slow', hideSpeed : 'fast', getOffsetOptions : { margin: true, border: true, padding: true, scroll: false }, offsetCorrection_X : -4, offsetCorrection_Y : 2, iframeFix : false, activeMenuId : null, // currently opened menu (from previous click) clickedMenuId : null, // menu to show up $root : null, // root element for menu with "href = '#clickedMenuId'" $menu : null, // clicked menu positioningType : null, // reserved outsideClickWatch : false, // prevent multiple $(document).click binding clicked: function($root) { $root.blur(); this.clickedMenuId = this.getMenuId($root); this.$menu = $(this.clickedMenuId); this.$root = $root; this.toggle(); }, getMenuId: function($el) { var click = $el.attr('click'); return click.substr(click.indexOf('#')); }, setLocation: function() { var CSS = this.$root.offset(); CSS.top += this.$root.height() + this.offsetCorrection_Y; CSS.left += this.offsetCorrection_X; this.$menu.css(CSS); }, fixLocation: function() { var $menu = this.$menu; var curLeft = parseInt($menu.css('left')); var rCorner = $(document).scrollLeft() + $(window).width() - 6; var maxVisibleLeft = Math.min(curLeft, Math.max(0, rCorner - $menu.width())); if (curLeft != maxVisibleLeft) { $menu.css('left', maxVisibleLeft); } var curTop = parseInt($menu.css('top')); var tCorner = $(document).scrollTop() + $(window).height() - 20; var maxVisibleTop = Math.min(curTop, Math.max(0, tCorner - $menu.height())); if (curTop != maxVisibleTop) { $menu.css('top', maxVisibleTop); } if (this.iframeFix) { $('iframe.ie-fix-select-overlap', $menu).css({ width: $menu.width(), height: $menu.height() }); } }, toggle: function() { if (this.activeMenuId && this.activeMenuId !== this.clickedMenuId) { $(this.activeMenuId).slideUp(this.hideSpeed); this.$root.removeClass('active') } // toggle clicked menu if (this.$menu.is(':visible')) { } else { this.showClickedMenu(); if (!this.outsideClickWatch) { $(document).one('mousedown', function(e){ SlideMenu.hideClickWatcher(e); }); this.outsideClickWatch = true; } } }, showClickedMenu: function() { this.setLocation(); this.$menu.slideDown(this.openSpeed); this.$root.addClass('active') this.fixLocation(); this.activeMenuId = this.clickedMenuId; }, // hide if clicked outside of menu hideClickWatcher: function(e) { this.outsideClickWatch = false; this.hide(e); }, hide: function(e) { if (this.$menu) { this.$menu.slideUp(this.hideSpeed); this.$root.removeClass('active') } this.activeMenuId = this.clickedMenuId = this.$menu = null; } }; $(document).ready(function(){ // SlideMenus $('div#slideMenu').click( function(e) { SlideMenu.clicked($(this)); var menuClick = true; $(document).bind("click",function (e) { if (!menuClick && $(e.target).closest('div.slideMenuBlock').length == 0) { SlideMenu.clicked($(this)); $(document).unbind("click"); } menuClick = false; }); } ); $('div.slideMenuBlock').mousedown( function(e) { e.stopPropagation(); } ) // Input hints $('input') .filter('.hint').one('focus', function() { $(this).val('').removeClass('hint'); }) .end() .filter('.error').one('focus', function() { $(this).removeClass('error'); }); }); ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]-----page_header.tpl -----[найти]----- <link rel="stylesheet" href="{STYLESHEET}?v={$bb_cfg['css_ver']}" type="text/css"> -----[после добавить]----- <link rel="stylesheet" href="{TPL_DIR}/jquery-ui.min.css?v={$bb_cfg['css_ver']}" type="text/css"> <link rel="stylesheet" href="{TPL_DIR}/tag-it.css?v={$bb_cfg['css_ver']}" type="text/css"> <link rel="stylesheet" href="{TPL_DIR}/pm.css?v={$bb_cfg['css_ver']}" type="text/css"> <link rel="stylesheet" href="{TPL_DIR}/slide_menu.css?v={$bb_cfg['css_ver']}" type="text/css"> <link rel="stylesheet" href="{TPL_DIR}/popup.css?v={$bb_cfg['css_ver']}" type="text/css"> <link rel="stylesheet" href="{TPL_DIR}/table.css?v={$bb_cfg['css_ver']}" type="text/css"> -----[найти]----- <script type="text/javascript" src="{SITE_URL}misc/js/jquery.pack.js?v={$bb_cfg['js_ver']}"></script> -----[выше добавить]----- <script type="text/javascript" src="{SITE_URL}misc/js/jquery.min.js?v={$bb_cfg['js_ver']}"></script> <script type="text/javascript" src="{SITE_URL}misc/js/jquery-ui.min.js?v={$bb_cfg['js_ver']}"></script> -----[найти]----- <script type="text/javascript" src="{SITE_URL}misc/js/jquery.pack.js?v={$bb_cfg['js_ver']}"></script> -----[после добавить]----- <script type="text/javascript" src="{SITE_URL}misc/js/tag-it.js"></script> -----[найти]----- <!-- IF LOGGED_IN --> <!-- IF HAVE_NEW_PM || HAVE_UNREAD_PM --> <a href="{U_READ_PM}" class="new-pm-link"><b>{L_PRIVATE_MESSAGES}: {PM_INFO}</b></a> <!-- ELSE --> <a href="{U_PRIVATEMSGS}"><b>{L_PRIVATE_MESSAGES}: {PM_INFO}</b></a> <!-- ENDIF --> <!-- ENDIF --> </td> -----[удалить]----- <!-- IF LOGGED_IN --> <!-- IF HAVE_NEW_PM || HAVE_UNREAD_PM --> <a href="{U_READ_PM}" class="new-pm-link"><b>{L_PRIVATE_MESSAGES}: {PM_INFO}</b></a> <!-- ELSE --> <a href="{U_PRIVATEMSGS}"><b>{L_PRIVATE_MESSAGES}: {PM_INFO}</b></a> <!-- ENDIF --> <!-- ENDIF --> -----[после]----- </td> -----[добавить]----- <!-- IF LOGGED_IN --> <script type="text/javascript"> function new_pm(mode) { ajax.exec({ action : 'new_pm', mode : mode }); ajax.callback.new_pm = function(data) { if (data.pmUpdate !== undefined) { $('strong#pm-link').html(data.pmUpdate); } if (data.pmLoad_on) { $('#LoadNewPm').html(data.pmLoad); } }; } setInterval("new_pm('update')",2*60*1000); </script> <td width="100px"> <div id="slideMenuLink"> <div id="slideMenu" class="tabMenu" click="#user_pm"> <span id="SpNTit" onClick="new_pm('load'); return false;"><p class="floatR IMGslideMenu">{L_INBOX}</p> <strong id="pm-link">{PM_INFO_COUNT}</strong></span> <div class="slideMenuBlock lEft" id="user_pm"> <div class="navPopup" style="margin: 0 -4px"> <div class="menuHeader primaryContent"> <h3> <a class="concealed" href="{U_READ_PM}">{L_PM_PM}</a> </h3> </div> <div class="listPlaceholder"> <div class="secondaryContent" id="LoadNewPm">{L_PM_HAVE_NOT_RECENT}</div> </div> <div class="sectionFooter"> <a class="floatLink" href="{U_READ_PM_ADD}">{L_PM_POST_NEW}</a> <a href="{U_READ_PM}">{L_VIEW_ALL}</a> </div> </div> </div> </div> </div> </td> <!-- ENDIF --> ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- usercp_viewprofile.php -----[найти]----- 'PM' => '<a href="privmsg.php?mode=post&'. POST_USERS_URL .'='. $profiledata['user_id'] .'">'. $lang['SEND_PRIVATE_MESSAGE'] .'</a>', -----[заменить]----- 'PM' => '<a href="'.PRIVMS_MODE_URL .''. PRIVMS_ADD ."&".PRIVMS_USER . $profiledata['user_id'] .'">'. $lang['SEND_PRIVATE_MESSAGE'] .'</a>', ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- tpl_config.php -----[найти]----- 'PM_URL' => BB_ROOT . PM_URL, -----[заменить]----- 'PM_URL' => BB_ROOT . PRIVMS_MODE_URL . PRIVMS_ADD . '&u=', ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- memberlist.php -----[найти]----- $pm = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. ("privmsg.php?mode=post&". POST_USERS_URL ."=$user_id") .'">'. $lang['SEND_PM_TXTB'] .'</a>' : '<a href="' . ("privmsg.php?mode=post&". POST_USERS_URL ."=$user_id") .'"><img src="' . $images['icon_pm'] . '" alt="' . $lang['SEND_PRIVATE_MESSAGE'] . '" title="' . $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>'; -----[заменить]----- $pm = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. ("pm.php?mode=add&u=$user_id") .'">'. $lang['SEND_PM_TXTB'] .'</a>' : '<a href="' . ("pm.php?mode=add&u=$user_id") .'"><img src="' . $images['icon_pm'] . '" alt="' . $lang['SEND_PRIVATE_MESSAGE'] . '" title="' . $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>'; ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- groupcp.php -----[найти]----- $pm = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. ("privmsg.php?mode=post&". POST_USERS_URL ."=".$row['user_id']) .'">'. $lang['SEND_PM_TXTB'] .'</a>' : '<a href="' . ("privmsg.php?mode=post&". POST_USERS_URL ."=".$row['user_id']) .'"><img src="' . $images['icon_pm'] . '" alt="' . $lang['SEND_PRIVATE_MESSAGE'] . '" title="' . $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>'; -----[заменить]----- $pm = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. ("pm.php?mode=add&u=".$row['user_id']) .'">'. $lang['SEND_PM_TXTB'] .'</a>' : '<a href="' . ("pm.php?mode=add&u=".$row['user_id']) .'"><img src="' . $images['icon_pm'] . '" alt="' . $lang['SEND_PRIVATE_MESSAGE'] . '" title="' . $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>'; ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- ajax/change_tor_status.php -----[найти 2 раза]----- if($comment && $comment != $lang['COMMENT']) $message .= "\n\n[b]". $lang['COMMENT'] .'[/b]: '. $comment; -----[заменить]----- if($comment && $comment != $lang['COMMENT']) $message .= "[br][b]". $lang['COMMENT'] .'[/b]: '. $comment; ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- admin_board.php -----[найти и удалить]----- 'PRIVMSG_DISABLE' => ($new['privmsg_disable']) ? false : true, -----[найти и удалить]----- 'INBOX_LIMIT' => $new['max_inbox_privmsgs'], 'SENTBOX_LIMIT' => $new['max_sentbox_privmsgs'], 'SAVEBOX_LIMIT' => $new['max_savebox_privmsgs'], -----[найти и удалить]----- 'INBOX_PRIVMSGS' => $new['max_inbox_privmsgs'], 'SENTBOX_PRIVMSGS' => $new['max_sentbox_privmsgs'], 'SAVEBOX_PRIVMSGS' => $new['max_savebox_privmsgs'], -----[найти]----- 'SEED_BONUS_USER_REGDATE' => $new['seed_bonus_user_regdate'], -----[ниже добавить]----- 'PRIVMSG_DISABLE' => ($new['privmsg_disable']) ? false : true, 'JOIN_INT_PM' => $new['join_int_pm'], 'MAX_PM_TIME' => $new['max_pm_time'], ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- admin_board.tpl -----[найти и удалить]----- <tr> <th colspan="2">{L_PRIVATE_MESSAGING}</th> </tr> <tr> <td><h4>{L_DISABLE_PRIVMSG}</h4></td> <td> <label><input type="radio" name="privmsg_disable" value="0" <!-- IF PRIVMSG_DISABLE -->checked="checked"<!-- ENDIF --> />{L_ENABLED}</label> <label><input type="radio" name="privmsg_disable" value="1" <!-- IF not PRIVMSG_DISABLE -->checked="checked"<!-- ENDIF --> />{L_DISABLED}</label> </td> </tr> <tr> <td><h4>{L_INBOX_LIMITS}</h4></td> <td><input class="post" type="text" maxlength="4" size="4" name="max_inbox_privmsgs" value="{INBOX_LIMIT}" /></td> </tr> <tr> <td><h4>{L_SENTBOX_LIMITS}</h4></td> <td><input class="post" type="text" maxlength="4" size="4" name="max_sentbox_privmsgs" value="{SENTBOX_LIMIT}" /></td> </tr> <tr> <td><h4>{L_SAVEBOX_LIMITS}</h4></td> <td><input class="post" type="text" maxlength="4" size="4" name="max_savebox_privmsgs" value="{SAVEBOX_LIMIT}" /></td> </tr> -----[найти]----- <tr> <td><h4>{L_DESIGNER}</h4></td> <td> <label><input type="radio" name="new_tpls" value="1" <!-- IF NEW_TPLS -->checked="checked"<!-- ENDIF --> />{L_ENABLED}</label> <label><input type="radio" name="new_tpls" value="0" <!-- IF not NEW_TPLS -->checked="checked"<!-- ENDIF --> />{L_DISABLED}</label> </td> </tr> -----[ниже добавить]----- <tr class="row3 med"> <td class="bold tCenter" colspan="2">{L_PM_CONFIG}</td> </tr> <tr> <td><h4>{L_DISABLE_PRIVMSG}</h4></td> <td> <label><input type="radio" name="privmsg_disable" value="0" <!-- IF PRIVMSG_DISABLE -->checked="checked"<!-- ENDIF --> />{L_ENABLED}</label> <label><input type="radio" name="privmsg_disable" value="1" <!-- IF not PRIVMSG_DISABLE -->checked="checked"<!-- ENDIF --> />{L_DISABLED}</label> </td> </tr> <tr> <td><h4>{L_PM_JOIN_IN_PM}</h4><h6>{L_PM_JOIN_IN_PM_EXPLAIN}</h6></td> <td><input class="post" type="text" size="3" maxlength="4" name="join_int_pm" value="{JOIN_INT_PM}" />{L_PM_MAX_JOIN_TIME_HOUR}</td> </tr> <tr> <td><h4>{L_PM_DELETE_IN_PM}</h4><h6>{L_PM_DELETE_IN_PM_EXPLAIN}</h6></td> <td><input class="post" type="text" size="3" maxlength="4" name="max_pm_time" value="{MAX_PM_TIME}" />{L_PM_MAX_TIME_DAY}</td> </tr> ####[СОХРАНИТЬ_ФАЙЛ]#### ||||||||||||||||||||||||||||||||||||| | ЗАПУСТИТЕ CRON ЗАДАЧУ | | И | | ОЧИСТИТЕ КЕШ!!!!! | |||||||||||||||||||||||||||||||||||||