Вход Регистрация
Файл: system/controllers/users/model.php
Строк: 1036
<?php

class modelUsers extends cmsModel {

//============================================================================//
//========================    ПОЛЬЗОВАТЕЛИ   =================================//
//============================================================================//

    
public function getUsersCount(){

        
$this->useCache('users.list');

        if (!
$this->delete_filter_disabled) { $this->filterAvailableOnly(); }

        return 
$this->getCount('{users}');

    }

//============================================================================//
//============================================================================//

    
public function filterGroup($group_id){
        return 
$this->join('{users}_groups_members''m'"m.user_id = i.id AND m.group_id = '{$group_id}'");
    }

    public function 
filterGroups($groups_list){
        
$groups_list implode(','$groups_list);
        return 
$this->join('{users}_groups_members''m'"m.user_id = i.id AND m.group_id IN ({$groups_list})");
    }

    public function 
filterGroupByName($group_name){
        
$this->join('{users}_groups_members''m'"m.user_id = i.id");
        return 
$this->join('{users}_groups''g'"g.id = m.group_id AND g.name = '{$group_name}'");
    }

    public function 
getUsers($actions false){

        
$this->useCache('users.list');

        if (!
$this->delete_filter_disabled) { $this->filterAvailableOnly(); }

        
$this->joinSessionsOnline('i');

        return 
$this->get('{users}', function($user) use ($actions){

            unset(
$user['pass_token'], $user['password'], $user['password_salt'], $user['password_hash']);

            
$user['slug']            = !empty($user['slug']) ? $user['slug'] : $user['id'];
            
$user['groups']          = cmsModel::yamlToArray($user['groups']);
            
$user['notify_options']  = cmsModel::yamlToArray($user['notify_options']);
            
$user['theme']           = cmsModel::yamlToArray($user['theme']);
            
$user['privacy_options'] = cmsModel::yamlToArray($user['privacy_options']);
            
$user['item_css_class']  = [];
            
$user['notice_title']    = [];
            
$user['ctype_name']      = 'users';

            if (
is_array($actions)){
                foreach(
$actions as $key => $action){

                    if (isset(
$action['handler'])){
                        
$is_active $action['handler']($user);
                    } else {
                        
$is_active true;
                    }

                    if (!
$is_active){ continue; }

                    if(!empty(
$action['item_css_class'])){ $user['item_css_class'][] = $action['item_css_class']; }
                    if(!empty(
$action['notice_title'])){ $user['notice_title'][] = $action['notice_title']; }

                    if(empty(
$action['href'])){ continue; }

                    foreach(
$user as $cell_id => $cell_value){

                        if (
is_array($cell_value) || is_object($cell_value)) { continue; }

                        
$action['href']  = str_replace('{'.$cell_id.'}'$cell_value$action['href']);
                        
$action['title'] = str_replace('{'.$cell_id.'}'$cell_value$action['title']);
                        
$action['class'] = (isset($action['class']) ? $action['class'] : '');

                    }
                    
$user['actions'][$key] = $action;
                }
            }

            return 
$user;

        });

    }

    public function 
getUsersIds(){

        
$this->selectOnly('i.id''id');

        return 
$this->get('{users}', function($user){
            return 
$user['id'];
        });

    }

    public function 
makeProfileFields($fields, &$profiles$user) {

        if(
$fields && $profiles){
            foreach (
$profiles as $key => $profile) {
                foreach(
$fields as $field){

                    if (
$field['is_system'] || !$field['is_in_list'] || !isset($profile[$field['name']])) { continue; }

                    
// проверяем что группа пользователя имеет доступ к чтению этого поля
                    
if ($field['groups_read'] && !$user->isInGroups($field['groups_read'])) {
                        
// если группа пользователя не имеет доступ к чтению этого поля,
                        // проверяем на доступ к нему для авторов
                        
if (empty($field['options']['author_access'])){ continue; }
                        if (!
in_array('is_read'$field['options']['author_access'])){ continue; }
                        if (
$profile['id'] != $user->id){ continue; }
                    }

                    if (!
$profile[$field['name']] && $profile[$field['name']] !== '0') { continue; }

                    if (!isset(
$field['options']['label_in_list'])) {
                        
$label_pos 'none';
                    } else {
                        
$label_pos $field['options']['label_in_list'];
                    }

                    
$field_html $field['handler']->setItem($profile)->parseTeaser($profile[$field['name']]);
                    if (!
$field_html) { continue; }

                    
$profiles[$key]['fields'][$field['name']] = array(
                        
'label_pos' => $label_pos,
                        
'type'      => $field['type'],
                        
'options'   => $field['options'],
                        
'name'      => $field['name'],
                        
'title'     => $field['title'],
                        
'html'      => $field_html
                    
);

                }
            }
        }

    }

//============================================================================//
//============================================================================//

    
public function getUser($id false$join_inviter false) {

        if(
$id){
            
$this->useCache('users.user.'.$id);
        }

        if(
$join_inviter){
            
$this->joinUser('inviter_id', [
                
'u.nickname'   => 'inviter_nickname',
                
'u.slug'       => 'inviter_slug',
                
'u.is_deleted' => 'inviter_is_deleted',
                
'u.avatar'     => 'inviter_avatar'
            
], 'left');
        }

        
$this->joinSessionsOnline('i');

        if (
$id){
            
$user $this->getItemById('{users}'$id);
        } else {
            
// На случай, если по ошибке запросят без предварительного фильтра
            
if (!$this->where){
                return 
false;
            }
            
$user $this->getItem('{users}');
        }

        if (!
$user) { return false; }

        
$user['slug']            = !empty($user['slug']) ? $user['slug'] : $user['id'];
        
$user['groups']          = cmsModel::yamlToArray($user['groups']);
        
$user['theme']           = cmsModel::yamlToArray($user['theme']);
        
$user['notify_options']  = cmsModel::yamlToArray($user['notify_options']);
        
$user['privacy_options'] = cmsModel::yamlToArray($user['privacy_options']);
        
$user['ctype_name']      = 'users';
        
$user['inviter'] = [];
        if (!empty(
$user['inviter_nickname'])) {
            
$user['inviter'] = [
                
'nickname'   => $user['inviter_nickname'],
                
'slug'       => $user['inviter_slug'],
                
'is_deleted' => $user['inviter_is_deleted'],
                
'avatar'     => $user['inviter_avatar']
            ];
        }

        return 
$user;
    }

