Вход Регистрация
Файл: mc-2.6.3/modules/forum/controllers/forum.php
Строк: 251
<?php
/**
     * MobileCMS
     *
     * Open source content management system for mobile sites
     *
     * @author MobileCMS Team <support@mobilecms.ru>
     * @copyright Copyright (c) 2011, MobileCMS Team
     * @link http://mobilecms.ru Official site
     * @license http://opensource.org/licenses/gpl-license.php GNU Public License
     */

defined('IN_SYSTEM') or die('<b>403<br />Запрет доступа!</b>');

/**
 * Контроллер форума, пользовательская часть
 */
class Forum_Controller extends Controller {
    
/**
     * Метод по умолчанию
     */
    
public function action_index() {
        
$this->action_list_sections();
    }

    
/**
     * Список разделов
     */
    
public function action_list_sections() {
        
$sections = array();
        
$result $this->db->query("SELECT * FROM #__forum_sections ORDER BY position");
        while (
$section $this->db->fetch_array($result)) {
            if (
$this->config['forum']['show_forums_in_list_sections'] || $section['section_id'] == @$_GET['section_id']) {
                
$section['forums'] = array();
                
$result1 $this->db->query("SELECT * FROM #__forum_forums WHERE section_id = '".$section['section_id']."' ORDER BY position");
                while (
$forum $this->db->fetch_array($result1)) $section['forums'][] = $forum;
            }
            
$sections[] = $section;
        }

        
$this->tpl->assign(array(
            
'sections' => $sections
        
));
    
        
$this->tpl->display('list_sections');
    }

    
/**
     * Просмотр форума
     */
    
public function action_viewforum() {
        
$this->per_page $this->config['forum']['topics_per_page'];

        if (
$_GET['type'] != 'new') {
            if (!
$forum $this->db->get_row("SELECT * FROM #__forum_forums WHERE forum_id = '".intval($_GET['forum_id'])."'"))
                
a_error("Форум не найден!");
        }

        
# Получение данных
        
switch ($_GET['type']) {
            case 
'new':
                
$sql "SELECT SQL_CALC_FOUND_ROWS ft.*, u.username AS last_username
                      FROM #__forum_topics AS ft
                      INNER JOIN #__users AS u ON ft.last_user_id = u.user_id
                      ORDER BY ft.time DESC
                      LIMIT 
$this->start$this->per_page";
                  break;
            default:
                
$sql "SELECT SQL_CALC_FOUND_ROWS ft.*, u.username AS last_username
                      FROM #__forum_topics AS ft
                      INNER JOIN #__users AS u ON ft.last_user_id = u.user_id
                      WHERE ft.forum_id = '"
$forum['forum_id']."'
                      ORDER BY ft.is_top_topic DESC, ft.last_message_time DESC
                      LIMIT 
$this->start$this->per_page";
                break;
        }

        
$topics $this->db->get_array($sql);
        
$total $this->db->get_one("SELECT FOUND_ROWS()");

        
# Пагинация
        
$pg_conf['base_url'] = a_url('forum/viewforum''forum_id='.$_GET['forum_id'].'&amp;type='.$_GET['type'].'&amp;start=');
        
$pg_conf['total_rows'] = $total;
        
$pg_conf['per_page'] = $this->per_page;

        
a_import('libraries/pagination');
        
$pg = new CI_Pagination($pg_conf);

        
$this->tpl->assign(array(
            
'topics' => $topics,
            
'forum' => $forum,
            
'total' => $total,
            
'pagination' => $pg->create_links(),
            
'section' => $this->db->get_row("SELECT * FROM #__forum_sections WHERE section_id = '".$forum['section_id']."'"),
            
'messages_per_page' => $this->config['forum']['messages_per_page']
        ));

        
$this->tpl->display('viewforum');
    }

    
/**
     * Просмотр темы
     */
    
public function action_viewtopic() {
        
$this->per_page $this->config['forum']['messages_per_page'];

        if (!
$topic $this->db->get_row("SELECT * FROM #__forum_topics WHERE topic_id = '".intval($_GET['topic_id'])."'"))
            
a_error("Тема не найдена!");

        
# Получение данных
          
$result $this->db->query("SELECT SQL_CALC_FOUND_ROWS fm.*, u.username AS username, u.status AS user_status, up.avatar AS avatar_exists, u.last_visit, ff.file_id, ff.file_size, ff.file_downloads, ff.file_name
              FROM #__forum_messages AS fm
              INNER JOIN #__users AS u USING(user_id)
              LEFT JOIN #__users_profiles AS up USING(user_id)
            LEFT JOIN #__forum_files AS ff USING(message_id)
              WHERE fm.topic_id = '"
$topic['topic_id']."'
              ORDER BY fm.message_id ASC
              LIMIT 
$this->start$this->per_page
          "
);

          
$messages = array();
          
$num $this->start;
          if (!
class_exists('smiles')) a_import('modules/smiles/helpers/smiles');
          while (
$message $this->db->fetch_array($result)) {
              
$message['num'] = ++$num;
              
$message['message'] = main::bbcode($message['message']);
              
$message['message'] = smiles::smiles_replace($message['message']);
              
$message['message'] = nl2br($message['message']);
              
$messages[] = $message;
          }

          
$total $this->db->get_one("SELECT FOUND_ROWS()");

        
# Пагинация
        
$pg_conf['base_url'] = a_url('forum/viewtopic''topic_id='.$_GET['topic_id'].'&amp;start=');
        
$pg_conf['total_rows'] = $total;
        
$pg_conf['per_page'] = $this->per_page;

        
a_import('libraries/pagination');
        
$pg = new CI_Pagination($pg_conf);

        
$this->tpl->assign(array(
            
'messages' => $messages,
            
'topic' => $topic,
            
'total' => $total,
            
'pagination' => $pg->create_links(),
            
'forum' => $this->db->get_row("SELECT * FROM #__forum_forums WHERE forum_id = '".$topic['forum_id']."'")
        ));

        
$this->tpl->display('viewtopic');
    }

    
/**
     * Закрепление / открепление темы
     */
    
public function action_topic_top() {
        if (!
$topic $this->db->get_row("SELECT * FROM #__forum_topics WHERE topic_id = '".intval($_GET['topic_id'])."'"))
            
a_error("Тема не найдена!");
    
        if (
ACCESS_LEVEL 8a_error('У вас нет прав на выполнение этой операции!');
    
        
$status $_GET['a'] == 'top' 0;
        
$this->db->query("UPDATE #__forum_topics SET is_top_topic = '$status' WHERE topic_id = '".$topic['topic_id']."'");
    
        
header("Location: ".a_url('forum/viewforum''forum_id='.$topic['forum_id'].'&start='.@$_GET['start'], TRUE));
        exit;
    }

    
/**
     * Закрытие / окрытие темы
     */
    
public function action_topic_close() {
        if (!
$topic $this->db->get_row("SELECT * FROM #__forum_topics WHERE topic_id = '".intval($_GET['topic_id'])."'"))
            
a_error("Тема не найдена!");
    
        if (
ACCESS_LEVEL 8a_error('У вас нет прав на выполнение этой операции!');
    
        
$status $_GET['a'] == 'close' 0;
        
$this->db->query("UPDATE #__forum_topics SET is_close_topic = '$status' WHERE topic_id = '".$topic['topic_id']."'");
    
        
header("Location: ".a_url('forum/viewforum''forum_id='.$topic['forum_id'].'&start='.@$_GET['start'], TRUE));
        exit;
    }

    
/**
     * Закрытие / окрытие темы
     */
    
public function action_topic_delete() {
        if(!
$topic $this->db->get_row("SELECT * FROM #__forum_topics WHERE topic_id = '"intval($_GET['topic_id']) ."'")) {
                    
a_error("Тема не найдена!");
        }
    
        if(
ACCESS_LEVEL 8) {
            
a_error('У вас нет прав на выполнение этой операции!');
        }

        if(!empty(
$_GET['confirm'])) {
            
# удаляем тему
            
$this->db->query("DELETE FROM #__forum_topics WHERE topic_id = '"$topic['topic_id'] ."'");
            
# удаляем сообщения в теме
            
$this->db->query("DELETE FROM #__forum_messages WHERE topic_id = '"$topic['topic_id'] ."'");
            
# обновляем счетчик тем и сообщений в форуме
            
$this->db->query("UPDATE #__forum_forums SET
                topics = topics - 1,
                messages = messages - "
$topic['messages'] ." - 1
                WHERE forum_id = '"
$topic['forum_id'] ."'
            "
);
    
            
header("Location: "a_url('forum/viewforum''forum_id='$topic['forum_id'] .'&start='. @$_GET['start'], TRUE));
            exit;
        } else {
            
a_confirm('Действительно хотите удалить тему &laquo;'$topic['name'] .'&raquo; со всеми сообщениями?'a_url('forum/topic_delete''confirm=yes&amp;topic_id='$topic['topic_id'] .'&amp;start='. @$_GET['start']), a_url('forum/viewforum''forum_id='$topic['forum_id'] .'&amp;start='. @$_GET['start']));
        }
    }

    
/**
     * Удаление сообщения
     */
    
public function action_message_delete() {
        if(!
$message $this->db->get_row("SELECT m.*,
            (SELECT status FROM #__users AS u WHERE u.user_id = m.user_id) AS user_status
            FROM #__forum_messages AS m
            WHERE message_id = '"
intval($_GET['message_id']) ."'")) {
                    
a_error("Сообщение не найдено!");
        }

        if(!
a_check_rights($message['user_id'], $message['user_status']) || !$message['is_last_message']) {
                    
a_error('У вас нет права удалять данное сообщение!');
        }

        if(!empty(
$_GET['confirm'])) {
            
# Удаляем сообщение
            
$this->db->query("DELETE FROM #__forum_messages WHERE message_id = '"$message['message_id'] ."'");
            
# Обновляем счетчики сообщений
            
$this->db->query("UPDATE #__forum_topics SET messages = messages - 1 WHERE topic_id = '"$message['topic_id'] ."'");
            
$this->db->query("UPDATE #__forum_forums SET messages = messages - 1 WHERE forum_id = '"$message['forum_id'] ."'");
    
            
# Отнимаем рейтинг
            
user::rating_update(-1$message['user_id']);
    
            
header("Location: "a_url('forum/viewtopic''topic_id='$message['topic_id'] .'&start='. @$_GET['start'], TRUE));
            exit;
        } else {
            
a_confirm('Действительно хотите удалить данное сообщение?'a_url('forum/message_delete''confirm=yes&amp;message_id='$message['message_id'] .'&amp;start='. @$_GET['start']), a_url('forum/viewtopic''topic_id='$message['topic_id'] .'&amp;start='. @$_GET['start']));
        }
    }

    
/**
     * Постинг
     */
    
public function action_posting() {
        if(!empty(
$_GET['new_topic'])) {
            if(!
$forum $this->db->get_row("SELECT * FROM #__forum_forums WHERE forum_id = '"intval($_GET['forum_id']) ."'")) {
                            
a_error("Форум не найден!");
            }
            
$action 'new_topic';
            
$message = array();
            
$title "Новая тема";
    
            if(
USER_ID == -&& !$this->config['forum']['guests_create_topics']) {
                            
a_error("Гости не имеют права создвать темы!<br />Зарегистрируйтесь или войдите под своим именем.");
            }
        } else {
            if(
is_numeric($_GET['message_id'])) {
                if(!
$message $this->db->get_row("SELECT * FROM #__forum_messages WHERE message_id = '"intval($_GET['message_id']) ."'")) {
                                    
a_error("Сообщение не найдено!");
                }
                    
                if(
ACCESS_LEVEL && $message['user_id'] != USER_ID) {
                                    
a_error("У вас нет прав редактировать данное сообщение!");
                }
                
                if(
$message['is_first_message'] == 1) {
                    
$action 'edit_first_message';
                } else {
                    
$action 'edit_message';
                }
    
                
$title "Редактировать сообщение";
                
$message_text $message['message'];
                
$topic_id $message['topic_id'];
            } else {
                
$action 'new_message';
                
$message = array();
                
$title "Новое сообщение";
                
$topic_id $_GET['topic_id'];
    
                
$message_text '';
    
                if (!empty(
$_GET['replay'])) {
                    
$message_text .= '[b]'.$_GET['replay'].'[/b], ';
                }
                elseif (
is_numeric($_GET['q'])) {
                    if (!
$q_post $this->db->get_row("SELECT * FROM #__forum_messages LEFT JOIN #__users USING(user_id) WHERE message_id = '".intval($_GET['q'])."'"))
                        
a_error("Не найден пост для цитирования");
    
                    
$message_text .= '[q]'.$q_post['username'].' ('.date('d.m.Y в H:i'$q_post['time']).')'.PHP_EOL;
                    
$message_text .= $q_post['message'].'[/q]'.PHP_EOL;
                }

                if (
USER_ID == -&& !$this->config['forum']['guests_write_messages'])
                    
a_error("Гости не имеют отвечать на темы!<br />Зарегистрируйтесь или войдите под своим именем.");
            }

            if (!
$topic $this->db->get_row("SELECT * FROM #__forum_topics WHERE topic_id = '".intval($topic_id)."'"))
                
a_error("Тема не найдена!");

               
# Определяем можно ли постить в теме
               
if (ACCESS_LEVEL && $topic['is_close_topic'])
                   
a_error("Тема закрыта, вы не имеете права писать и редактировать сообщения!");
          }

        if (isset(
$_POST['submit'])) {
            if (
$action == 'new_topic' || $action == 'edit_first_message') {
                if (empty(
$_POST['topic_name'])) {
                    
$this->error .= 'Укажите название темы!<br />';
                }
            }
            if (empty(
$_POST['message'])) {
                
$this->error .= 'Укажите сообщение!<br />';
            }
            
# Проверка кода с картинки
            
if (USER_ID == -1) {
                if (
$_POST['captcha_code'] != $_SESSION['captcha_code']) {
                    
$this->error .= 'Неверно указан код с картинки<br />';
                }
            }
            
# Проверка прикрепляемого файла
            
if (!empty($_FILES['attach']['tmp_name'])) {
                
$file_ext array_pop(explode('.'$_FILES['attach']['name']));
                
                if (!
strstr(';'.$this->config['forum']['allowed_filetypes'].';'';'.$file_ext.';'))
                    
$this->error .= 'Вы пытаетесь загрузить запрещенный тип файла<br />';
                    
                if (
filesize($_FILES['attach']['tmp_name']) > $this->config['forum']['max_filesize'] * 1048576)
                    
$this->error .= 'Размер загружаемого файла превышает допустимый размер ('.$this->config['forum']['max_filesize'].' Mb)<br />';
            }

            if (!
$this->error) {
                
$_SESSION['captcha_code'] = main::get_unique_code(4);

                switch (
$action) {
                    
# Создание темы
                    
case 'new_topic':
                        
# Добавляем тему
                        
$this->db->query("INSERT INTO #__forum_topics SET
                            section_id = '"
$forum['section_id']."',
                            forum_id = '"
$forum['forum_id']."',
                            user_id = '"
USER_ID."',
                            name = '"
a_safe($_POST['topic_name'])."',
                            time = UNIX_TIMESTAMP(),
                            last_message_time = UNIX_TIMESTAMP(),
                            last_user_id = '"
USER_ID."'
                        "
);
                        
$topic_id $this->db->insert_id();
    
                        
# Добавляем сообщение
                        
$this->db->query("INSERT INTO #__forum_messages SET
                            topic_id = '"
$topic_id."',
                            section_id = '"
$forum['section_id']."',
                            forum_id = '"
$forum['forum_id']."',
                            user_id = '"
USER_ID."',
                            message = '"
a_safe($_POST['message'])."',
                            is_first_message = 1,
                            time = UNIX_TIMESTAMP()
                        "
);
                        
$message_id $this->db->insert_id();
    
                        
# Увеличиваем количество тем и сообщений в форуме
                        
$this->db->query("UPDATE #__forum_forums SET
                            topics = topics + 1,
                            messages = messages + 1
                            WHERE
                            forum_id = '"
$forum['forum_id']."'
                        "
);
        
                        
# Добавляем рейтинг
                        
user::rating_update();
    
                        
$location a_url('forum/viewtopic''topic_id='.$topic_idtrue);
                        break;
                    
# Добавление сообщения
                    
case 'new_message':
                        
# Снимаем метку с последнего сообщения
                        
$this->db->query("UPDATE #__forum_messages SET is_last_message = 0 WHERE topic_id = '".$topic['topic_id']."'");
    
                        
# Добавляем сообщение
                        
$this->db->query("INSERT INTO #__forum_messages SET
                            topic_id = '"
$topic['topic_id']."',
                            section_id = '"
$topic['section_id']."',
                            forum_id = '"
$topic['forum_id']."',
                            user_id = '"
USER_ID."',
                            message = '"
a_safe($_POST['message'])."',
                            is_last_message = 1,
                            time = UNIX_TIMESTAMP()
                        "
);
                        
$message_id $this->db->insert_id();
    
                        
# Обновляем счетчик сообщений темы и время последнего сообщения
                        
$this->db->query("UPDATE #__forum_topics SET
                            messages = messages + 1,
                            last_message_time = UNIX_TIMESTAMP(),
                            last_user_id = '"
USER_ID."'
                            WHERE topic_id = '"
$topic['topic_id']."'
                        "
);
    
                        
# Увеличиваем количество сообщений в форуме
                        
$this->db->query("UPDATE #__forum_forums SET
                            messages = messages + 1
                            WHERE
                            forum_id = '"
$topic['forum_id']."'
                        "
);
    
                        
# Добавляем рейтинг
                        
user::rating_update();
    
                        
# Определяем start для пагинации
                        
$messages $topic['messages'] + 1;
                        
$start floor($messages $this->config['forum']['messages_per_page']) * $this->config['forum']['messages_per_page'];
        
                        
$location a_url('forum/viewtopic''topic_id='.$topic['topic_id'].'&start='.$starttrue);
                        break;
                    
# Редактирование сообщения
                    
case 'edit_first_message':
                        
$this->db->query("UPDATE #__forum_topics SET name = '".a_safe($_POST['topic_name'])."' WHERE topic_id = '".$message['topic_id']."'");
                    case 
'edit_message':
                        
# Изменяем сообщение
                        
$this->db->query("UPDATE #__forum_messages SET
                            message = '"
a_safe($_POST['message'])."',
                            edit_editor = '"
$this->user['username']."',
                            edit_time = UNIX_TIMESTAMP(),
                            edit_count = edit_count + 1
                            WHERE
                            message_id = '"
$message['message_id']."'
                        "
);
                        
$message_id $message['message_id'];
    
                        
$location a_url('forum/viewtopic''topic_id='.$message['topic_id'], true);
                        break;
                }
                
                if (!empty(
$_FILES['attach']['tmp_name'])) {
                    
# Удаляем старый файл, если имеется
                    
if ($old_file $this->db->get_row("SELECT * FROM #__forum_files WHERE message_id = '$message_id'")) {
                        @
unlink(ROOT.'files/forum/'.main::get_dir($old_file['file_id']).'/'.$old_file['file_name']);
                        
$this->db->query("DELETE FROM #__forum_files WHERE file_id = '".$old_file['file_id']."'");
                    }
                    
                    
# Получаем ID нового файла
                    
$this->db->query("INSERT INTO #__forum_files SET file_id = NULL");
                    
$file_id $this->db->insert_id();
                    
                    
# Генерируем имя загружаемого файла
                    
$file_name $file_id.'_'.preg_replace('/[^a-zA-Z0-9_.]+/'''$_FILES['attach']['name']);
                    
                    
# Создаем папку для файла если необходимо
                    
$directory ROOT.'files/forum/'.main::get_dir($file_id);
                    if (!
file_exists($directory)) {
                        
mkdir($directory);
                        
chmod($directory0777);
                    }
                    
                    
# Перемещаем новый файл
                    
move_uploaded_file($_FILES['attach']['tmp_name'], $directory.'/'.$file_name);
                    
chmod($directory.'/'.$file_name0777);
                    
                    
# Получаем размер файла
                    
$file_size filesize($directory.'/'.$file_name);
                    
                    
# Обновляем данные о файле
                    
$this->db->query("UPDATE #__forum_files SET
                        message_id = '
$message_id',
                        file_name = '"
.a_safe($file_name)."',
                        file_size = '
$file_size'
                        WHERE file_id = 
$file_id
                    "
);
                }
                
                
header('Location: '.$location);
                exit;
            }
        }
        if (!isset(
$_POST['submit']) || $this->error) {
            
$_SESSION['captcha_code'] = main::get_unique_code(4);
    
            
$this->tpl->assign(array(
            
'error' => $this->error,
            
'title' => $title,
            
'message' => $message,
            
'topic' => $topic,
            
'forum' => $forum,
            
'action' => $action,
            
'message_text' => $message_text
            
));
    
            
$this->tpl->display('posting');
        }
    }

    
/**
     * Листинг новых сообщений
     */
    
public function action_new_messages() {
        
$this->per_page $this->config['forum']['messages_per_page'];

        
$sql "SELECT SQL_CALC_FOUND_ROWS m.*, t.name AS topic_name, u.username, u.last_visit, up.avatar AS avatar_exists,
            (SELECT COUNT(*) FROM #__forum_messages AS fm WHERE fm.topic_id = m.topic_id) AS all_messages
            FROM #__forum_messages AS m LEFT JOIN #__forum_topics AS t USING(topic_id) LEFT JOIN #__users AS u ON u.user_id = m.user_id LEFT JOIN #__users_profiles AS up ON up.user_id = u.user_id
            ORDER BY m.time DESC
            LIMIT 
$this->start$this->per_page
        "
;

        
$result $this->db->query($sql);
        
$total $this->db->get_one("SELECT FOUND_ROWS()");

        
$messages = array();
          if (!
class_exists('smiles')) a_import('modules/smiles/helpers/smiles');
          while (
$message $this->db->fetch_array($result)) {
              
$message['message'] = main::bbcode($message['message']);
              
$message['message'] = smiles::smiles_replace($message['message']);
              
$message['message'] = nl2br($message['message']);
              
$messages[] = $message;
          }

          
# Пагинация
        
$pg_conf['base_url'] = a_url('forum/new_messages''start=');
        
$pg_conf['total_rows'] = $total;
        
$pg_conf['per_page'] = $this->per_page;

        
a_import('libraries/pagination');
        
$pg = new CI_Pagination($pg_conf);

        
$this->tpl->assign(array(
            
'messages' => $messages,
            
'total' => $total,
            
'pagination' => $pg->create_links(),
            
'messages_per_page' => $this->per_page
        
));

        
$this->tpl->display('new_messages');
    }
    
    
/**
     * Скачивание прикрепленного файла
     */
    
public function action_download_attach() {
        if (!
$file $this->db->get_row("SELECT * FROM #__forum_files WHERE file_id = '".intval($_GET['file_id'])."'"))
            
a_error('Файл не найден!');
            
        
# Обновляем счетчик скачиваний
        
$this->db->query("UPDATE #__forum_files SET file_downloads = file_downloads + 1 WHERE file_id = '".$file['file_id']."'");
        
        
# Перенаправляем на файл
        
header('Location: '.URL.'files/forum/'.main::get_dir($file['file_id']).'/'.$file['file_name']);
    }
}
?>
Онлайн: 1
Реклама