Реферальная система

G

Gemini_13

Гость
Написал сегодня ночью по просьбе Lange, только вывод сделал другим. Само собой надо протестить :)
Недостающие ланги по своему вкусу оформите, готовые ланги прописал.

Addon: Список юзеров, которые зарегались по Вашему рефералу на аяксе
Описание: Добавляет на страницу профиля возможность посмотреть пользователей, которые зарегистрировались с Вашего реферала. Табличка выводится на аяксе, по нажатию на кнопку. IP регистрации юзера видят только модераторы и админы.

Инструкция под спойлером и отдельно прикрепил файлик.

SQL:
Код:
CREATE TABLE `bb_referals` (
  `referal_id` mediumint(8) NOT NULL DEFAULT '0',
  `new_user_id` mediumint(8) NOT NULL DEFAULT '0',
  PRIMARY KEY (`new_user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Открыть ajax.php
Найти:
PHP:
'change_tor_status' => array('user'),
Вставить после:
PHP:
'get_referals'        => array('user'),

Вставить перед последней кавычкой:
PHP:
    // Referals
    function get_referals ()
    {
        global $userdata, $lang;
 
        $user_id = (int) $this->request['user_id'];
        if (!$user_id) $this->ajax_die($lang['NO_USER_ID_SPECIFIED']);
        if ($user_id != $userdata['user_id'] && !IS_AM) $this->ajax_die('Ты не кошерный(ая)! :)');
 
        $sql = "
                SELECT u.user_active, u.user_id, u.username, u.user_avatar, u.user_avatar_type, u.user_reg_ip, u.user_regdate, u.user_rank, u.user_opt
                FROM ". BB_USERS ." u, ". BB_REFERALS ." r
                WHERE r.referal_id = $user_id
                AND u.user_id = r.new_user_id
                ORDER BY username ASC
        ";
 
        if (!$result = DB()->sql_query($sql)) $this->ajax_die('Shit happens, man...', '', __LINE__, __FILE__, $sql);
 
        $admin_mod_th = $admin_mod_td = '';
        if(IS_AM) $admin_mod_th = '<td>IP регистрации</td>';
 
        if ($row = DB()->sql_fetchrowset($result))
        {
            $row_count = count($row);
            $referals_list = '';
            for ($i=0; $i<$row_count; $i++)
            {
                $avatar = get_avatar($row[$i]['user_avatar'], $row[$i]['user_avatar_type'], !bf($row[$i]['user_opt'], 'user_opt', 'allow_avatar'), 64, 64);
                $user = profile_url(array('username' => $row[$i]['username'], 'user_id' => $row[$i]['user_id'], 'user_rank' => $row[$i]['user_rank']));
                $reg_time = bb_date($row[$i]['user_regdate'], 'Y-m-d', 'false') . '<br />' . bb_date($row[$i]['user_regdate'], 'H:i', 'false');
                $reg_ip = decode_ip($row[$i]['user_reg_ip']);
                $admin_mod_td = (IS_AM) ? '<td>'. $reg_ip .'</td>' : '';
                $active = ($row[$i]['user_active']) ? '<img src="images/good.gif" alt="" border="0">' : '<img src="images/bad.gif" alt="" border="0">';
                $row_class = ($i % 2) ? 'row1' : 'row2';
 
                $referals_list .= '
                    <tr class="'. $row_class .' tCenter" >
                        <td>'. $avatar .'</td>
                        <td>'. $user .'</td>
                        <td>'. $reg_time .'</td>
                        '. $admin_mod_td .'
                        <td>'. $active .'</td>
                    </tr>
                ';
            }
 
            $this->response['referals_html'] = '
                    <br />
                    <table class="mod_ip bCenter borderless" cellspacing="1">
                        <tr class="row3 tCenter">
                            <td>'. $lang['AVATAR'] .'</td>
                            <td>'. $lang['USER'] .'</td>
                            <td>Время регистрации</td>
                            '. $admin_mod_th .'
                            <td>Актив.</td>
                        </tr>
                        '. $referals_list .'
                    </table>
                    <br />
            ';
        }
        else
        {
            $this->ajax_die('Нет пользователей, которые зарегистрировались по рефералу');
        }
    }

Открыть includes/init_bb.php
Найти:
PHP:
define('BB_RANKS',                'bb_ranks');
Вставить после:
PHP:
define('BB_REFERALS',            'bb_referals');

Открыть includes/ucp/usercp_register.php
Найти:
PHP:
if (isset($_COOKIE['ref'])) DB()->query("UPDATE ".BB_USERS." SET user_points = user_points + 100 WHERE user_id = ". intval($_COOKIE['ref']));
Заменить на:
PHP:
        // Referals
        if (isset($_COOKIE['ref']))
        {
            DB()->query("UPDATE ".BB_USERS." SET user_points = user_points + 100 WHERE user_id = ". intval($_COOKIE['ref']));
            DB()->query("INSERT INTO ". BB_REFERALS ." VALUES (". intval($_COOKIE['ref']) .", ". $new_user_id .")");
            cache_rm_user_sessions(intval($_COOKIE['ref']));
        }

Открыть templates/default/usercp_viewprofile.tpl
Найти:
HTML:
<!-- ENDIF / SHOW_PASSKEY -->
Вставить после:
HTML:
<!-- IF LOGGED_IN -->
<script type="text/javascript">
ajax.referals = function(mode) {
    $('#referals').html('<i class="loading-1">{L_LOADING}</i>');
    ajax.exec({
        action  : 'get_referals',
        user_id : {PROFILE_USER_ID}
    });
}
ajax.callback.get_referals = function(data) {
    $('#referals').html(data.referals_html);
}
</script>
<!-- ENDIF -->
Найти:
HTML:
<!-- IF IS_AM --><span id="ip_list"></span><!-- ENDIF -->
Вставить после:
HTML:
<span id="referals"></span>
Вставить в любое место в профиле (куда понравится):
HTML:
[ <a href="#" class="med" onclick="ajax.referals('get_referals'); return false;">Приглашенные пользователи</a> ]

P.S. Я думаю сам мод рефералов стоит переписать, чтобы начислять сидбонус только в том случае, если пользователь не только зарегался, но и активировал свой акк. Это более правильно и занимает больше времени, для накрутки сидбонусов.
На правах ИМХО :)
 

Вложения

  • am.JPG
    am.JPG
    307.8 KB · Просмотры: 132
  • Addon к моду Рефералов.txt
    5.8 KB · Просмотры: 14
G

Gemini_13

Гость
Кстати, чтобы не растягивать страницу, когда много юзеров, то можно создать поле с прокруткой или вообще попап. Первое, что пришло в голову на счет прокрутки, надеюсь верстальщики подскажут лучший вариант :)
блок в аяксе обвернутый в див.
PHP:
            $this->response['referals_html'] = '
                    <br />
                    <div style="height:300px; overflow:auto">
                    <table class="mod_ip bCenter borderless" cellspacing="1">
                        <tr class="row3 tCenter">
                            <td>'. $lang['AVATAR'] .'</td>
                            <td>'. $lang['USER'] .'</td>
                            <td>Время регистрации</td>
                            '. $admin_mod_th .'
                            <td>Актив.</td>
                        </tr>
                        '. $referals_list .'
                    </table>
                    </div>
                    <br />
            ';
 
N

NewLife

Гость
Кстати, чтобы не растягивать страницу, когда много юзеров, то можно создать поле с прокруткой или вообще попап. Первое, что пришло в голову на счет прокрутки, надеюсь верстальщики подскажут лучший вариант :)
блок в аяксе обвернутый в див.
PHP:
            $this->response['referals_html'] = '
                    <br />
                    <div style="height:300px; overflow:auto">
                    <table class="mod_ip bCenter borderless" cellspacing="1">
                        <tr class="row3 tCenter">
                            <td>'. $lang['AVATAR'] .'</td>
                            <td>'. $lang['USER'] .'</td>
                            <td>Время регистрации</td>
                            '. $admin_mod_th .'
                            <td>Актив.</td>
                        </tr>
                        '. $referals_list .'
                    </table>
                    </div>
                    <br />
            ';
Все правильно:)
 
N

NewLife

Гость
Написал сегодня ночью по просьбе Lange, только вывод сделал другим. Само собой надо протестить :)
Недостающие ланги по своему вкусу оформите, готовые ланги прописал.

Addon: Список юзеров, которые зарегались по Вашему рефералу на аяксе
Описание: Добавляет на страницу профиля возможность посмотреть пользователей, которые зарегистрировались с Вашего реферала. Табличка выводится на аяксе, по нажатию на кнопку. IP регистрации юзера видят только модераторы и админы.

Инструкция под спойлером и отдельно прикрепил файлик.

SQL:
Код:
CREATE TABLE `bb_referals` (
  `referal_id` mediumint(8) NOT NULL DEFAULT '0',
  `new_user_id` mediumint(8) NOT NULL DEFAULT '0',
  PRIMARY KEY (`new_user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Открыть ajax.php
Найти:
PHP:
'change_tor_status' => array('user'),
Вставить после:
PHP:
'get_referals'        => array('user'),

Вставить перед последней кавычкой:
PHP:
    // Referals
    function get_referals ()
    {
        global $userdata, $lang;
 
        $user_id = (int) $this->request['user_id'];
        if (!$user_id) $this->ajax_die($lang['NO_USER_ID_SPECIFIED']);
        if ($user_id != $userdata['user_id'] && !IS_AM) $this->ajax_die('Ты не кошерный(ая)! :)');
 
        $sql = "
                SELECT u.user_active, u.user_id, u.username, u.user_avatar, u.user_avatar_type, u.user_reg_ip, u.user_regdate, u.user_rank, u.user_opt
                FROM ". BB_USERS ." u, ". BB_REFERALS ." r
                WHERE r.referal_id = $user_id
                AND u.user_id = r.new_user_id
                ORDER BY username ASC
        ";
 
        if (!$result = DB()->sql_query($sql)) $this->ajax_die('Shit happens, man...', '', __LINE__, __FILE__, $sql);
 
        $admin_mod_th = $admin_mod_td = '';
        if(IS_AM) $admin_mod_th = '<td>IP регистрации</td>';
 
        if ($row = DB()->sql_fetchrowset($result))
        {
            $row_count = count($row);
            $referals_list = '';
            for ($i=0; $i<$row_count; $i++)
            {
                $avatar = get_avatar($row[$i]['user_avatar'], $row[$i]['user_avatar_type'], !bf($row[$i]['user_opt'], 'user_opt', 'allow_avatar'), 64, 64);
                $user = profile_url(array('username' => $row[$i]['username'], 'user_id' => $row[$i]['user_id'], 'user_rank' => $row[$i]['user_rank']));
                $reg_time = bb_date($row[$i]['user_regdate'], 'Y-m-d', 'false') . '<br />' . bb_date($row[$i]['user_regdate'], 'H:i', 'false');
                $reg_ip = decode_ip($row[$i]['user_reg_ip']);
                $admin_mod_td = (IS_AM) ? '<td>'. $reg_ip .'</td>' : '';
                $active = ($row[$i]['user_active']) ? '<img src="images/good.gif" alt="" border="0">' : '<img src="images/bad.gif" alt="" border="0">';
                $row_class = ($i % 2) ? 'row1' : 'row2';
 
                $referals_list .= '
                    <tr class="'. $row_class .' tCenter" >
                        <td>'. $avatar .'</td>
                        <td>'. $user .'</td>
                        <td>'. $reg_time .'</td>
                        '. $admin_mod_td .'
                        <td>'. $active .'</td>
                    </tr>
                ';
            }
 
            $this->response['referals_html'] = '
                    <br />
                    <table class="mod_ip bCenter borderless" cellspacing="1">
                        <tr class="row3 tCenter">
                            <td>'. $lang['AVATAR'] .'</td>
                            <td>'. $lang['USER'] .'</td>
                            <td>Время регистрации</td>
                            '. $admin_mod_th .'
                            <td>Актив.</td>
                        </tr>
                        '. $referals_list .'
                    </table>
                    <br />
            ';
        }
        else
        {
            $this->ajax_die('Нет пользователей, которые зарегистрировались по рефералу');
        }
    }

Открыть includes/ucp/init_bb.php
Найти:
PHP:
define('BB_RANKS',                'bb_ranks');
Вставить после:
PHP:
define('BB_REFERALS',            'bb_referals');

Открыть includes/ucp/usercp_register.php
Найти:
PHP:
if (isset($_COOKIE['ref'])) DB()->query("UPDATE ".BB_USERS." SET user_points = user_points + 100 WHERE user_id = ". intval($_COOKIE['ref']));
Заменить на:
PHP:
        // Referals
        if (isset($_COOKIE['ref']))
        {
            DB()->query("UPDATE ".BB_USERS." SET user_points = user_points + 100 WHERE user_id = ". intval($_COOKIE['ref']));
            DB()->query("INSERT INTO ". BB_REFERALS ." VALUES (". intval($_COOKIE['ref']) .", ". $new_user_id .")");
            cache_rm_user_sessions(intval($_COOKIE['ref']));
        }

Открыть templates/default/usercp_viewprofile.tpl
Найти:
HTML:
<!-- ENDIF / SHOW_PASSKEY -->
Вставить после:
HTML:
<!-- IF LOGGED_IN -->
<script type="text/javascript">
ajax.referals = function(mode) {
    $('#referals').html('<i class="loading-1">{L_LOADING}</i>');
    ajax.exec({
        action  : 'get_referals',
        user_id : {PROFILE_USER_ID}
    });
}
ajax.callback.get_referals = function(data) {
    $('#referals').html(data.referals_html);
}
</script>
<!-- ENDIF -->
Найти:
HTML:
<!-- IF IS_AM --><span id="ip_list"></span><!-- ENDIF -->
Вставить после:
HTML:
<span id="referals"></span>
Вставить в любое место в профиле (куда понравится):
HTML:
[ <a href="#" class="med" onclick="ajax.referals('get_referals'); return false;">Приглашенные пользователи</a> ]

P.S. Я думаю сам мод рефералов стоит переписать, чтобы начислять сидбонус только в том случае, если пользователь не только зарегался, но и активировал свой акк. Это более правильно и занимает больше времени, для накрутки сидбонусов.
На правах ИМХО :)
Опечатался ты:)
не
"Открыть includes/ucp/init_bb.php"
а
"Открыть includes/init_bb.php"
:)
 

macfleg

Пользователь
можно еще добавить сколько рефералов можно зарегать за определенное время. Что бы не накручивали СБ по n-количеству рефералов за 5 мин
 
G

Gemini_13

Гость
по хорошему мод переписать надо и сделать полноценный, а не собирать воедино огрызки, закрывать недочеты и пользоваться неправильной идеей как таковой. да и на счет ограничения рефералов, тоже верно подмечено, нужно ограничение в сутки.
 

Lynx

Пользователь
Мод работает, но при введении реферальной ссылки в адресную строку, вылазит вот такое окно:
ref.png
Так и должно быть?
 
Сверху