    public function 
getUserBySlug($slug){

        if(!
$slug){ return false; }

        return 
$this->filterEqual('slug'$slug)->getUser(falsetrue);
    }

    public function 
getUserByEmail($email){

        if(!
$email){ return false; }

        return 
$this->filterEqual('email'$email)->getUser();
    }

    public function 
getUserByAuth($email$password) {

        if(!
$password){ return false; }

        
$this->filterIsNull('is_deleted');

        
$user $this->getUserByEmail($email);

        
// совместимость с ранее захэшированными паролями
        // ищем юзера по email, если есть,
        // проверяем по двум алгоритмам
        
if($user){

            
// старый механизм
            
if(empty($user['password_hash'])){

                
$password_hash md5(md5($password) . $user['password_salt']);

                if (
$password_hash !== $user['password']){
                    
$user false;
                } else {
                    
// ставим метку в массив, что старая авторизация
                    
$user['is_old_auth'] = true;
                }

            
// новый механизм
            
} else {

                if (!
password_verify($password$user['password_hash'])) {
                    
$user false;
                }

            }

        }

        return 
$user;

    }

    
/**
     * Псевдоним для связей
     * @param integer $id
     * @return array
     */
    
public function getContentItem($id){
        return 
$this->getUser($id);
    }

    public function 
getContentTypeTableName($name){
        return 
'{users}';
    }

//============================================================================//
//============================================================================//

    
public function setAuthToken($user_id$auth_token$type null$subj null){

        if(!
$type){ $type cmsRequest::getDeviceType(); }

        return 
$this->insert('{users}_auth_tokens', array(
            
'ip'          => sprintf('%u'ip2long(cmsUser::getIp())),
            
'access_type' => array(
                
'type' => $type,
                
'subj' => $subj
            
),
            
'auth_token'  => $auth_token,
            
'user_id'     => $user_id
        
));

    }

    public function 
deleteExpiredToken($user_id$auth_token_expiration_int){
        return 
$this->filterEqual('user_id'$user_id)->
                
filterDateOlder('date_auth'$auth_token_expiration_int'SECOND')->
                
deleteFiltered('{users}_auth_tokens');
    }

    public function 
deleteAuthToken($auth_token){
        return 
$this->filterEqual('auth_token'$auth_token)->deleteFiltered('{users}_auth_tokens');
    }

    public function 
deleteUserAuthTokens($user_id){
        return 
$this->filterEqual('user_id'$user_id)->deleteFiltered('{users}_auth_tokens');
    }

    public function 
getUserAuthTokens($user_id){
        return 
$this->filterEqual('user_id'$user_id)->get('{users}_auth_tokens', function ($item$model){
            
$item['ip'] = long2ip($item['ip']);
            
$item['date_log'] = $item['date_log'] ? $item['date_log'] : $item['date_auth'];
            
$item['access_type'] = cmsModel::yamlToArray($item['access_type']);
            return 
$item;
        });
    }

    public function 
getUserByPassToken($pass_token){

        return 
$this->filterEqual('pass_token'$pass_token)->getUser();

    }

    public function 
clearUserPassToken($id){

        return 
$this->updateUserPassToken($idnull);

    }

