Файл: InstantSocial/uploud/components/comments/frontend.php
Строк: 705
<?php
/******************************************************************************/
// //
// InstantCMS v1.9 //
// http://www.instantcms.ru/ //
// //
// written by InstantCMS Team, 2007-2011 //
// 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();
$inCore->loadModel('comments');
$model = new cms_model_comments();
//Загружаем настройки компонента
$cfg = $inCore->loadComponentConfig('comments');
// Проверяем включени ли компонент
if(!$cfg['component_enabled']) { return false; }
if (!isset($cfg['bbcode'])) { $cfg['bbcode'] = 1; }
if (!isset($cfg['regcap'])) { $cfg['regcap'] = 1; }
if (!isset($cfg['min_karma'])) { $cfg['min_karma'] = 0; }
if (!isset($cfg['min_karma_add'])) { $cfg['min_karma_add'] = 0; }
if (!isset($cfg['min_karma_show'])) { $cfg['min_karma_show'] = 0; }
if(!isset($cfg['cmm_ajax'])) { $cfg['cmm_ajax']=0; }
if(!isset($cfg['max_level'])) { $cfg['max_level']=5; }
global $_LANG;
$inCore->loadLanguage('components/comments');
// Значения по умолчанию для надписей
$def_labels = array('comments' => $_LANG['COMMENTS'], 'add' => $_LANG['ADD_COMM'], 'rss' => $_LANG['RSS_COMM'], 'not_comments' => $_LANG['NOT_COMMENT_TEXT']);
if (!$labels) { $labels = $def_labels; }
//Определяем адрес для редиректа назад
$back = $inCore->getBackURL();
$do = $inCore->request('do', 'str', 'view');
//========================================================================================================================//
//========================================================================================================================//
if ($do == 'view' && !$target && !$target_id){
$inPage->addHeadJS('components/comments/js/comments.js');
// Загружаем функции профиля
$inCore->includeFile('components/users/includes/usercore.php');
// Заголовки и глубиномер
$inPage->setTitle($_LANG['COMMENTS']);
$inPage->addPathway($_LANG['COMMENTS']);
$inPage->backButton(false);
// Пагинация
$perpage = $cfg['perpage'] ? $cfg['perpage'] : 20;
$page = $inCore->request('page', 'int', 1);
$is_admin = $inCore->userIsAdmin($inUser->id);
//Загружаем комментарии
$comments = array();
// Считаем общее число количество комментариев
$hidden_sql = $inUser->is_admin ? '' : 'AND is_hidden=0';
$total = $inDB->rows_count('cms_comments', "published=1 {$hidden_sql}");
// Если есть комментарии, выбираем и обрабатываем
if ($total){
$comments_list = $model->getCommentsAll($page, $perpage);
foreach($comments_list as $comment){
$next = sizeof($comments);
$comments[$next] = $comment;
if ($comments[$next]['guestname']) {
$comments[$next]['author'] = $comments[$next]['guestname'];
$comments[$next]['is_profile'] =false;
$comments[$next]['ip'] = (($cfg['cmm_ip'] == 1 || $cfg['cmm_ip'] == 2) && $comments[$next]['ip']) ? '('.$comments[$next]['ip'].')' : false;
} else {
$comments[$next]['author']['nickname'] = $comments[$next]['nickname'];
$comments[$next]['author']['login'] = $comments[$next]['login'];
$comments[$next]['is_profile'] = true;
$comments[$next]['user_image'] = usrImageNOdb($comments[$next]['user_id'], 'small', $comments[$next]['imageurl'], $comments[$next]['is_deleted']);
$comments[$next]['ip'] = ($cfg['cmm_ip'] == 2 && $comments[$next]['ip']) ? '('.$comments[$next]['ip'].')' : false;
}
$comments[$next]['show'] = ((!$cfg['min_karma'] || $comments[$next]['votes']>=$cfg['min_karma_show']) || $inCore->userIsAdmin($comments[$next]['user_id']));
if ($comments[$next]['votes']>0){
$comments[$next]['votes'] = '<span class="cmm_good">+'.$comments[$next]['votes'].'</span>';
} elseif ($comments[$next]['votes']<0){
$comments[$next]['votes'] = '<span class="cmm_bad">'.$comments[$next]['votes'].'</span>';
}
}
}
$inPage->addHead('<link rel="alternate" type="application/rss+xml" title="'.$_LANG['BOARD'].'" href="'.HOST.'/rss/comments/all/feed.rss">');
// Отдаем в шаблон
$smarty = $inCore->initSmarty('components', 'com_comments_list_all.tpl');
$smarty->assign('comments_count', $total);
$smarty->assign('comments', $comments);
$smarty->assign('pagebar', cmsPage::getPagebar($total, $page, $perpage, '/comments/page-%page%'));
$smarty->assign('is_user', $inUser->id);
$smarty->assign('cfg', $cfg);
$smarty->assign('is_admin', $is_admin);
$smarty->assign('url', $_SERVER['REQUEST_URI']);
$smarty->display('com_comments_list_all.tpl');
}
//========================================================================================================================//
//========================================================================================================================//
if ($do!='add' && $do!='edit' && $do!='delete' && $target && $target_id){
$inPage->addHeadJS('includes/jquery/autogrow/jquery.autogrow.js');
$inPage->addHeadJS('components/comments/js/comments.js');
if ($cfg['bbcode'] || $cfg['smiles']){
$inPage->addHeadJS('core/js/smiles.js');
}
$cm_message = isset($_SESSION['cm_message']) ? $_SESSION['cm_message'] : '';
$cm_error = isset($_SESSION['cm_error']) ? $_SESSION['cm_error'] : '';
unset($_SESSION['cm_message']);
unset($_SESSION['cm_error']);
$wall_posts_count = $inDB->rows_count('cms_comments', "target = '$target' AND target_id = '$target_id' AND parent_id=0");
$wall_comments_count = $inDB->rows_count('cms_comments', "target = '$target' AND target_id = '$target_id' AND parent_id>0");
$comments_count = $model->getCommentsCount($target, $target_id);
$is_admin = $inCore->userIsAdmin($inUser->id);
$user_can_delete = $inCore->isUserCan('comments/delete');
$user_can_moderate = $inCore->isUserCan('comments/moderate');
if (!$cfg['cmm_ajax']){
//activate profiles support
$inCore->includeFile('components/users/includes/usercore.php');
//LIST COMMENTS
$comments = array();
$tree = array();
$comments_list = $model->getComments($target, $target_id, $cfg);
foreach($comments_list as $comment){
$next = sizeof($comments);
$comments[$next] = $comment;
$comments[$next]['level'] = 0;
if ($comments[$next]['guestname']) {
$comments[$next]['author'] = $comments[$next]['guestname'];
$comments[$next]['is_profile'] = false;
$comments[$next]['ip'] = (($cfg['cmm_ip'] == 1 || $cfg['cmm_ip'] == 2) && $comments[$next]['ip']) ? '('.$comments[$next]['ip'].')' : false;
} else {
$comments[$next]['author']['nickname'] = $comments[$next]['nickname'];
$comments[$next]['author']['login'] = $comments[$next]['login'];
$comments[$next]['is_profile'] = true;
$comments[$next]['user_image'] = usrImageNOdb($comments[$next]['user_id'], 'small', $comments[$next]['imageurl'], $comments[$next]['is_deleted']);
$comments[$next]['ip'] = ($cfg['cmm_ip'] == 2 && $comments[$next]['ip']) ? '('.$comments[$next]['ip'].')' : false;
}
$comments[$next]['show'] = ((!$cfg['min_karma'] || $comments[$next]['votes']>=$cfg['min_karma_show']) || $inCore->userIsAdmin($comments[$next]['user_id']));
if ($comments[$next]['votes']>0){
$comments[$next]['votes'] = '<span class="cmm_good">+'.$comments[$next]['votes'].'</span>';
} elseif ($comments[$next]['votes']<0){
$comments[$next]['votes'] = '<span class="cmm_bad">'.$comments[$next]['votes'].'</span>';
}
$comments[$next]['is_my'] = ($inUser->id==$comments[$next]['user_id']);
if ($inUser->id){
$comments[$next]['is_voted'] = ($comments[$next]['is_my'] || $inDB->rows_count('cms_ratings', 'item_id='.$comments[$next]['id'].' AND target='comment' AND user_id='.$inUser->id, 1));
}
}
$model->buildTree(0, 0, $comments, $tree);
ob_start();
$smarty = $inCore->initSmarty('components', 'com_comments_list.tpl');
$smarty->assign('comments_count', $comments_count);
$smarty->assign('wall_posts_count', $wall_posts_count);
$smarty->assign('wall_comments_count', $wall_comments_count);
$smarty->assign('comments', $tree);
$smarty->assign('user_can_moderate', $user_can_moderate);
$smarty->assign('user_can_delete', $user_can_delete);
$smarty->assign('is_admin', $is_admin);
$smarty->assign('is_user', $inUser->id);
$smarty->assign('cfg', $cfg);
$smarty->assign('labels', $labels);
$smarty->assign('target', $target);
$smarty->assign('target_id', $target_id);
$smarty->assign('url', $_SERVER['REQUEST_URI']);
$smarty->display('com_comments_list.tpl');
$html = ob_get_clean();
}
$smarty = $inCore->initSmarty('components', 'com_comments_view.tpl');
$smarty->assign('cm_message', $cm_message);
$smarty->assign('cm_error', $cm_error);
$smarty->assign('comments_count', $comments_count);
$smarty->assign('target', $target);
$smarty->assign('target_id', $target_id);
$smarty->assign('is_admin', $is_admin);
$smarty->assign('labels', $labels);
$smarty->assign('is_user', $inUser->id);
$smarty->assign('cfg', $cfg);
$smarty->assign('html', $html);
$smarty->assign('add_comment_js', "addComment('".md5(session_id())."', '".$target."', '".$target_id."', 0)");
$smarty->assign('user_subscribed', cmsUser::isSubscribed($inUser->id, $target, $target_id));
$smarty->display('com_comments_view.tpl');
}
//========================================================================================================================//
//========================================================================================================================//
if ($do=='add'){
//Удаляем сообщение об ошибках комментариев
unset($_SESSION['cm_error']);
$error = '';
$captha_code = $inCore->request('code', 'str', '');
$guestname = $inCore->request('guestname', 'str', '');
$user_id = $inCore->request('user_id', 'int', 0);
if ($inCore->isUserCan('comments/bbcode') && ($cfg['bbcode'] || $cfg['smiles'])) {
$content = $inCore->request('content', 'html', '');
$content_bb = $inDB->escape_string($content);
$content = $inCore->parseSmiles($content, true);
$content = $inDB->escape_string($content);
} else {
$content = $inCore->request('content', 'str', '');
$content_bb = '';
}
$need_captcha = (!$inUser->id || ($inUser->id && $cfg['regcap']==1));
$target = $inCore->request('target', 'str', '');
$target_id = $inCore->request('target_id', 'int', 0);
$ip = $_SERVER['REMOTE_ADDR'];
if (!$target || !$target_id) { $error = $_LANG['ERR_UNKNOWN_TARGET']; }
//Проверяем ошибки
if ($user_id != $inUser->id) { $error = $_LANG['ERR_DEFINE_USER']; }
if (!$guestname && !$user_id) { $error = $_LANG['ERR_USER_NAME']; }
if (!$content) { $error = $_LANG['ERR_COMMENT_TEXT']; }
if ($need_captcha && !$inCore->checkCaptchaCode($inCore->request('code', 'str'))) { $error = $_LANG['ERR_CAPTCHA']; }
// получаем массив со ссылкой и заголовком цели комментария
// для этого:
// 1. узнаем ответственный компонент из cms_comment_targets
$target_component = $inDB->get_field('cms_comment_targets', "target='{$target}'", 'component');
if (!$target_component) { $error = true; cmsCore::addSessionMessage($_LANG['ERR_UNKNOWN_TARGET'] . ' #1', 'error'); $inCore->redirect('/comments'); }
// 2. подключим модель этого компонента
$inCore->loadModel($target_component);
$model_class = 'cms_model_'.$target_component;
$target_model = new $model_class();
if (!$target_model) { $error = true; cmsCore::addSessionMessage($_LANG['ERR_UNKNOWN_TARGET'] . ' #2', 'error'); $inCore->redirect('/comments'); }
// 3. запросим массив $target[link, title] у метода getCommentTarget модели
if ($target=="wall") {
$target_data = $target_model->getWallTarget($target, $target_id);
}else {
$target_data = $target_model->getCommentTarget($target, $target_id);
}
if (!$target_data) { $error = true; cmsCore::addSessionMessage($_LANG['ERR_UNKNOWN_TARGET'] . ' #3', 'error'); $inCore->redirect('/comments'); }
// 4. Узнаем видимость комментария в модели $target_model
if(method_exists($target_model, 'getVisibility')){
$is_hidden = $target_model->getVisibility($target, $target_id);
} else {
$is_hidden = 0;
}
//Если ошибок не было,
//добавляем комментарий в базу
if(!$error){
$parent_id = $inCore->request('parent_id', 'int', 0);
//помещаем комментарий в базу
$comment_id = $model->addComment(array(
'parent_id'=>$parent_id,
'user_id'=>$user_id,
'target'=>$target,
'target_id'=>$target_id,
'guestname'=>$guestname,
'content'=>$content,
'content_bbcode'=>$content_bb,
'published'=>$cfg['publish'],
'target_title'=>$target_data['title'],
'target_link'=>$target_data['link'],
'ip'=>$ip,
'is_hidden'=>$is_hidden
));
if(!$is_hidden){
//регистрируем событие
if ($target=="wall") {
if ($user_id==$target_id) {
$add_wall=($parent_id==0 ? "add_wall_my" : "add_wall_my_comment");
}
else{
$add_wall=($parent_id==0 ? "add_wall" : "add_wall_comment");
}
cmsActions::log(''.$add_wall.'', array(
'object' => 'ссылка',
'object_url' => $target_data['link'] . '#c' . $comment_id,
'object_id' => $comment_id,
'target' => $target_data['title'],
'target_url' => $target_data['link'],
'target_id' => 0,
'description' => strip_tags( strlen(strip_tags($content))>140 ? substr(strip_tags($content), 0, 140) : $content )
));
} else {
cmsActions::log('add_comment', array(
'object' => 'комментарий',
'object_url' => $target_data['link'] . '#c' . $comment_id,
'object_id' => $comment_id,
'target' => $target_data['title'],
'target_url' => $target_data['link'],
'target_id' => 0,
'description' => strip_tags( strlen(strip_tags($content))>140 ? substr(strip_tags($content), 0, 140) : $content )
));
}
}
//подписываем пользователя на обновления, если нужно
if ($inUser->id && $inCore->inRequest('subscribe')){
cmsUser::isSubscribed($inUser->id, $target, $target_id);
}
//рассылаем уведомления о новом комменте
cmsUser::sendUpdateNotify($target, $target_id);
//проверяем и выдаем награду если нужно
cmsUser::checkAwards( $inUser->id );
//смотрим настройки модерации
if (!$cfg['publish']){
$_SESSION['cm_message'] = $_LANG['COMM_PREMODER_TEXT'];
}
$inConf = cmsConfig::getInstance();
//отправляем админу уведомление о комментарии на e-mail, если нужно
if($cfg['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($content);
$mailmsg = wordwrap($mailmsg, 70);
$email_subj = str_replace('{sitename}', $inConf->sitename, $_LANG['EMAIL_SUDJECT_NEW_COMM']);
$inCore->mailText($cfg['email'], $email_subj, $mailmsg);
}
//если коммент для блога или фотографии, отправляем автору уведомление на e-mail
if($target=='userphoto' || $target=='blog' || $target=='photo' || $target=='wall'){
switch($target){
case 'wall':
$table = 'cms_users';
$subj = "Ваша стена";
$targetlink = HOST.'/users/%login%/'.$target_id.'.html#c'.$comment_id;
break;
case 'userphoto':
$table = 'cms_user_photos';
$subj = $_LANG['YOUR_PHOTO'];
$targetlink = HOST.'/users/%author_id%/photo'.$target_id.'.html#c'.$comment_id;
break;
case 'photo':
$table = 'cms_photo_files';
$subj = $_LANG['YOUR_PHOTO'];
$targetlink = HOST.'/photos/photo'.$target_id.'.html#c'.$comment_id;
break;
case 'blog':
$table = 'cms_blog_posts';
$subj = $_LANG['YOUR_POST'];
$targetlink = HOST.'%post_url%#c'.$comment_id;
break;
}
//получаем ID и e-mail автора
$author = $model->getTargetAuthor($table, $target_id);
if ($author){
$needmail = $model->isAuthorNeedMail($author['id']);
if ($needmail && $user_id != $author['id']){
$postdate = date('d/m/Y H:i:s');
$to_email = $author['email'];
$from_nick = $user_id ? $inDB->get_field('cms_users', "id='{$user_id}'", 'nickname') : $guestname;
$targetlink = str_replace('%author_id%', $author['id'], $targetlink);
if (strstr($targetlink, '%post_url%')){
$inCore->loadModel('blogs');
$model = new cms_model_blogs();
$post = $model->getPost($target_id);
$targetlink = str_replace('%post_url%', $model->getPostURL(0, $post['bloglink'], $post['seolink']), $targetlink);
}
$letter_path = PATH.'/includes/letters/newpostcomment.txt';
$letter = file_get_contents($letter_path);
$letter = str_replace('{sitename}', $inConf->sitename, $letter);
$letter = str_replace('{subj}', $subj, $letter);
$letter = str_replace('{subjtitle}', $author['title'], $letter);
$letter = str_replace('{targetlink}', $targetlink, $letter);
$letter = str_replace('{date}', $postdate, $letter);
$letter = str_replace('{from}', $from_nick, $letter);
$inCore->mailText($to_email, $_LANG['NEW_COMMENT'].'! - '.$inConf->sitename, $letter);
}
}
}
}
if ($error) { $_SESSION['cm_error'] = $error; }
$inCore->redirect($back.'#c'.$comment_id);
}
//========================================================================================================================//
//========================================================================================================================//
if ($do=='edit'){
if (!$inUser->id){ cmsCore::error404(); }
//Удаляем сообщение об ошибках комментариев
unset($_SESSION['cm_error']);
$error = '';
if ($inCore->isUserCan('comments/bbcode') && ($cfg['bbcode'] || $cfg['smiles'])) {
$content = $inCore->request('content', 'html', '');
$content_bb = $inDB->escape_string($content);
$content = $inCore->parseSmiles($content, true);
$content = $inDB->escape_string($content);
} else {
$content = $inCore->request('content', 'str', '');
$content_bb = '';
}
$comment_id = $inCore->request('comment_id', 'int', 0);
//Проверяем ошибки
if (!$comment_id) { $error = $_LANG['ERR_UNKNOWN_TARGET']; }
if (!$content) { $error = $_LANG['ERR_COMMENT_TEXT']; }
$comment = $model->getComment($comment_id, $cfg);
if ((!$comment['is_editable'] || $comment['user_id']!=$inUser->id) && !$inUser->is_admin) {
$error = $_LANG['ERR_UNKNOWN_TARGET'];
}
//Если ошибок не было,
//обновляем комментарий в базе
if(!$error){
//помещаем комментарий в базу
$model->updateComment($comment_id, array(
'content'=>$content,
'content_bbcode'=>$content_bb
));
$content = strip_tags( strlen(strip_tags($content))>140 ? substr(strip_tags($content), 0, 140) : $content );
cmsActions::updateLog('add_comment', array('description' => $content), $comment_id);
}
if ($error) { $_SESSION['cm_error'] = $error; }
$inCore->redirect($back.'#c'.$comment_id);
}
//========================================================================================================================//
//========================================================================================================================//
if ($do == 'delete'){
if (!$inUser->id){ cmsCore::error404(); }
$id = $inCore->request('id', 'int', 0);
if($id){
$comment_user = $model->getCommentAuthorId($id);
$is_admin = $inCore->userIsAdmin( $inUser->id );
$is_my = ($inUser->id == $comment_user);
if($is_admin || ($is_my&&$inCore->isUserCan('comments/delete')) || $inCore->isUserCan('comments/moderate')){
$model->deleteComment($id);
$_SESSION['cm_message'] = $_LANG['COMM_SUC_DELETE'];
}
}
$inCore->redirectBack($back.'#c');
}
//========================================================================================================================//
$inCore->executePluginRoute($do);
} //function
?>