View file app/core/classes/Forum.php

File size: 9.03Kb
<?php

class Forum {

    function AddPost($razdel, $forum, $tema, $post = false) {
        if ($_POST['ok'] && User::$user['id'] && $tema['closed'] == 0) {

            if (mb_strlen(Cms::Input($_POST['text'])) < 2 || mb_strlen(Cms::Input($_POST['text'])) > 10000) {
                $error .= 'Недопустимая длина текста сообщения!<br/>';
            }

            //ограничение на отправку сообщений
            if (DB::run("SELECT COUNT(*) FROM `antiflood` WHERE `ip`='" . Recipe::getClientIP() . "' AND `time` > '" . intval(Cms::realtime() - Cms::setup('antiflood')) . "'")->fetchColumn() > 0) {
                $error .= 'Вы не можете отправлять сообщения чаще 1 раза в ' . Functions::ending_second(Cms::setup('antiflood')) . '! Пожалуйста, немного подождите...<br/>';
            }

            if (Cms::setup('captcha_add_post') == 1 && $_POST['captcha'] != $_COOKIE['code']) {
                $error .= 'Проверочное число с картинки введено не верно!<br/>';
            }

            for ($i = 0; $i < count($_FILES['file']['name']); $i++) {
                $do_file = false;
                // Проверка загрузки с обычного браузера
                if ($_FILES['file']['size'][$i] > 0) {
                    $do_file = true;
                    $ifnamefile = strtolower($_FILES['file']['name'][$i]);
                    $typ = pathinfo($ifnamefile, PATHINFO_EXTENSION);
                    $rand = rand(11111, 99999); //случайное число	
                    //Конечное имя файла для сохранения без расширения
                    $fnamefile = Functions::name_replace($ifnamefile);
                    //Конечное имя файла для сохранения с расширением
                    $ftp = Functions::name_replace(Functions::truncate($ifnamefile, 200)) . '_' . $rand . '_' . strtoupper(str_replace('http://', '', Cms::setup('home'))) . '.' . $typ;
                    $fsizefile = $_FILES['file']['size'][$i];
                }

                //обработка файла
                if ($do_file) {
                    // Список недопустимых расширений файлов.
                    $al_ext = explode(", ", Cms::setup('filetype_forum'));
                    $ext = explode(".", $ftp);
                    // Проверка на допустимый размер файла
                    if ($fsizefile >= Cms::setup('filesize_forum') * 1024 * 1024) {
                        $error .= 'Недопустимый вес файла ' . $ifnamefile . '!<br/>';
                    }
                    // Проверка файла на наличие только одного расширения
                    /*
                      if (count($ext) != 2)
                      $error .= 'Файл ' . $ftp . ' имеет двойное расширение!<br/>';
                      ; */
                    // Проверка недопустимых расширений файлов
                    if (!in_array($typ, $al_ext)) {
                        $error .= 'Запрещенный тип файла ' . $ifnamefile . '!<br/>';
                    }

                    if ($typ == null) {
                        $error .= 'Файл ' . $ifnamefile . ' не имеет расширения!<br/>';
                    }
                }
            }

            if (count($_FILES['file']['name']) > Cms::setup('filecount_forum')) {
                $error .= 'Вы не можете загрузить больше ' . Cms::setup('filecount_forum') . ' файлов!';
            }

            if (!isset($error)) {
                DB::run("INSERT INTO `post` SET 
                `id_razdel` = '" . $razdel['id'] . "', 
                    `id_forum` = '" . $forum['id'] . "', 
                        `id_tema` = '" . $tema['id'] . "', 
                            `id_user` = '" . $this->user['id'] . "', 
                                `text` = '" . Cms::Input($_POST['text']) . "', 
                                    `time` = '" . Cms::realtime() . "', 
                                        `type` = '" . $forum['type'] . "'");

                $postid = DB::lastInsertId();

                Cms::antiflood(); //антифлуд

                /* обработка загрузки файлов */
                for ($i = 0; $i < count($_FILES['file']['name']); $i++) {
                    $do_file = false;
                    // Проверка загрузки с обычного браузера
                    if ($_FILES['file']['size'][$i] > 0) {
                        $do_file = true;
                        $ifnamefile = strtolower($_FILES['file']['name'][$i]);
                        $typ = pathinfo($ifnamefile, PATHINFO_EXTENSION);
                        $rand = rand(11111, 99999); //случайное число	
                        //Конечное имя файла для сохранения без расширения
                        $fnamefile = Functions::name_replace($ifnamefile);
                        //Конечное имя файла для сохранения с расширением
                        $ftp = Functions::name_replace(Functions::truncate($ifnamefile, 200)) . '_' . $rand . '_' . strtoupper(str_replace('http://', '', Cms::setup('home'))) . '.' . $typ;
                        $fsizefile = $_FILES['file']['size'][$i];
                    }

                    if ((move_uploaded_file($_FILES['file']['tmp_name'][$i], HOME . '/files/user/' . $this->user['id'] . '/forum/' . $ftp)) == true) {
                        DB::run("INSERT INTO `post_files` SET 
                            `id_razdel` = '" . $razdel['id'] . "', 
                                `id_forum` = '" . $forum['id'] . "', 
                                    `id_tema` = '" . $tema['id'] . "', 
                                        `id_post` = '" . $postid . "',
                                            `id_user` = '" . $this->user['id'] . "', 
                                                `file` = '" . $ftp . "', 
                                                    `type` = '" . $typ . "', 
                                                        `size` = '" . Functions::size($fsizefile) . "', 
                                                            `time` = '" . Cms::realtime() . "'");
                    }
                }

                //поднимаем тему выше
                DB::run("UPDATE `tema` SET
                        `id_user_last` = '" . $this->user['id'] . "',
                            `id_post_last` = '" . $postid . "',
                                `countpost` = '" . Cms::Int($tema['countpost'] + 1) . "',
                                    `time` = '" . Cms::realtime() . "' WHERE `id` = '" . $tema['id'] . "'");

                //обновляем кол-во постов у пользователя
                DB::run("UPDATE `users` SET `countpost` = '" . Cms::Int($this->user['countpost'] + 1) . "' WHERE `id` = '" . $this->user['id'] . "'");

                //обновляем кол-во постов у форума, подфорума
                DB::run("UPDATE `forum` SET `countpost` = '" . Cms::Int($razdel['countpost'] + 1) . "' WHERE `id` = '" . $razdel['id'] . "'");
                DB::run("UPDATE `forum` SET `countpost` = '" . Cms::Int($forum['countpost'] + 1) . "' WHERE `id` = '" . $forum['id'] . "'");

                $count = DB::run("SELECT COUNT(*) FROM `post` WHERE `id_tema`=" . $tema['id'] . "")->fetchColumn();
                $starts = max(0, (int) $count - (((int) $count % (int) $this->message) == 0 ? $this->message : ((int) $count % (int) $this->message)));
                
                Cms::addballs(Cms::setup('balls_add_post'));//прибавляем баллы

                /* уведомляем */
                if ($_POST['reply'] == 1) {
                    Cms::notice($post['id_user'], User::$user['id'], 'Ответил на Ваше сообщение: ' . $_POST['text'] . ' [b]в теме [url=' . Cms::setup('home') . '/forum/' . $razdel['id'] . '/' . $forum['id'] . '/' . $tema['id'] . '/post/'.$postid.']' . Functions::esc($tema['name']) . '[/url][/b]');
                }
                if ($_POST['quote'] == 1) {
                    Cms::notice($post['id_user'], User::$user['id'], 'Процитировал Ваше сообщение: ' . $_POST['text'] . ' [b]в теме [url=' . Cms::setup('home') . '/forum/' . $razdel['id'] . '/' . $forum['id'] . '/' . $tema['id'] . '/post/'.$postid.']' . Functions::esc($tema['name']) . '[/url][/b]');
                }
                Functions::redirect(Cms::setup('home') . '/forum/' . $razdel['id'] . '/' . $forum['id'] . '/' . $tema['id'] . '?page=' . $starts . '#' . $postid);
            }
        }

        SmartySingleton::instance()->assign(array(
            'error' => $error
        ));
    }

}