    public function 
updateUserPassToken($id$pass_token null){

        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$this->
                    
filterEqual('id'$id)->
                    
updateFiltered('{users}', array(
                        
'pass_token' => $pass_token,
                        
'date_token' => ''
                    
));

    }

//============================================================================//
//============================================================================//

    
public function addUser($user){

        if (
$user['password1'] !== $user['password2']){

            return [
                
'success' => false,
                
'errors'  => [
                    
'password1' => LANG_REG_PASS_NOT_EQUAL,
                    
'password2' => LANG_REG_PASS_NOT_EQUAL
                
]
            ];

        }

        
$user['password_hash'] = password_hash($user['password1'], PASSWORD_BCRYPT);

        if (
$user['password_hash'] === false) {

            return [
                
'success' => false,
                
'errors'  => [
                    
'password1' => LANG_ERROR,
                    
'password2' => LANG_ERROR
                
]
            ];

        }

        
$date_reg date('Y-m-d H:i:s');
        
$date_log $date_reg;

        
$groups = !empty($user['groups']) ? $user['groups'] : array(DEF_GROUP_ID);

        
$user array_merge($user, array(
            
'groups'         => $groups,
            
'date_reg'       => $date_reg,
            
'date_log'       => $date_log,
            
'time_zone'      => cmsConfig::get('time_zone'),
            
'notify_options' => $this->getUserNotifyTypes(true)
        ));

        
$id $this->insert('{users}'$user);

        if (
$id){
            
$this->saveUserGroupsMembership($id$groups);
        }

        
cmsCache::getInstance()->clean('users.list');

        return array(
            
'success' => $id !== false,
            
'errors'  => false,
            
'id'      => $id
        
);

    }

//============================================================================//
//============================================================================//

    
public function updateUser($id$user){

        
$success false;
        
$errors  false;

        if (!empty(
$user['email'])){

            
$email_exists_id $this->db->getField('{users}'"email = '{$user['email']}'"'id');

            if (
$email_exists_id && ($email_exists_id != $id)){
                
$errors['email'] = LANG_REG_EMAIL_EXISTS;
            }

        }

        unset(
$user['password']);

        if (!empty(
$user['password1']) && !$errors){

            if (
mb_strlen($user['password1']) < 6) {
                
$errors['password1'] = sprintf(ERR_VALIDATE_MIN_LENGTH6);
            }

            if (
$user['password1'] !== $user['password2']){
                
$errors['password2'] = LANG_REG_PASS_NOT_EQUAL;
            }

            
// старым ячейкам стави null (< 2.12.1)
            
$user['password']      = null;
            
$user['password_salt'] = null;

            
// хэш пароля пишем в новую ячейку (>=2.12.1)
            
$user['password_hash'] = password_hash($user['password1'], PASSWORD_BCRYPT);

            if (
$user['password_hash'] === false) {
                
$errors['password1'] = LANG_ERROR;
            }

        }

        if (!
$errors){

            if(isset(
$user['groups'])){

                
$user['groups'] = is_array($user['groups']) ? $user['groups'] : array(DEF_GROUP_ID);

                
$this->saveUserGroupsMembership($id$user['groups']);

            }

            
$success $this->update('{users}'$id$user);

        }

        
cmsCache::getInstance()->clean('users.list');
        
cmsCache::getInstance()->clean('users.user.'.$id);

        return array(
            
'success' => $success,
            
'errors'  => $errors,
            
'id'      => $id
        
);

    }

    public function 
updateUserTheme($id$theme){

        
$user cmsUser::getInstance();

        
$old_bg_img = isset($user->theme['bg_img']) ? $user->theme['bg_img'] : array();
        
$new_bg_img = isset($theme['bg_img']) ? $theme['bg_img'] : array();

        if ((
$old_bg_img != $new_bg_img) && isset($old_bg_img['original'])){

            
$config cmsConfig::getInstance();

            foreach(
$old_bg_img as $path){
                @
unlink($config->upload_path $path);
            }

        }

        
$res $this->update('{users}'$id, array('theme' => $theme), true);

        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$res;

    }

//============================================================================//
//============================================================================//
    /**
     * Удаляет пользователя
     * @param integer|array $user id пользователя или массив данных пользователя
     * @return boolean
     */
    
public function deleteUser($user){

        if(
is_numeric($user)){
            
$user $this->getUser($user);
            if(!
$user){ return false; }
        }

        
$inCache cmsCache::getInstance();

        
$content_model cmsCore::getModel('content');
        
$content_model->setTablePrefix('');
        
$fields $content_model->getContentFields('{users}'$user['id']);

        foreach(
$fields as $field){
            
$field['handler']->delete($user[$field['name']]);
        }

        
// уменьшаем счётчики друзей и подписчиков
        
$data $this->getFriendsIds($user['id']);

        if(!empty(
$data['friends'])){
            foreach (
$data['friends'] as $friend_id) {
                
$this->filterEqual('id'$friend_id)->decrement('{users}''friends_count');
                
$inCache->clean('users.user.'.$friend_id);
            }
        }
        if(!empty(
$data['subscribes'])){
            foreach (
$data['subscribes'] as $friend_id) {
                
$this->filterEqual('id'$friend_id)->decrement('{users}''subscribers_count');
                
$inCache->clean('users.user.'.$friend_id);
            }
        }

        
$this->deleteUserAuthTokens($user['id']);
        
$this->delete('{users}_friends'$user['id'], 'user_id');
        
$this->delete('{users}_friends'$user['id'], 'friend_id');
        
$this->delete('{users}_groups_members'$user['id'], 'user_id');
        
$this->delete('{users}_karma'$user['id'], 'user_id');
        
$this->delete('{users}_statuses'$user['id'], 'user_id');
        
$this->delete('{users}_personal_settings'$user['id'], 'user_id');
        
$this->delete('{users}'$user['id']);

        
$inCache->clean('users.list');
        
$inCache->clean('users.ups');
        
$inCache->clean('users.user.'.$user['id']);
        
$inCache->clean('users.status');

        
$this->filterEqual('child_ctype_id'null);
        
$this->filterEqual('child_item_id'$user['id']);
        
$this->filterEqual('target_controller''users');

        
$this->deleteFiltered('content_relations_bind');

        return 
true;

    }

