Система переписок

Система переписок 1.0.0

Совместимость
не проверялся на совместимость
Изменения в БД
требуются
Автор
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'] = ' &middot; <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'] = ' &middot; <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("/&gt;/i", ">", $input);
    $input = preg_replace("/&lt;/i", "<", $input);
    $input = preg_replace("/&quot;/i", "\"", $input);
    $input = preg_replace("/&amp;/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&amp;'. 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&amp;". POST_USERS_URL ."=$user_id") .'">'. $lang['SEND_PM_TXTB'] .'</a>' : '<a href="' . ("privmsg.php?mode=post&amp;". 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&amp;". POST_USERS_URL ."=".$row['user_id']) .'">'. $lang['SEND_PM_TXTB'] .'</a>' : '<a href="' . ("privmsg.php?mode=post&amp;". 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>&nbsp;&nbsp;
        <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>&nbsp;&nbsp;
        <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>&nbsp;&nbsp;
        <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 ЗАДАЧУ        |
|                И                    |
|           ОЧИСТИТЕ КЕШ!!!!!        |
|||||||||||||||||||||||||||||||||||||
  • 1.JPG
    1.JPG
    73 KB · Просмотры: 98
  • 2.JPG
    2.JPG
    150.4 KB · Просмотры: 98
  • 3.JPG
    3.JPG
    37.7 KB · Просмотры: 96
  • 4.JPG
    4.JPG
    64.2 KB · Просмотры: 97
Автор
Exile
Скачивания
32
Просмотры
356
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Exile

Сверху