Обмеження кількості повідомлень для форуму phpBB

Виникла необхідність обмежити кількість повідомлень, які розміщують певні користувачі на форумі phpBB 3.0.7. Віднайшов рішення цієї задачі!

Створюємо файл modinstall.php наступного вмісту:

    session_begin();
        $auth->acl($user->data);
        $user->setup();
        include($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
        $auth_admin = new auth_admin();

        $result = $auth_admin->acl_add_option(array(
            'local'      => array('u_limit_posts_per_day'),
            'global'   => array('u_limit_posts_per_day')
        ));
        
        print ('Permissions install ' . ($result ? 'completed successfully' : 'failed'));
    ?>

Встановлюємо на файл всі необхідні прав та виконуємо в браузері. Після, файл видаляємо!

Наступне, відкриваємо файл language/en/common.php (та для усіх решта інстальованих мов) і в самому кінці, перед ?> прописуємо:

//-- mod: LimitPostsPerDay ------------------------------------------------------------
$lang = array_merge($lang, array(
    'acl_u_limit_posts_per_day'        => array('lang' => 'Only allowed to make a limited number of posts per day', 'cat' => 'post'),
    'POST_PER_DAY_LIMIT_REACHED'    => 'You have reached your daily post limit. You are allowed to make %d posts per %d-hour period.
Please try again later.' )); //-- end: LimitPostsPerDay ------------------------------------------------------------

В кінці іншого файлу includes/functions.php прописуємо:

//-- mod: LimitPostsPerDay ------------------------------------------------------------
/*  Check to see whether daily post limit has been reached  */
define('DAILY_POST_LIMIT_TIMESPAN', 24); // 24 hours 
define('DAILY_POST_LIMIT', 10); // 10 posts per day 

function LimitPostsPerDay($forum_id)
{
    global $LimitPostsPerDay, $db, $auth, $user;
    
    // Have we run this check already? No sense in doing it twice.
    if (isset($LimitPostsPerDay))
    {
        return $LimitPostsPerDay;
    }
    
    
    // Do we have the "limited post" permission set?
    if ($auth->acl_get('u_limit_posts_per_day', $forum_id))  
    { 
        $sql = 'SELECT count(post_id) as post_count 
            FROM ' . POSTS_TABLE . '
            WHERE post_time > ' . (time() - 3600 * DAILY_POST_LIMIT_TIMESPAN) . '
            AND poster_id = ' . $user->data['user_id']; 
        $row = $db->sql_fetchrow($db->sql_query($sql));
        if ($row['post_count'] >= DAILY_POST_LIMIT)
        {
            return true; // Limit posts. We've made all we're allowed.
        }
    }
    
    return false; // We haven't hit our limit (or we haven't been set as a limited user). Woohoo! No limits!
    
}
//-- end: LimitPostsPerDay ------------------------------------------------------------
 

У файлі viewforum.php знаходимо стрічку:

        'S_DISPLAY_POST_INFO'    => ($forum_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
      

Замінюємо на:

    //-- mod: LimitPostsPerDay ------------------------------------------------------------
    /*
        'S_DISPLAY_POST_INFO'    => ($forum_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
    */
        'S_DISPLAY_POST_INFO'    => ($forum_data['forum_type'] == FORUM_POST && (($auth->acl_get('f_post', $forum_id) && !LimitPostsPerDay($forum_id)) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
    //-- end: LimitPostsPerDay ------------------------------------------------------------
     

У файлі viewtopic.php знаходимо стрічку:

         'S_DISPLAY_POST_INFO'    => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
        'S_DISPLAY_REPLY_INFO'    => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
     

Замінюємо на:

    //-- mod: LimitPostsPerDay ------------------------------------------------------------
    /*
        'S_DISPLAY_POST_INFO'    => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
        'S_DISPLAY_REPLY_INFO'    => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
    */
        'S_DISPLAY_POST_INFO'    => ($topic_data['forum_type'] == FORUM_POST && (($auth->acl_get('f_post', $forum_id) && !LimitPostsPerDay($forum_id)) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
        'S_DISPLAY_REPLY_INFO'    => ($topic_data['forum_type'] == FORUM_POST && (($auth->acl_get('f_post', $forum_id) && !LimitPostsPerDay($forum_id)) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
    //-- end: LimitPostsPerDay ------------------------------------------------------------
      

У файлі posting.php знаходимо стрічку:

             $error[] = $user->lang['FLOOD_ERROR'];
        }
    }

Після додаємо:

//-- mod: LimitPostsPerDay ------------------------------------------------------------
    if ($mode != 'edit' && !$preview && !$refresh && LimitPostsPerDay($forum_id))
    {
        $error[] = sprintf($user->lang['POST_PER_DAY_LIMIT_REACHED'], DAILY_POST_LIMIT);
    }
//-- end: LimitPostsPerDay ------------------------------------------------------------
  

Це все! Тепер ми можемо зайти в панель адміністратора, обрати користувача і встановити йому відповідне обмеження:

1 комментарий on "Обмеження кількості повідомлень для форуму phpBB"

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.