Файл: components/comments/frontend.php
Строк: 521
<?php
/******************************************************************************/
// //
// InstantCMS v1.10 //
// http://www.instantcms.ru/ //
// //
// written by InstantCMS Team, 2007-2012 //
// produced by InstantSoft, (www.instantsoft.ru) //
// //
// LICENSED BY GNU/GPL v2 //
// //
/******************************************************************************/
if(!defined('VALID_CMS')) { die('ACCESS DENIED'); }
function comments($target='', $target_id=0, $labels=array()){
$inCore = cmsCore::getInstance();
$inPage = cmsPage::getInstance();
$inDB = cmsDatabase::getInstance();
$inUser = cmsUser::getInstance();
cmsCore::loadModel('comments');
$model = new cms_model_comments($labels);
// Проверяем включени ли компонент
if(!$inCore->isComponentEnable('comments')) { return false; }
// Инициализируем права доступа для группы текущего пользователя
$model->initAccess();
global $_LANG;
$do = $inCore->do;
$page = cmsCore::request('page', 'int', 1);
$id = cmsCore::request('id', 'int', 0);
$login = cmsCore::strClear(urldecode(cmsCore::request('login', 'html', '')));
$inPage->addHeadJS('components/comments/js/comments.js');
//========================================================================================================================//
//========================================================================================================================//
if ($do == 'view' && !$target && !$target_id){
if(!$login){
$myprofile = false;
$page_title = $_LANG['COMMENTS_ON_SITE'];
$inPage->addHead('<link rel="alternate" type="application/rss+xml" title="'.$_LANG['COMMENTS'].'" href="'.HOST.'/rss/comments/all/feed.rss">');
} else {
// проверяем что пользователь есть
$user = cmsUser::getShortUserData($login);
if (!$user) { cmsCore::error404(); }
// Мои комментарии
$myprofile = ($inUser->id == $user['id']);
$page_title = $_LANG['COMMENTS'].' - '.$user['nickname'];
$inPage->addPathway($user['nickname'], cmsUser::getProfileURL($user['login']));
// Добавляем условие в выборку
$model->whereUserIs($user['id']);
}
$inPage->setTitle($page_title);
$inPage->addPathway($page_title);
// флаг модератора
$is_moder = ($inUser->is_admin || $model->is_can_moderate);
// Не админам только открытые комментарии
if(!($is_moder || $myprofile)){
$model->whereIsShow();
}
// Общее количество комментариев
$total = $model->getCommentsCount(!($is_moder || $myprofile));
// Сортировка и разбивка на страницы
$inDB->orderBy('c.pubdate', 'DESC');
$inDB->limitPage($page, $model->config['perpage']);
// Сами комментарии
$comments = $total ?
$model->getComments(!($is_moder || $myprofile)) :
array(); $inDB->resetConditions();
// пагинация
if(!$login){
$pagebar = cmsPage::getPagebar($total, $page, $model->config['perpage'], '/comments/page-%page%');
} else {
$pagebar = cmsPage::getPagebar($total, $page, $model->config['perpage'], 'javascript:centerLink('/comments/by_user_'.$user['login'].'/page-%page%')');
}
// Отдаем в шаблон
$smarty = $inCore->initSmarty('components', 'com_comments_list_all.tpl');
$smarty->assign('comments_count', $total);
$smarty->assign('comments', $comments);
$smarty->assign('pagebar', $pagebar);
$smarty->assign('is_user', $inUser->id);
$smarty->assign('page_title', $page_title);
$smarty->assign('cfg', $model->config);
$smarty->assign('is_admin', $is_moder);
$smarty->display('com_comments_list_all.tpl');
if ($inCore->inRequest('of_ajax')) { echo ob_get_clean(); exit; }
}
//========================================================================================================================//
//========================================================================================================================//
if (!in_array($do, array('add', 'edit', 'delete')) && $target && $target_id){
if (!$model->config['cmm_ajax']){
$model->whereTargetIs($target, $target_id);
$inDB->orderBy('c.pubdate', 'ASC');
$comments = cmsCore::callEvent('BEFORE_SHOW_COMMENTS', $model->getComments(!($inUser->is_admin || $model->is_can_moderate), true));
$total = count($comments);
ob_start();
$smarty = $inCore->initSmarty('components', 'com_comments_list.tpl');
$smarty->assign('comments_count', $total);
$smarty->assign('comments', $comments);
$smarty->assign('user_can_moderate', $model->is_can_moderate);
$smarty->assign('user_can_delete', $model->is_can_delete);
$smarty->assign('user_can_add', $model->is_can_add);
$smarty->assign('is_admin', $inUser->is_admin);
$smarty->assign('is_user', $inUser->id);
$smarty->assign('cfg', $model->config);
$smarty->assign('labels', $model->labels);
$smarty->assign('target', $target);
$smarty->assign('target_id', $target_id);
$smarty->display('com_comments_list.tpl');
$html = ob_get_clean();
} else {
$model->whereTargetIs($target, $target_id);
$total = $model->getCommentsCount(!($inUser->is_admin || $model->is_can_moderate));
$inDB->resetConditions();
}
$smarty = $inCore->initSmarty('components', 'com_comments_view.tpl');
$smarty->assign('comments_count', $total);
$smarty->assign('target', $target);
$smarty->assign('target_id', $target_id);
$smarty->assign('is_admin', $inUser->is_admin);
$smarty->assign('labels', $model->labels);
$smarty->assign('is_user', $inUser->id);
$smarty->assign('cfg', $model->config);
$smarty->assign('user_can_add', $model->is_can_add);
$smarty->assign('html', isset($html) ? $html : '');
$smarty->assign('add_comment_js', "addComment('".$target."', '".$target_id."', 0)");
$smarty->assign('user_subscribed', cmsUser::isSubscribed($inUser->id, $target, $target_id));
$smarty->display('com_comments_view.tpl');
}
//========================================================================================================================//
//========================================================================================================================//
// Добавление комментария, форма добавления в addform.php
if ($do=='add'){
// Только аякс
if($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') { die(); }
if(!cmsCore::validateForm()) { cmsCore::error404(); }
// Очищаем буфер
ob_end_clean();
// Добавлять могут только админы и те, кому разрешено в настройках группы
if (!$model->is_can_add && !$inUser->is_admin){ cmsCore::error404(); }
// Входные данные
$comment['guestname'] = cmsCore::request('guestname', 'str', '');
$comment['user_id'] = $inUser->id;
if ($model->is_can_bbcode){
$content = cmsCore::request('content', 'html', '');
$comment['content_bbcode'] = $inDB->escape_string($content);
$content = cmsCore::parseSmiles($content, true);
$comment['content'] = $inDB->escape_string($content);
} else {
$comment['content'] = cmsCore::request('content', 'str', '');
$comment['content_bbcode'] = $comment['content'];
$comment['content'] = str_replace(array('r', 'n'), '<br>', $comment['content']);
}
$comment['parent_id'] = cmsCore::request('parent_id', 'int', 0);
$comment['target'] = cmsCore::request('target', 'str', '');
$comment['target_id'] = cmsCore::request('target_id', 'int', 0);
$comment['ip'] = cmsCore::strClear($_SERVER['REMOTE_ADDR']);;
// Проверяем правильность/наличие входных парамеров
// цель комментария
if (!$comment['target'] || !$comment['target_id']) { cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'])); }
// Имя гостя отсутствует
if (!$comment['guestname'] && !$inUser->id) { cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_USER_NAME'])); }
// Текст комментраия отсутствует
if (!$comment['content']) { cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_COMMENT_TEXT'])); }
// проверяем каптчу
$need_captcha = $model->config['regcap'] ? true : ($inUser->id ? false : true);
if ($need_captcha && !cmsCore::checkCaptchaCode(cmsCore::request('code', 'str', ''))) { cmsCore::jsonOutput(array('error' => true, 'is_captcha' => true, 'text' => $_LANG['ERR_CAPTCHA'])); }
// получаем массив со ссылкой и заголовком цели комментария
// для этого:
// 1. узнаем ответственный компонент из cms_comment_targets
$target = $inDB->get_fields('cms_comment_targets', "target='{$comment['target']}'", '*');
if (!$target) { cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'] . ' #1')); }
// 2. подключим модель этого компонента
if(cmsCore::loadModel($target['component'])){
$model_class = 'cms_model_'.$target['component'];
if(class_exists($model_class)){
$target_model = new $model_class();
}
}
if (!isset($target_model)) { cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'] . ' #2')); }
// 3. запросим массив $target_data[link, title] у метода getCommentTarget модели
$target_data = $target_model->getCommentTarget($comment['target'], $comment['target_id']);
if (!$target_data) { cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'] . ' #3')); }
$comment['target_title'] = $target_data['title'];
$comment['target_link'] = $target_data['link'];
// 4. Узнаем видимость комментария в модели $target_model
if(method_exists($target_model, 'getVisibility')){
$comment['is_hidden'] = $target_model->getVisibility($comment['target'], $comment['target_id']);
} else {
$comment['is_hidden'] = 0;
}
// публикация согласно настроек
$comment['published'] = ($inUser->is_admin || $model->is_can_moderate || $model->is_add_published) ? 1 : 0;
// 5. добавляем комментарий в базу
$comment_id = $model->addComment($comment);
// 6. Пересчитываем количество комментариев у цели если нужно
if(method_exists($target_model, 'updateCommentsCount')){
$target_model->updateCommentsCount($comment['target'], $comment['target_id']);
}
if(!$comment['is_hidden'] && $comment['published']){
//регистрируем событие
$content_short = strip_tags($comment['content']);
cmsActions::log('add_comment', array(
'object' => $_LANG['COMMENT'],
'object_url' => $comment['target_link'] . '#c' . $comment_id,
'object_id' => $comment_id,
'target' => $comment['target_title'],
'target_url' => $comment['target_link'],
'target_id' => $comment['target_id'],
'description' => mb_strlen($content_short)>140 ? mb_substr($content_short, 0, 140) : $content_short
));
}
//подписываем пользователя на обновления, если нужно
if ($inUser->id && cmsCore::inRequest('subscribe')){
cmsUser::subscribe($inUser->id, $comment['target'], $comment['target_id']);
}
if ($comment['published']){
//рассылаем уведомления о новом комменте
cmsUser::sendUpdateNotify($comment['target'], $comment['target_id']);
//проверяем и выдаем награду если нужно
cmsUser::checkAwards($inUser->id);
}
$inConf = cmsConfig::getInstance();
//отправляем админу уведомление о комментарии на e-mail, если нужно
if($model->config['email']) {
$mailmsg = $_LANG['DATE'].": ".date('d m Y (H:i)')."n";
$mailmsg .= $_LANG['NEW_COMMENT'].': '.HOST.$target_data['link'].'#c'. $comment_id . "n";
$mailmsg .= "-------------------------------------------------------n";
$mailmsg .= strip_tags($comment['content']);
$email_subj = str_replace('{sitename}', $inConf->sitename, $_LANG['EMAIL_SUDJECT_NEW_COMM']);
$inCore->mailText($model->config['email'], $email_subj, $mailmsg);
}
//отправляем автору уведомление на e-mail
//получаем ID и e-mail автора
$author = $inUser->id ?
$model->getTargetAuthor($target['target_table'], $comment['target_id']) :
false;
if ($author && $comment['published']){
if ($model->isAuthorNeedMail($author['id']) && $inUser->id != $author['id']){
$from_nick = $inUser->id ? $inUser->nickname : $comment['guestname'];
$targetlink = HOST.$comment['target_link'] . '#c' . $comment_id;
$letter = file_get_contents(PATH.'/includes/letters/newpostcomment.txt');
$letter = str_replace('{sitename}', $inConf->sitename, $letter);
$letter = str_replace('{subj}', $target['subj'], $letter);
$letter = str_replace('{subjtitle}', $author['title'], $letter);
$letter = str_replace('{targetlink}', $targetlink, $letter);
$letter = str_replace('{date}', date('d/m/Y H:i:s'), $letter);
$letter = str_replace('{from}', $from_nick, $letter);
$inCore->mailText($author['email'], $_LANG['NEW_COMMENT'].'! - '.$inConf->sitename, $letter);
}
}
cmsUser::clearCsrfToken();
cmsCore::jsonOutput(array('error' => false,
'target' => $comment['target'],
'target_id' => $comment['target_id'],
'is_premod' => ($comment['published'] ? 0 : $_LANG['COMM_PREMODER_TEXT']),
'comment_id' => $comment_id));
}
//========================================================================================================================//
//========================================================================================================================//
if ($do=='edit'){
if($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') { die(); }
if(!cmsCore::validateForm()) { die(); }
$comment = $model->getComment(cmsCore::request('comment_id', 'int', 0));
if(!$comment) { die(); }
// редактировать могут авторы (если время редактирования есть)
// модераторы и администраторы
if (!$model->is_can_moderate &&
!$inUser->is_admin &&
!(($inUser->id == $comment['user_id']) && $comment['is_editable'])){ exit; }
if ($model->is_can_bbcode){
$content = cmsCore::request('content', 'html', '');
$com_new['content_bbcode'] = $inDB->escape_string($content);
$com_new['content'] = $inDB->escape_string(cmsCore::parseSmiles($content, true));
} else {
$com_new['content'] = cmsCore::request('content', 'str', '');
$com_new['content_bbcode'] = $com_new['content'];
$com_new['content'] = str_replace(array('r', 'n'), '<br>', $com_new['content']);
}
// Текст комментраия отсутствует
if (!$com_new['content']) { cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_COMMENT_TEXT'])); }
//Если ошибок не было,
//обновляем комментарий в базе
$model->updateComment($comment['id'], $com_new);
// Обновляем в ленте активности
$content_short = strip_tags($com_new['content']);
$content_short = mb_strlen($content_short)>140 ? mb_substr($content_short, 0, 140) : $content_short;
cmsActions::updateLog('add_comment', array('description' => $content_short), $comment['id']);
$com_new['content'] = stripslashes(str_replace(array('r', 'n'), ' ', $com_new['content']));
$com_new = cmsCore::callEvent('GET_COMMENT', $com_new);
cmsUser::clearCsrfToken();
cmsCore::jsonOutput(array('error' => false, 'text' => $com_new['content'], 'comment_id' => $comment['id']));
}
//========================================================================================================================//
//========================================================================================================================//
if ($do == 'delete'){
if($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') { die(); }
if(!cmsCore::validateForm()) { die(); }
$comment = $model->getComment($id);
if(!$comment) { die(); }
if (!$inUser->id && !($model->is_can_delete && $inUser->id == $comment['user_id']) && !$model->is_can_moderate && !$inUser->is_admin){ cmsCore::error404(); }
//узнаем ответственный компонент из cms_comment_targets
$target = $inDB->get_fields('cms_comment_targets', "target='{$comment['target']}'", '*');
if (!$target) { cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'] . ' #1')); }
$model->deleteComment($id);
//подключим модель этого компонента
if(cmsCore::loadModel($target['component'])){
$model_class = 'cms_model_'.$target['component'];
if(class_exists($model_class)){
$target_model = new $model_class();
// Пересчитываем количество комментариев у цели если нужно
if(method_exists($target_model, 'updateCommentsCount')){
$target_model->updateCommentsCount($comment['target'], $comment['target_id']);
}
}
}
cmsUser::clearCsrfToken();
cmsCore::jsonOutput(array('error' => false,
'target' => $comment['target'],
'target_id' => $comment['target_id']));
}
}
?>