    public function 
updateUserIp($id$ip false){

        
$this->update('{users}'$id, array(
            
'ip' => ($ip $ip cmsUser::getIp())
        ), 
true);

        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$this;

    }

    public function 
updateUserDateLog($id){

        
$this->update('{users}'$id, array(
            
'date_log' => null
        
), true);

        
cmsCache::getInstance()->clean('users.list');
        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$this;

    }

    public function 
setUserIsDeleted($id){

        
$this->update('{users}'$id, array(
            
'is_deleted' => 1
        
), true);

        
cmsCache::getInstance()->clean('users.list');
        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$this;

    }

    public function 
restoreUser($id){

        
$this->update('{users}'$id, array(
            
'is_deleted' => null
        
), true);

        
cmsCache::getInstance()->clean('users.list');
        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$this;

    }

    public function 
unlockUser($id){

        
$this->update('{users}'$id, array(
            
'is_locked'   => null,
            
'lock_until'  => null,
            
'lock_reason' => null
        
), true);

        
cmsCache::getInstance()->clean('users.list');
        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$this;

    }

//============================================================================//
//============================================================================//

    
public function saveUserGroupsMembership($id$groups){

        
$this->delete('{users}_groups_members'$id'user_id');

        foreach(
$groups as $group_id){
            
$this->insert('{users}_groups_members', array(
                
'user_id' => $id,
                
'group_id' => $group_id
            
));
        }

        
cmsCache::getInstance()->clean("users.list");

    }

//============================================================================//
//=========================    УВЕДОМЛЕНИЯ   =================================//
//============================================================================//

    
public function getUserNotifyTypes($only_default_values false) {

        
$notify_types cmsEventsManager::hookAll('user_notify_types');

        
$notify_types cmsEventsManager::hook('update_user_notify_types'$notify_types);

        
$default_options = array('''email''pm''both');

        
$types = array();

        foreach(
$notify_types as $list){
            foreach(
$list as $name => $type){

                
$options = array();

                if(!isset(
$type['options'])) { $type['options'] = $default_options; }

                foreach(
$type['options'] as $option){
                    if (!
$option){
                        
$options[''] = LANG_USERS_NOTIFY_VIA_NONE;
                    } else {
                        
$options[$option] = constant('LANG_USERS_NOTIFY_VIA_'.strtoupper($option));
                    }
                }

                if(!
$only_default_values){
                    
$types[$name] = array(
                        
'title'   => $type['title'],
                        
'default' => (isset($type['default']) ? $type['default'] : 'email'),
                        
'items'   => $options
                    
);
                } else {
                    
$types[$name] = (isset($type['default']) ? $type['default'] : 'email');
                }

            }
        }

        return 
$types;

    }

    public function 
getUserNotifyOptions($id){

        return 
$this->getItemById('{users}'$id, function($item$model){
            return 
cmsModel::yamlToArray($item['notify_options']);
        });

    }

    public function 
updateUserNotifyOptions($id$options){

        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$this->update('{users}'$id, array('notify_options' => $options), true);

    }

    public function 
getNotifiedUsers($notice_type false$id_list = array(), $options_only = array(), $default 'email'){

        
$list = array();

        
$this->selectList(array(
            
'i.id'             => 'id',
            
'i.email'          => 'email',
            
'i.slug'           => 'slug',
            
'i.nickname'       => 'nickname',
            
'i.notify_options' => 'notify_options'
        
), true);

        if(
$id_list){
            
$this->filterIn('id'$id_list);
        }

        
$this->filterIsNull('is_locked');
        
$this->filterIsNull('is_deleted');

        
$users $this->get('{users}', function($user$model){

            
$user['slug']           = !empty($user['slug']) ? $user['slug'] : $user['id'];
            
$user['notify_options'] = cmsModel::yamlToArray($user['notify_options']);

            return 
$user;

        }, 
false);

        if (!
$users) { return false; }

        if (
$options_only){
            foreach(
$users as $user){

                if (!isset(
$user['notify_options'][$notice_type])){
                    
$user['notify_options'][$notice_type] = $default;
                }

                if (empty(
$user['notify_options'][$notice_type])){
                    continue;
                }

                if (!
in_array($user['notify_options'][$notice_type], $options_only)){
                    continue;
                }

                
$list[] = $user;

            }
        } else {
            
$list $users;
        }

        return 
$list $list false;

    }


//============================================================================//
//=========================    ПРИВАТНОСТЬ   =================================//
//============================================================================//

    
public function getUserPrivacyOptions($id){

        return 
$this->getItemById('{users}'$id, function($item$model){
            return 
cmsModel::yamlToArray($item['privacy_options']);
        });

    }

    public function 
updateUserPrivacyOptions($id$options){

        
cmsCache::getInstance()->clean('users.user.'.$id);

        return 
$this->update('{users}'$id, array('privacy_options' => $options), true);

    }

//============================================================================//
//==============================    ГРУППЫ   =================================//
//============================================================================//

    
public function getGroups($is_guests false){

        if (!
$is_guests) { $this->filterNotEqual('id'GUEST_GROUP_ID); }

        
$this->orderBy('ordering''asc');

        return 
$this->get('{users}_groups');

    }

    public function 
getPublicGroups(){
        return 
$this->filterEqual('is_public'1)->getGroups();
    }

    public function 
getFilteredGroups(){
        return 
$this->filterEqual('is_filter'1)->getGroups();
    }

    public function 
getGroup($id=false){

        return 
$this->getItemById('{users}_groups'$id);

    }

    public function 
updateGroup($id$group){

        return 
$this->update('{users}_groups'$id$group);

    }

    public function 
addGroup($group){

        return 
$this->insert('{users}_groups'$group);

    }

    public function 
deleteGroup($id) {

        
$this->join('{users}_groups_members''m'"m.user_id = i.id AND m.group_id = '{$id}'");

        
$members $this->disableDeleteFilter()->getUsers();

        
$first_group $this->orderBy('id''asc')->filterNotEqual('id'GUEST_GROUP_ID)->getItem('{users}_groups');
        if (!
$first_group) { return false; }

        if (
$members) {

            foreach (
$members as $user) {

                
$groups $user['groups'];

                
// удаляем ID из массива групп пользователя
                // и переиндексируем ключи массива
                
$groups array_values(array_diff($groups, array($id)));

                if (!
$groups) {
                    
$groups = array($first_group['id']);
                }

                
$this->update('{users}'$user['id'], array(
                    
'groups' => $groups
                
), true);

                
cmsCache::getInstance()->clean('users.user.' $id);
            }

            
cmsCache::getInstance()->clean('users.list');

            
$this->delete('{users}_groups_members'$id'group_id');
        }

        
$this->filterEqual('group_id'$id)->deleteFiltered('perms_users');

        return 
$this->delete('{users}_groups'$id);
    }

//============================================================================//
//==============================    ДРУЖБА   =================================//
//============================================================================//

    
public function filterFriends($user_id$is_mutual 1){

        
$this->joinInner('{users}_friends''f''f.friend_id = i.id');

        
$this->filterEqual('f.user_id', (int)$user_id);

        if(
$is_mutual !== null){
            
$this->filterEqual('f.is_mutual'$is_mutual);
        } else {
            
// подписчики (null) и друзья (1)
            
$this->filterStart();
                
$this->filterEqual('f.is_mutual'1);
                    
$this->filterOr();
                
$this->filterIsNull('f.is_mutual');
            
$this->filterEnd();
        }

        return 
$this;

    }

    public function 
getFriends($user_id){

        
$this->useCache('users.friends');

        
$this->select('u.id''id');
        
$this->select('u.*');

        
$this->joinInner('{users}''u''u.id = i.friend_id');
        
$this->joinSessionsOnline();

        
$this->filterEqual('user_id'$user_id);
        
$this->filterEqual('is_mutual'1);

        if (!
$this->order_by){
            
$this->orderBy('u.date_log''desc');
        }

        return 
$this->get('{users}_friends', function($user){

            
$user['groups']          = cmsModel::yamlToArray($user['groups']);
            
$user['notify_options']  = cmsModel::yamlToArray($user['notify_options']);
            
$user['privacy_options'] = cmsModel::yamlToArray($user['privacy_options']);

            return 
$user;

        });

    }


    public function 
getFriendsCount($user_id){

        
$this->useCache('users.friends');

        
$this->filterEqual('user_id'$user_id);
        
$this->filterEqual('is_mutual'1);

        
$count $this->getCount('{users}_friends');

        
$this->resetFilters();

        return 
$count;
    }

    public function 
getSubscribersCount($user_id){

        
$this->filterEqual('friend_id'$user_id);
        
$this->filterIsNull('is_mutual');

        
$count $this->getCount('{users}_friends');

        
$this->resetFilters();

        return 
$count;

    }

    public function 
cacheSubscribersCount($user_id){

        
cmsCache::getInstance()->clean('users.user.'.$user_id);

        return 
$this->update('{users}'$user_id, array('subscribers_count' => $this->getSubscribersCount($user_id)), true);

    }

    public function 
getFriendsIds($user_id){

        
$this->useCache('users.friends');

        
$this->filterEqual('user_id'$user_id);

        
$data = array(
            
'friends' => array(),
            
'subscribes' => array()
        );

        
$items $this->get('{users}_friends'falsefalse);

        if(
$items){
            foreach (
$items as $item) {
                if(
$item['is_mutual'] !== null){
                    if(
$item['is_mutual']){
                        
$data['friends'][] = $item['friend_id'];
                    }
                } else {
                    
$data['subscribes'][] = $item['friend_id'];
                }
            }
        }

        return 
$data;

    }

    public function 
getFriendshipRequested($user_id$friend_id$field 'is_mutual'){

        if(!
$user_id){ return false; }

        
$this->useCache('users.friends');

        
$this->filterEqual('user_id'$user_id);
        
$this->filterEqual('friend_id'$friend_id);
        
// учитываем и подписки и запросы дружбы
        
$this->filterStart();
            
$this->filterEqual('is_mutual'0);
                
$this->filterOr();
            
$this->filterIsNull('is_mutual');
        
$this->filterEnd();

        return 
$this->getFieldFiltered('{users}_friends'$field);

    }

    public function 
isFriendshipRequested($user_id$friend_id){
        return 
$this->getFriendshipRequested($user_id$friend_id'id');
    }

    public function 
isFriendshipExists($user_id$friend_id){

        
$this->useCache('users.friends');

        
$this->filterStart();
        
$this->filterEqual('user_id'$user_id);
        
$this->filterEqual('friend_id'$friend_id);
        
$this->filterEnd();

        
$this->filterOr();

        
$this->filterStart();
        
$this->filterEqual('user_id'$friend_id);
        
$this->filterEqual('friend_id'$user_id);
        
$this->filterEnd();

        return (bool)
$this->getFieldFiltered('{users}_friends''id');

    }


    public function 
isFriendshipMutual($user_id$friend_id){

        
$this->useCache('users.friends');

        
$this->filterStart();
            
$this->filterStart();
            
$this->filterEqual('user_id'$user_id);
            
$this->filterEqual('friend_id'$friend_id);
            
$this->filterEnd();

            
$this->filterOr();

            
$this->filterStart();
            
$this->filterEqual('user_id'$friend_id);
            
$this->filterEqual('friend_id'$user_id);
            
$this->filterEnd();
        
$this->filterEnd();

        
$this->filterAnd();

        
$this->filterEqual('is_mutual'1);

        return (bool)
$this->getFieldFiltered('{users}_friends''id');

    }

    public function 
subscribeUser($user_id$friend_id){

        
cmsCache::getInstance()->clean('users.friends');

        
$this->insert('{users}_friends', array(
            
'user_id'   => $user_id,
            
'friend_id' => $friend_id
        
));

        return 
$this->cacheSubscribersCount($friend_id);

    }

    public function 
unsubscribeUser($user_id$friend_id){

        
$this->filterEqual('user_id'$user_id);
        
$this->filterEqual('friend_id'$friend_id);
        
$this->deleteFiltered('{users}_friends');

        
cmsCache::getInstance()->clean('users.friends');

        return 
$this->cacheSubscribersCount($friend_id);

    }

    public function 
addFriendship($user_id$friend_id){

        
$is_mutual false;

        if (
$this->isFriendshipRequested($friend_id$user_id)){

            
$this->filterEqual('user_id'$friend_id);
            
$this->filterEqual('friend_id'$user_id);

            
$this->updateFiltered('{users}_friends', array(
                
'is_mutual' => true
            
));

            
$this->cacheSubscribersCount($user_id);

            
$is_mutual true;

        }

        if (
$is_mutual){

            
$this->filterEqual('id'$user_id)->increment('{users}''friends_count');
            
$this->filterEqual('id'$friend_id)->increment('{users}''friends_count');

            
$friend $this->getUser($friend_id);

            list(
$user_id$friend) = cmsEventsManager::hook('users_add_friendship_mutual', [$user_id$friend]);

        }

        if (
$this->isFriendshipRequested($user_id$friend_id)){

            
$this->filterEqual('user_id'$user_id);
            
$this->filterEqual('friend_id'$friend_id);

            
$this->updateFiltered('{users}_friends', array(
                
'is_mutual' => true
            
));

            
$this->cacheSubscribersCount($friend_id);

        } else {

            
$this->insert('{users}_friends', array(
                
'user_id'   => $user_id,
                
'friend_id' => $friend_id,
                
'is_mutual' => $is_mutual
            
));

        }

        list(
$user_id$friend_id$is_mutual) = cmsEventsManager::hook('users_add_friendship', [$user_id$friend_id$is_mutual]);

        
cmsCache::getInstance()->clean('users.friends');

        return 
$is_mutual;
    }

    public function 
deleteFriendship($user_id$friend_id){

        
$is_mutual $this->isFriendshipMutual($user_id$friend_id);

        list(
$user_id$friend_id$is_mutual) = cmsEventsManager::hook('users_before_delete_friendship', [$user_id$friend_id$is_mutual]);

        if (
$is_mutual){
            
$this->filterEqual('id'$user_id)->decrement('{users}''friends_count');
            
$this->filterEqual('id'$friend_id)->decrement('{users}''friends_count');
        }

        
$this->filterEqual('user_id'$user_id);
        
$this->filterEqual('friend_id'$friend_id);
        
$success $this->deleteFiltered('{users}_friends');

        if(
$success){
            
$this->filterEqual('user_id'$friend_id);
            
$this->filterEqual('friend_id'$user_id);
            
$success $this->deleteFiltered('{users}_friends');
        }

        if(
$success){
            list(
$user_id$friend_id$is_mutual) = cmsEventsManager::hook('users_after_delete_friendship', [$user_id$friend_id$is_mutual]);
        }

        
cmsCache::getInstance()->clean('users.friends');

        return 
$success;
    }

    public function 
keepInSubscribers($user_id$friend_id){

        if (
$this->isFriendshipMutual($user_id$friend_id)){
            
$this->filterEqual('id'$user_id)->decrement('{users}''friends_count');
            
$this->filterEqual('id'$friend_id)->decrement('{users}''friends_count');
        }

        
$this->filterEqual('user_id'$user_id);
        
$this->filterEqual('friend_id'$friend_id);
        
$this->deleteFiltered('{users}_friends');

        
$this->filterEqual('user_id'$friend_id);
        
$this->filterEqual('friend_id'$user_id);
        
$this->updateFiltered('{users}_friends', array(
            
'is_mutual' => null
        
));

        
cmsCache::getInstance()->clean('users.friends');

        return 
$this->cacheSubscribersCount($user_id);

    }

//============================================================================//
//=========================    ВКЛАДКИ ПРОФИЛЕЙ   ============================//
//============================================================================//

    
public function getUsersProfilesTabs($only_active=false$by_field='id'){

        
$this->useCache('users.tabs');

        if (
$only_active){ $this->filterEqual('is_active'1); }

        return 
$this->orderBy('ordering')->get('{users}_tabs', function($item$model){
            
$item['groups_view'] = cmsModel::yamlToArray($item['groups_view']);
            
$item['groups_hide'] = cmsModel::yamlToArray($item['groups_hide']);
            return 
$item;
        }, 
$by_field);

    }

    public function 
getUsersProfilesTab($tab_id){

        
$this->useCache('users.tabs');

        return 
$this->getItemById('{users}_tabs'$tab_id);

    }

    public function 
updateUsersProfilesTab($id$tab){

        
cmsCache::getInstance()->clean('users.tabs');

        return 
$this->update('{users}_tabs'$id$tab);

    }

    public function 
reorderUsersProfilesTabs($fields_ids_list){

        
$this->reorderByList('{users}_tabs'$fields_ids_list);

        
cmsCache::getInstance()->clean('users.tabs');

        return 
true;

    }


//============================================================================//
//==============================    СТАТУСЫ   ================================//
//============================================================================//

    
public function getUserStatus($id){

        if (!
$id) { return false; }

        
$this->useCache('users.status');

        return 
$this->getItemById('{users}_statuses'$id);

    }

    public function 
addUserStatus($status){

        
$id $this->insert('{users}_statuses'$status);

        
$this->update('{users}'$status['user_id'], array(
            
'status_text' => $status['content'],
            
'status_id' => $id
        
), true);

        
cmsCache::getInstance()->clean('users.status');
        
cmsCache::getInstance()->clean('users.list');
        
cmsCache::getInstance()->clean('users.user.'.$status['user_id']);

        return 
$id;

    }

    public function 
clearUserStatus($user_id){

        
cmsCache::getInstance()->clean('users.status');
        
cmsCache::getInstance()->clean('users.list');
        
cmsCache::getInstance()->clean('users.user.'.$user_id);

        
$this->filterEqual('user_id'$user_id)->deleteFiltered('{users}_statuses');

        return 
$this->update('{users}'$user_id, array(
            
'status_text' => null,
            
'status_id' => null
        
), true);

    }

    public function 
increaseUserStatusRepliesCount($status_id$is_increment true){

        
cmsCache::getInstance()->clean('users.status');

        
$this->filterEqual('id'$status_id);

        if(
$is_increment){
            
$this->increment('{users}_statuses''replies_count');
        } else {
            
$this->decrement('{users}_statuses''replies_count');
        }

    }

//============================================================================//
//============================    РЕПУТАЦИЯ   ================================//
//============================================================================//

    
public function isUserCanVoteKarma($user_id$profile_id$voting_days=1){

        
$this->filterEqual('user_id'$user_id);
        
$this->filterEqual('profile_id'$profile_id);
        
$this->filterDateYounger('date_pub'$voting_days);

        
$this->useCache('users.karma');

        
$votes_count $this->getCount('{users}_karma');

        
$this->resetFilters();

        return 
$votes_count false true;

    }

    public function 
addKarmaVote($vote){

        
cmsCache::getInstance()->clean('users.karma');

        
$result $this->insert('{users}_karma'$vote);

        if (!
$result) { return false; }

        
$this->
            
filterEqual('id'$vote['profile_id'])->
            
increment('{users}''karma'$vote['points']);

        return 
$result;

    }

    public function 
getKarmaLogCount($profile_id){

        
$this->useCache('users.karma');

        
$count $this->filterEqual('profile_id'$profile_id)->getCount('{users}_karma');

        
$this->resetFilters();

        return 
$count;

    }

    public function 
getKarmaLog($profile_id){

        
$this->useCache('users.karma');

        
$this->joinUser();

        
$this->orderBy('id''desc');

        
$this->filterEqual('profile_id'$profile_id);

        
$this->joinSessionsOnline();

        return 
$this->get('{users}_karma', function($item$model){

            
$item['user'] = array(
                
'id'       => $item['user_id'],
                
'nickname' => $item['user_nickname'],
                
'slug'     => $item['user_slug'],
                
'avatar'   => $item['user_avatar']
            );

            return 
$item;
        });
    }

//============================================================================//
//============================================================================//

    
public function updateUserRating($user_id$score){

        
$this->filterEqual('id'$user_id);

        if (
$score 0){
            
$this->increment('{users}''rating'abs($score));
        }
        if (
$score 0){
            
$this->decrement('{users}''rating'abs($score));
        }

        
cmsCache::getInstance()->clean('users.list');
        
cmsCache::getInstance()->clean('users.user.'.$user_id);

    }

//============================================================================//
//============================================================================//

    
public function getMigrationRulesCount(){

        return 
$this->getCount('{users}_groups_migration');

    }

    public function 
getMigrationRules(){

        return 
$this->get('{users}_groups_migration');

    }

    public function 
getMigrationRule($id){

        return 
$this->getItemById('{users}_groups_migration'$id);

    }

    public function 
addMigrationRule($rule){

        return 
$this->insert('{users}_groups_migration'$rule);

    }

    public function 
updateMigrationRule($id$rule){

        return 
$this->update('{users}_groups_migration'$id$rule);

    }

    public function 
deleteMigrationRule($id){

        return 
$this->delete('{users}_groups_migration'$id);

    }

//============================================================================//
//============================================================================//

    
public function setUPS($key$data$user_id){
        if(
is_array($data)){
            
$data self::arrayToYaml($data);
        }
        
$insert = array(
            
'user_id' => $user_id,
            
'skey' => $key,
            
'settings' => $data
        
);
        
$update = array(
            
'settings' => $data
        
);

        
$ret $this->insertOrUpdate('{users}_personal_settings'$insert$update);
        
cmsCache::getInstance()->clean('users.ups');

        return 
$ret;
    }

    public function 
getSetUPS($key){

        
$this->useCache('users.ups');

        
$this->selectList(array(
            
'i.settings' => 'settings',
            
'i.user_id' => 'user_id'
        
), true);

        
$this->filterEqual('skey'$key);

        return 
$this->get('{users}_personal_settings', function($item$model){
            if(
strpos($item['settings'], '---') === 0){
                
$item['settings'] = cmsModel::yamlToArray($item['settings']);
            }
            return 
$item['settings'];
        }, 
'user_id');

    }

    public function 
getUPS($key$user_id){
        
$this->useCache('users.ups');

        
$this->filterEqual('user_id'$user_id)->filterEqual('skey'$key);

        return 
$this->getItem('{users}_personal_settings', function($item$model){
            if(
strpos($item['settings'], '---') === 0){
                
$item['settings'] = cmsModel::yamlToArray($item['settings']);
            }
            return 
$item['settings'];
        });
    }

    public function 
deleteUPS($key$user_id=null){
        if(
$user_id && $key){
            
$this->filterEqual('user_id'$user_id)->filterEqual('skey'$key);
        }elseif(
$user_id){
            
$this->filterEqual('user_id'$user_id);
        }elseif(
$key){
            
$this->filterEqual('skey'$key);
        }else{
            return 
false;
        }
        
$ret $this->deleteFiltered('{users}_personal_settings');
        
cmsCache::getInstance()->clean('users.ups');

        return 
$ret;
    }

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