Файл: system/controllers/comments/model.php
Строк: 322
<?php
class modelComments extends cmsModel{
//============================================================================//
//============================================================================//
    public function updateCommentContent($id, $content, $content_html){
        cmsCache::getInstance()->clean("comments.list");
        return $this->update('comments', $id, array(
            'content'=>$content,
            'content_html'=>$content_html
        ));
    }
    public function updateCommentsPrivacy($is_private){
        cmsCache::getInstance()->clean("comments.list");
        return $this->updateFiltered('comments', array('is_private' => $is_private));
    }
//============================================================================//
//============================================================================//
    public function deleteComment($id){
        $this->update('comments', $id, array('is_deleted'=>1));
        cmsCache::getInstance()->clean("comments.list");
    }
    public function deleteUserComments($user_id){
        $this->filterEqual('user_id', $user_id)->updateFiltered('comments', array('is_deleted'=>1));
        $this->delete('comments_tracks', $user_id, 'user_id');
        cmsCache::getInstance()->clean("comments.list");
    }
    public function deleteComments($target_controller, $target_subject, $target_id=false){
        $this->filterEqual('target_controller', $target_controller);
        $this->filterEqual('target_subject', $target_subject);
        
        if ($target_id){
            $this->filterEqual('target_id', $target_id);
        }
        $this->deleteFiltered('comments');
        cmsCache::getInstance()->clean("comments.list");
    }
//============================================================================//
//============================================================================//
    public function addComment($comment){
        if ($comment['parent_id'] == 0){
            $comment['level'] = 1;
            $comment['ordering'] = $this->getNextThreadOrdering($comment['target_controller'], $comment['target_subject'], $comment['target_id']);
        } else {
            $parent_comment = $this->getComment($comment['parent_id']);
            $comment['level'] = $parent_comment['level'] + 1;
            $comment['ordering'] = $this->getNextParentOrdering($parent_comment);
            if (!$comment['ordering']) { $comment['ordering'] = $this->getNextThreadOrdering($comment['target_controller'], $comment['target_subject'], $comment['target_id']); }
            $this->incrementThreadOrdering($comment['target_controller'], $comment['target_subject'], $comment['target_id'], $comment['ordering']);
        }
        cmsCache::getInstance()->clean("comments.list");
        return $this->insert('comments', $comment);
    }
//============================================================================//
//============================================================================//
    public function isUserVoted($comment_id, $user_id){
        $this->filterEqual('comment_id', $comment_id);
        $this->filterEqual('user_id', $user_id);
        $is_voted = (bool)$this->getCount('comments_rating');
        $this->resetFilters();
        return $is_voted;
    }
    public function rateComment($comment_id, $user_id, $score){
        $this->insert('comments_rating', array(
            'comment_id' => $comment_id,
            'user_id' => $user_id,
            'score' => $score
        ));
        $this->filterEqual('id', $comment_id);
        $this->increment('comments', 'rating', $score);
        return true;
    }
//============================================================================//
//============================================================================//
    public function getNextParentOrdering($parent_comment){
        $this->filterEqual('target_controller', $parent_comment['target_controller']);
        $this->filterEqual('target_subject', $parent_comment['target_subject']);
        $this->filterEqual('target_id', $parent_comment['target_id']);
        $this->filterLtEqual('level', $parent_comment['level']);
        $this->filterGt('ordering', $parent_comment['ordering']);
        $this->limit(1);
        return $this->getItem('comments', function($item){
            return $item['ordering'];
        });
    }
    public function getNextThreadOrdering($target_controller, $target_subject, $target_id){
        return $this->getMaxThreadOrdering($target_controller, $target_subject, $target_id) + 1;
    }
    public function getMaxThreadOrdering($target_controller, $target_subject, $target_id){
        $this->filterEqual('target_controller', $target_controller);
        $this->filterEqual('target_subject', $target_subject);
        $this->filterEqual('target_id', $target_id);
        return $this->getMaxOrdering('comments');
    }
    public function incrementThreadOrdering($target_controller, $target_subject, $target_id, $after){
        $this->filterEqual('target_controller', $target_controller);
        $this->filterEqual('target_subject', $target_subject);
        $this->filterEqual('target_id', $target_id);
        $this->filterGtEqual('ordering', $after);
        $this->increment('comments', 'ordering');
    }
//============================================================================//
//============================================================================//
    public function getCommentsCount(){
        $count = $this->getCount('comments');
        return $count;
    }
//============================================================================//
//============================================================================//
    public function getComments(){
        $user = cmsUser::getInstance();
        $this->select('r.score', 'is_rated');
        $this->joinUserLeft();
        $this->joinLeft('comments_rating', 'r', "r.comment_id = i.id AND r.user_id='{$user->id}'");
        if (!$this->order_by){
            $this->orderBy('ordering');
        }
        $this->useCache("comments.list");
        return $this->get('comments', function($item, $model){
            $item['user'] = array(
                'id' => $item['user_id'],
                'nickname' => $item['user_nickname'],
                'avatar' => $item['user_avatar']
            );
            return $item;
        });
    }
//============================================================================//
//============================================================================//
    public function getComment($id){
        $this->select('u.nickname', 'user_nickname');
        $this->select('u.avatar', 'user_avatar');
        $this->joinUserLeft();
        return $this->getItemById('comments', $id, function($item, $model){
            $item['user'] = array(
                'id' => $item['user_id'],
                'nickname' => $item['user_nickname'],
                'avatar' => $item['user_avatar']
            );
            return $item;
        });
    }
//============================================================================//
//============================================================================//
    public function getTracking($user_id){
        $this->useCache("comments.tracks");
        $this->filterEqual('user_id', $user_id);
        return $this->getItem('comments_tracks');
    }
    public function addTracking($user_id, $target_controller, $target_subject, $target_id){
        // Получаем модель целевого контроллера
        $target_model = cmsCore::getModel( $target_controller );
        // Получаем URL и заголовок комментируемой страницы
        $target_info = $target_model->getTargetItemInfo($target_subject, $target_id);
        if (!$target_info){ return false; }
        cmsCache::getInstance()->clean("comments.tracks");
        return $this->insert('comments_tracks', array(
            'user_id' => $user_id,
            'target_controller' => $target_controller,
            'target_subject' => $target_subject,
            'target_id' => $target_id,
            'target_url' => $target_info['url'],
            'target_title' => $target_info['title'],
        ));
    }
    public function deleteTracking($id){
        cmsCache::getInstance()->clean("comments.tracks");
        return $this->delete('comments_tracks', $id);
    }
    public function toggleTracking($is_track, $user_id, $target_controller, $target_subject, $target_id){
        $track = $this->getTracking($user_id);
        if ($track && $is_track) { return true; }
        if (!$track && !$is_track) { return true; }
        if ($track && !$is_track) { return $this->deleteTracking($track['id']); }
        if (!$track && $is_track) { return $this->addTracking($user_id, $target_controller, $target_subject, $target_id); }
        return false;
    }
    public function getTrackingUsers(){
        $this->useCache("comments.tracks");
        return $this->get('comments_tracks', function($item, $model){
            return $item['user_id'];
        }, false);
    }
    public function getTrackedNewCounts($user_id, $date_after){
        $this->filterEqual('user_id', $user_id);
        $tracks = $this->get('comments_tracks');
        if (!$tracks) { return false; }
        $counts = array();
        $timestamp = strtotime($date_after);
        foreach($tracks as $track){
        $this->
            resetFilters()->
            filterTimestampGt('date_pub', $timestamp)->
            filterEqual('target_controller', $track['target_controller'])->
            filterEqual('target_subject', $track['target_subject'])->
            filterEqual('target_id', $track['target_id']);
            $count = $this->getCommentsCount();
            if ($count){
                $track['count'] = $count;
                $counts[] = $track;
            }
        }
        return $counts;
    }
//============================================================================//
//============================================================================//
    public function getGuestLastCommentTime($ip){
        
        $time = $this->
                    filterEqual('user_id', 0)->
                    filterEqual('author_url', $ip)->
                    orderBy('date_pub', 'desc')->
                    getFieldFiltered('comments', 'date_pub');
        
        return strtotime($time);
        
    }
    
}