Вход Регистрация
Файл: components/comments/model.php
Строк: 352
<?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'); }

class 
cms_model_comments{

    private 
$childs;

    public 
$is_can_delete    false;
    public 
$is_can_moderate  false;
    public 
$is_can_bbcode    false;
    public 
$is_can_add       false;
    public 
$is_add_published false;


    public function 
__construct($labels=array()){
        
$this->inDB   cmsDatabase::getInstance();
        
$this->config cmsCore::getInstance()->loadComponentConfig('comments');
        
cmsCore::loadLanguage('components/comments');
        
$this->labels $labels $labels self::getDefaultLabels();
    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public static function getDefaultConfig() {

        
$cfg = array (
                  
'email' => '',
                  
'regcap' => 0,
                  
'subscribe' => 1,
                  
'min_karma' => 0,
                  
'min_karma_show' => 0,
                  
'min_karma_add' => 0,
                  
'perpage' => 20,
                  
'cmm_ajax' => 0,
                  
'cmm_ip' => 1,
                  
'max_level' => 5,
                  
'edit_minutes' => 0,
                  
'watermark' => 0
                
);

        return 
$cfg;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public static function getDefaultLabels() {

        global 
$_LANG;

        return array(
'comments' => $_LANG['COMMENTS'], 'add' => $_LANG['ADD_COMM'], 'rss' => $_LANG['RSS_COMM'], 'not_comments' => $_LANG['NOT_COMMENT_TEXT']);

    }

/* ==================================================================================================== */
/* ==================================================================================================== */
    
public function initAccess() {

        
$this->is_can_delete    cmsUser::isUserCan('comments/delete');
        
$this->is_can_moderate  cmsUser::isUserCan('comments/moderate');
        
$this->is_can_bbcode    cmsUser::isUserCan('comments/bbcode');
        
$this->is_can_add       cmsUser::isUserCan('comments/add');
        
$this->is_add_published cmsUser::isUserCan('comments/add_published');

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function addComment($item) {

        
$item cmsCore::callEvent('ADD_COMMENT'$item);

        
$item['target_title'] = $this->inDB->escape_string($item['target_title']);

        
$comment_id $this->inDB->insert('cms_comments'$item);

        
cmsCore::setIdUploadImage('comment'$comment_id);

        return 
$comment_id;

    }

    public function 
updateComment($id$comment) {

        if (!
$id) { return false; }

       
$this->inDB->update('cms_comments'$comment$id);

       return 
true;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getTargetAuthor($table$target_id) {

        
$sql "SELECT u.id id, u.email email, p.title title
                FROM cms_users u, 
{$table} p
                WHERE p.user_id = u.id AND p.id = '
{$target_id}' AND u.is_locked = 0 AND u.is_deleted = 0
                LIMIT 1"
;

        
$result $this->inDB->query($sql);

        if (
$this->inDB->num_rows($result)!==1){ return false; }

        return 
$this->inDB->fetch_assoc($result);

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getCommentAuthorId($comment_id) {

        return 
$this->inDB->get_field('cms_comments'"id='$comment_id'"'user_id');

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function isAuthorNeedMail($author_id) {

        return 
$this->inDB->get_field('cms_user_profiles'"user_id='$author_id'"'email_newmsg');

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
private function getCommentChilds($comment_id) {

        
$sql "SELECT id FROM cms_comments WHERE parent_id = '$comment_id'";

        
$result $this->inDB->query($sql);

        if (!
$this->inDB->num_rows($result)) { return false; }

        while(
$child $this->inDB->fetch_assoc($result)){
            
$this->childs[] = $child;
            
$this->getCommentChilds($child['id']);
        }

        return 
true;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function deleteComment($comment_id) {

        
cmsCore::callEvent('DELETE_COMMENT'$comment_id);

        
$this->childs = array();

        
$this->getCommentChilds($comment_id);

        
$sql "DELETE FROM cms_comments WHERE id = '$comment_id' LIMIT 1";
        
$this->inDB->query($sql);
        
cmsCore::deleteRatings('comment'$comment_id);
        
cmsActions::removeObjectLog('add_comment'$comment_id);
        
cmsCore::deleteUploadImages($comment_id'comment');

        if (
$this->childs){
            foreach(
$this->childs as $child){
                
cmsCore::callEvent('DELETE_COMMENT'$child['id']);
                
$sql "DELETE FROM cms_comments WHERE id = '{$child['id']}' LIMIT 1";
                
$this->inDB->query($sql);
                
cmsCore::deleteRatings('comment'$child['id']);
                
cmsActions::removeObjectLog('add_comment'$child['id']);
                
cmsCore::deleteUploadImages($child['id'], 'comment');
            }
        }

        return 
true;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function isEditable($pubdate) {

        if(
cmsUser::getInstance()->is_admin) { return true; }

        if(!
$this->config['edit_minutes']) { return false; }

        
$now      time();
        
$date     strtotime($pubdate);
        
$diff_sec $now $date;
        
$end_min  $this->config['edit_minutes'] - round($diff_sec/60);

        return 
$end_min $end_min false;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */
    /**
     * Условия выборки
     */
    
public function whereUserIs($user_id) {
        
$this->inDB->where("c.user_id = '{$user_id}'");
    }

    public function 
whereOnlyUsers() {
        
$this->inDB->where("c.user_id > 0");
    }

    public function 
whereRatingOver($rating) {
        
$this->inDB->where("c.rating >= {$rating}");
    }

    public function 
whereTargetIs($target$target_id) {
        
$this->inDB->where("c.target='$target' AND c.target_id = '$target_id'");
    }

    public function 
whereTargetIn($targets) {
        
$t_list '';
        foreach(
$targets as $t){
            
$t_list .= "'$t',";
        }
        
$t_list rtrim($t_list',');
        
$this->inDB->where("c.target IN ({$t_list})");
    }

    public function 
whereIsShow() {
        
$this->inDB->where("c.is_hidden=0");
    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    /**
     * Получаем комментарии по заданным параметрам
     * @return array
     */
    
public function getComments($only_published=true$is_tree=false$from_module false) {

        
$inUser cmsUser::getInstance();

        
$comments = array();

        global 
$_LANG;

        
$published $only_published 'c.published = 1' '1=1';

        
$sql "SELECT c.*,
                       IFNULL(u.nickname, 0) as nickname,
                       IFNULL(u.login, 0) as login,
                       IFNULL(u.is_deleted, 0) as is_deleted,
                       IFNULL(p.imageurl, 0) as imageurl,
                       IFNULL(p.gender, 0) as gender
                FROM cms_comments c
                LEFT JOIN cms_users u ON u.id = c.user_id
                LEFT JOIN cms_user_profiles p ON p.user_id = u.id
                WHERE 
{$published}
                    
{$this->inDB->where}

                
{$this->inDB->group_by}

                
{$this->inDB->order_by}n";

        if (
$this->inDB->limit){
            
$sql .= "LIMIT {$this->inDB->limit}";
        }

        
$result $this->inDB->query($sql);

        
$this->inDB->resetConditions();

        if (!
$this->inDB->num_rows($result)) { return array(); }

        while(
$comment $this->inDB->fetch_assoc($result)){

            
$comment['level'] = 0;
            
$comment['is_editable'] = $this->isEditable($comment['pubdate']);
            
$comment['fpubdate']    = cmsCore::dateFormat($comment['pubdate'], truetrue);

            if (
$comment['guestname']){
                
$comment['author']     = $comment['guestname'];
                
$comment['is_profile'] = false;
                
$comment['ip']         = in_array($this->config['cmm_ip'], array(1,2)) ? $comment['ip'] : '';
            } else {
                
$comment['author']['nickname'] = $comment['nickname'];
                
$comment['author']['login']    = $comment['login'];
                
$comment['is_profile']     = true;
                
$comment['user_image']     = cmsUser::getUserAvatarUrl($comment['user_id'], 'small'$comment['imageurl'], $comment['is_deleted']);
                
$comment['ip']          = ($this->config['cmm_ip'] == && $comment['ip']) ? $comment['ip'] : '';
            }

            switch (
$comment['gender']){
                    case 
'm':     $comment['gender'] = $_LANG['COMMENTS_MALE'];
                                break;
                    case 
'f':    $comment['gender'] = $_LANG['COMMENTS_FEMALE'];
                                break;
                    default:    
$comment['gender'] = $_LANG['COMMENTS_GENDER'];
            }

            
$comment['show']  = (!$this->config['min_karma'] || $comment['rating'] >= $this->config['min_karma_show']) || cmsUser::userIsAdmin($comment['user_id']);
            
$comment['is_my'] = ($inUser->id == $comment['user_id']);
            if (
$inUser->id){
                
$comment['is_voted'] = $comment['is_my'] ? true cmsUser::isRateUser('comment'$inUser->id$comment['id']);
            } else {
                
$comment['is_voted'] = true;
            }

            
$comments[] = $comment;

        }

        if(
$is_tree){
            
$comments $this->buildTree(00$comments);
        }

        return 
$from_module cmsCore::callEvent('GET_COMMENTS_MODULE'$comments) : cmsCore::callEvent('GET_COMMENTS'$comments);

    }

/* ==================================================================================================== */
/* ==================================================================================================== */
    /**
     * Возвращает количество комментариев по заданным параметрам
     * @return int
     */
    
public function getCommentsCount($only_published=true) {

        
$published $only_published 'c.published = 1' '1=1';

        
$sql "SELECT 1
                FROM cms_comments c
                LEFT JOIN cms_users u ON u.id = c.user_id
                WHERE 
{$published}
                      
{$this->inDB->where}
                
{$this->inDB->group_by}";

        
$result $this->inDB->query($sql);

        return 
$this->inDB->num_rows($result);

    }

/* ==================================================================================================== */
/* ==================================================================================================== */
    
public function getComment($id) {

        
$sql "SELECT c.*,
                       IFNULL(u.nickname, 0) as nickname,
                       IFNULL(u.login, 0) as login,
                       IFNULL(u.is_deleted, 0) as is_deleted,
                       IFNULL(p.imageurl, 0) as imageurl
                FROM cms_comments c
                LEFT JOIN cms_users u ON u.id = c.user_id
                LEFT JOIN cms_user_profiles p ON p.user_id = u.id
                WHERE c.id='
{$id}'
                LIMIT 1"
;

        
$result $this->inDB->query($sql);

        if (!
$this->inDB->num_rows($result)) { return false; }

        
$comment $this->inDB->fetch_assoc($result);

        
$comment['is_editable'] = $this->isEditable($comment['pubdate']);

        return 
cmsCore::callEvent('GET_COMMENT'$comment);

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
private function buildTree($parent_id$level$comments$tree=array()){
        
$level++;
        foreach(
$comments as $comment){
            if (
$comment['parent_id']==$parent_id){
                
$comment['level'] = $level-1;
                
$tree[] = $comment;
                
$tree $this->buildTree($comment['id'], $level$comments$tree);
            }
        }
        return 
$tree;
    }

/* ==================================================================================================== */
/* ==================================================================================================== */

}
Онлайн: 0
Реклама