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

class groups extends cmsFrontend {

    const 
JOIN_POLICY_FREE 0;
    const 
JOIN_POLICY_PUBLIC 1;
    const 
JOIN_POLICY_PRIVATE 2;

    const 
EDIT_POLICY_OWNER 0;
    const 
EDIT_POLICY_STAFF 1;

    const 
WALL_POLICY_MEMBERS 0;
    const 
WALL_POLICY_STAFF 1;
    const 
WALL_POLICY_OWNER 2;

    const 
CTYPE_POLICY_MEMBERS 0;
    const 
CTYPE_POLICY_STAFF 1;
    const 
CTYPE_POLICY_OWNER 2;
    const 
CTYPE_POLICY_GROUPS 3;
    const 
CTYPE_POLICY_ROLES 4;

    const 
ROLE_NONE 0;
    const 
ROLE_MEMBER 1;
    const 
ROLE_STAFF 2;

    protected 
$useOptions true;
    public 
$useSeoOptions true;

    private static 
$groups_fields null;

    public 
$max_items_count 0;

    public function 
routeAction($action_name){

        if (
is_numeric($action_name)) {

            
$group $this->model->getGroup($action_name);
            if (!
$group) { cmsCore::error404(); }

            if(
$group['slug'] != $action_name){
                return 
$this->redirect(href_to('groups'$group['slug'], $this->current_params), 301);
            }

        } else {

            if(
$action_name === 'index' && $this->current_params){
                return 
$this->redirect(href_to('groups'$this->current_params[0]), 301);
            }

            if (
$this->isActionExists($action_name)){
                return 
$action_name;
            }

            
$group $this->model->getGroupBySlug($action_name);
            if (!
$group) {

                
array_unshift($this->current_params$action_name);

                return 
'index';
            }

        }

        
$this->lock_explicit_call false;

        
$group['access'] = $this->getGroupAccess($group);

        if(empty(
$this->current_params[0]) || $this->current_params[0] != 'edit'){

            
$this->loadGroupsFields();

            
$group['fields'] = $this->getGroupsFields();

            
$group['content_counts'] = $this->getGroupContentCounts($group);

            
$group['content_count'] = 0;
            
$group['first_ctype_name'] = false;

            if (
$group['content_counts']){
                foreach(
$group['content_counts'] as $ctype_name => $count){
                    if (!
$count['is_in_list'] || !$count['count']) { continue; }
                    if (!
$group['first_ctype_name']) { $group['first_ctype_name'] = $ctype_name; }
                    
$group['content_count'] += $count['count'];
                }
            }

        }

        
// кешируем запись для получения ее в виджетах
        
cmsModel::cacheResult('current_group'$group);
        
cmsModel::cacheResult('group_model'$this->model);

        
$this->current_params $this->cms_core->uri_params;
        
$this->current_params[0] = $group;

        if (
$group['is_closed'] && !$group['access']['is_member'] && !$this->cms_user->is_admin &&
                (empty(
$this->cms_core->uri_params[0]) || !in_array($this->cms_core->uri_params[0], array('join''enter')))){
            return 
'group_closed';
        }

        if (!
$this->cms_core->uri_params){ return 'group'; }

        return 
'group_' $this->cms_core->uri_params[0];

    }

    public function 
getGroupAccess($group) {

        
$membership $this->model->getMembership($group['id'], $this->cms_user->id);

        
$is_member = ($membership !== false);
        
$is_owner = ($this->cms_user->id == $group['owner_id']);

        
$access = array(
            
'is_moderator'  => $this->cms_user->is_admin,
            
'is_can_edit'   => false,
            
'is_can_join'   => false,
            
'is_can_delete' => false,
            
'is_owner'      => $is_owner,
            
'is_member'     => $is_member,
            
'member_role'   => ($is_member $membership['role'] : groups::ROLE_NONE),
            
'invite'        => $this->model->getInvite($group['id'], $this->cms_user->id),
            
'is_can_invite' => (($is_member && ($group['join_policy'] != groups::JOIN_POLICY_PRIVATE)) || $is_owner),
            
'is_can_invite_users' => false,
            
'wall' => array(
                
'add'    => false,
                
'reply'  => false,
                
'delete' => false
            
)
        );

        if (
$this->cms_user->is_admin || (
                
$access['is_member'] && (
                    (
$group['wall_policy'] == groups::WALL_POLICY_MEMBERS) ||
                    (
$group['wall_policy'] == groups::WALL_POLICY_STAFF && $access['member_role']==groups::ROLE_STAFF) ||
                    
$access['is_owner']
                )
            )) {
            
$access['wall']['add'] = (bool)$group['is_approved'];
        }
        if (
$this->cms_user->is_admin || (
                
$access['is_member'] && (
                    (
$group['wall_reply_policy'] == groups::WALL_POLICY_MEMBERS) ||
                    (
$group['wall_reply_policy'] == groups::WALL_POLICY_STAFF && $access['member_role']==groups::ROLE_STAFF) ||
                    
$access['is_owner']
                )
            )) {
            
$access['wall']['reply'] = true;
        }
        if (
$this->cms_user->is_admin || $access['is_owner']) {
            
$access['wall']['delete'] = true;
        }

        if (
$access['member_role'] == groups::ROLE_STAFF) {
            
$access['is_can_invite'] = (bool)$group['is_approved'];
        }

        if (
cmsUser::isAllowed('groups''invite_users') && $access['is_can_invite']) {
            
$access['is_can_invite_users'] = (bool)$group['is_approved'];
        }
        if (
cmsUser::isAllowed('groups''edit''all')) {

            
$access['is_can_edit'] = true;

        } else if (
cmsUser::isAllowed('groups''edit''own')) {
            if ((
$access['member_role'] == groups::ROLE_STAFF && $group['edit_policy'] == groups::EDIT_POLICY_STAFF) ||
                    
$access['is_owner'] || cmsUser::isAllowed('groups''edit''all')){

                
$access['is_can_edit'] = (bool)$group['is_approved'];

            }
        }

        if (
$this->cms_user->id && !$access['is_member'] && ($group['join_policy'] == groups::JOIN_POLICY_FREE || $access['invite'])){
            
$access['is_can_join'] = (bool)$group['is_approved'];
        }

        if (
cmsUser::isAllowed('groups''delete''all') || (cmsUser::isAllowed('groups''delete''own') && $access['is_owner'])){
            
$access['is_can_delete'] = $group['is_approved'] ? (bool)$group['is_approved'] : cmsUser::isAllowed('groups''delete''all');
        }

        return 
cmsEventsManager::hook('group_item_access'$access);

    }

    public function 
getGroupsFields() {
        return 
self::$groups_fields;
    }

    public function 
loadGroupsFields() {
        if(
self::$groups_fields === null){
            
self::$groups_fields cmsCore::getModel('content')->setTablePrefix('')->orderBy('ordering')->getContentFields('groups');
        }
        return 
$this;
    }

    public function 
getGroupForm($group false$action 'add'){

        if(
$group === false){

            
$group_id false;

        } else {

            
$group_id $group['id'];

            
$group['content_counts'] = $this->getGroupContentCounts($group);

        }

        
$content_model cmsCore::getModel('content');
        
$content_model->setTablePrefix('');
        
$content_model->orderBy('ordering');

        
$fields $content_model->getContentFields('groups'$group_id);

        if(
self::$groups_fields === null){
            
self::$groups_fields $fields;
        }

        
$form = new cmsForm();

        
// Разбиваем поля по группам
        
$fieldsets cmsForm::mapFieldsToFieldsets($fields, function($field$user) use ($group$action){

            if(
$action === 'add'){
                
// проверяем что группа пользователя имеет доступ к созданию этого поля
                // на автора не надо проверять, ибо это и есть автор
                
if ($field['groups_add'] && !$user->isInGroups($field['groups_add'])) {
                    return 
false;
                }
            } else {
                
// проверяем что группа пользователя имеет доступ к редактированию этого поля
                
if ($field['groups_edit'] && !$user->isInGroups($field['groups_edit'])) {
                    
// если группа пользователя не имеет доступ к редактированию этого поля,
                    // проверяем на доступ к нему для авторов
                    
if (!empty($group['owner_id']) && !empty($field['options']['author_access'])){
                        if (!
in_array('is_edit'$field['options']['author_access'])){ return false; }
                        if (
$group['owner_id'] == $user->id){ return true; }
                    }
                    return 
false;
                }
            }

            return 
true;

        });

        
// Добавляем поля в форму
        
foreach($fieldsets as $fieldset){

            
$fid $fieldset['title'] ? md5($fieldset['title']) : null;

            
$fieldset_id $form->addFieldset($fieldset['title'], $fid);

            foreach(
$fieldset['fields'] as $field){

                
$form->addField($fieldset_id$field['handler']);

            }

        }

        
// настройки группы
        
$fieldset_id $form->addFieldset(LANG_OPTIONS'group_options');

        
$form->addField($fieldset_id, new fieldList('join_policy', array(
            
'title' => LANG_GROUPS_GROUP_JOIN_POLICY,
            
'items' => array(
                
groups::JOIN_POLICY_FREE => LANG_GROUPS_GROUP_PUBLIC,
                
groups::JOIN_POLICY_PUBLIC => LANG_GROUPS_GROUP_PRIVATE_SOFT,
                
groups::JOIN_POLICY_PRIVATE => LANG_GROUPS_GROUP_PRIVATE_HARD,
            )
        )));
        if(!empty(
$group['roles'])){
            
$form->addField($fieldset_id, new fieldList('join_roles', array(
                
'title'              => LANG_GROUPS_JOIN_ROLES,
                
'items'              => (array(null => '') + $group['roles']),
                
'is_chosen_multiple' => true
            
)));
        }
        
$form->addField($fieldset_id, new fieldList('is_closed', array(
            
'title' => LANG_GROUPS_GROUP_IS_CLOSED,
            
'items' => array(
                
=> LANG_GROUPS_GROUP_OPENED,
                
=> LANG_GROUPS_GROUP_CLOSED,
            )
        )));
        
$form->addField($fieldset_id, new fieldList('edit_policy', array(
            
'title' => LANG_GROUPS_GROUP_EDIT_POLICY,
            
'items' => array(
                
groups::EDIT_POLICY_OWNER => LANG_GROUPS_GROUP_EDIT_OWNER,
                
groups::EDIT_POLICY_STAFF => LANG_GROUPS_GROUP_EDIT_STAFF,
            )
        )));
        if (
$this->options['is_wall'] && cmsController::enabled('wall')){
            
$form->addField($fieldset_id, new fieldList('wall_policy', array(
                
'title' => LANG_GROUPS_GROUP_WALL_POLICY,
                
'items' => array(
                    
groups::WALL_POLICY_MEMBERS => LANG_GROUPS_GROUP_WALL_MEMBERS,
                    
groups::WALL_POLICY_STAFF => LANG_GROUPS_GROUP_WALL_STAFF,
                    
groups::WALL_POLICY_OWNER => LANG_GROUPS_GROUP_WALL_OWNER,
                )
            )));
            
$form->addField($fieldset_id, new fieldList('wall_reply_policy', array(
                
'title' => LANG_GROUPS_GROUP_WALL_REPLY_POLICY,
                
'items' => array(
                    
groups::WALL_POLICY_MEMBERS => LANG_GROUPS_GROUP_WALL_MEMBERS,
                    
groups::WALL_POLICY_STAFF => LANG_GROUPS_GROUP_WALL_STAFF,
                    
groups::WALL_POLICY_OWNER => LANG_GROUPS_GROUP_WALL_OWNER,
                )
            )));
        }

        if(
cmsUser::isAllowed('groups''content_access') && !empty($group['content_counts'])){
            
$roles = !empty($group['roles']) ? $group['roles'] : array();
            foreach(
$group['content_counts'] as $ctype_name => $count){
                
$form->addField($fieldset_id, new fieldList('content_policy:'.$ctype_name, array(
                    
'title' => sprintf(LANG_GROUPS_GROUP_CTYPE_POLICY$count['title_add']),
                    
'items' => array(
                        
groups::CTYPE_POLICY_MEMBERS => LANG_GROUPS_GROUP_CTYPE_MEMBERS,
                        
groups::CTYPE_POLICY_STAFF   => LANG_GROUPS_GROUP_WALL_STAFF,
                        
groups::CTYPE_POLICY_OWNER   => LANG_GROUPS_GROUP_WALL_OWNER,
                        
groups::CTYPE_POLICY_GROUPS  => LANG_GROUPS_GROUP_CTYPE_GROUPS,
                        
groups::CTYPE_POLICY_ROLES   => LANG_GROUPS_GROUP_CTYPE_ROLES
                    
)
                )));
                
$form->addField($fieldset_id, new fieldList('content_groups:'.$ctype_name, array(
                    
'is_chosen_multiple' => true,
                    
'is_visible' => false,
                    
'generator' => function ($item){
                        
$users_model cmsCore::getModel('users');
                        
$groups $users_model->getGroups();
                        
$items = array(=> '');
                        foreach(
$groups as $group){
                            
$items[$group['id']] = $group['title'];
                        }
                        return 
$items;
                    }
                )));
                
$form->addField($fieldset_id, new fieldList('content_roles:'.$ctype_name, array(
                    
'is_chosen_multiple' => true,
                    
'is_visible' => false,
                    
'generator' => function ($group) use ($roles){
                        
$items = array(=> '');
                        if(!empty(
$roles)){
                            foreach(
$roles as $role_id => $role){
                                
$items[$role_id] = $role;
                            }
                        }
                        return 
$items;
                    }
                )));
            }
        }

        
// ручной ввод SLUG, добавляем поле для этого
        
$slug_field_rules = array( array('slug_segment') );

        if (!
$group_id){ $slug_field_rules[] = array('unique''groups''slug'); }
        if (
$group_id){ $slug_field_rules[] = array('unique_exclude''groups''slug'$group_id); }
        
// Чтобы не накладывались наборы
        
$slug_field_rules[] = array('unique_ctype_dataset''groups'false);

        
$form->addField($fieldset_id, new fieldString('slug', array(
            
'title'  => LANG_SLUG,
            
'prefix' => href_to('groups').'/',
            
'options'=>array(
                
'min_length'=> 2,
                
'max_length'=> 100
            
),
            
'rules' => $slug_field_rules
        
)));

        return 
cmsEventsManager::hook('group_item_form'$form);

    }

    public function 
renderGroupsList($page_url$dataset_name false){

        
$page $this->request->get('page'1);
        
$perpage = (empty($this->options['limit']) ? 10 $this->options['limit']);

        
$fields $this->loadGroupsFields()->getGroupsFields();

        
// Постраничный вывод
        
$this->model->limitPage($page$perpage);

        list(
$fields$this->model) = cmsEventsManager::hook('groups_list_filter', array($fields$this->model));

        
$filters = array();

        
// проверяем запросы фильтрации по полям
        
foreach($fields as $name => $field){

            if (!
$field['is_in_filter']) { continue; }

            
$field['handler']->setItem(['ctype_name' => 'groups''id' => null])->setContext('filter');

            
$fields[$name] = $field;

            if (!
$this->request->has($name)){ continue; }

            
$value $this->request->get($namefalse$field['handler']->getDefaultVarType(true));
            if (!
$value) { continue; }

            
$value $field['handler']->storeFilter($value);
            if (!
$value) { continue; }

            if(
$field['handler']->applyFilter($this->model$value) !== false){
                
$filters[$name] = $value;
            }

        }

        
// Получаем количество и список записей
        
$total  $this->model->getGroupsCount();

        if(
$this->request->has('show_count')){

            
$hint LANG_SHOW.' '.html_spellcount($totalLANG_GROUPS_GROUP_SPELLCOUNTfalsefalse0);

            return 
$this->cms_template->renderJSON([
                
'count'       => $total,
                
'filter_link' => false,
                
'hint'        => $hint
            
]);

        }

        
$groups $this->model->getGroups();

        
// если задано максимальное кол-во, ограничиваем им
        
if($this->max_items_count){
            
$total min($total$this->max_items_count);
            
$pages ceil($total $perpage);
            if(
$page $pages){
                
$groups false;
            }
        }

        if(
$this->request->isStandard()){
            if(!
$groups && $page 1){ cmsCore::error404(); }
        }

        list(
$groups$fields) = cmsEventsManager::hook('groups_before_list', array($groups$fields));

        
// строим массив полей для списка
        
if($groups){
            foreach (
$groups as $key => $group) {
                foreach(
$fields as $name => $field){

                    if (
$field['is_system'] || !$field['is_in_list'] || !isset($group[$field['name']])) { continue; }
                    if (
$field['groups_read'] && !$this->cms_user->isInGroups($field['groups_read'])) { continue; }
                    if (!
$group[$field['name']] && $group[$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($group)->parseTeaser($group[$field['name']]);
                    if (!
$field_html) { continue; }

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

                }
            }
        }

        return 
$this->cms_template->renderInternal($this'list', array(
            
'page_url'     => $page_url,
            
'fields'       => $fields,
            
'filters'      => $filters,
            
'page'         => $page,
            
'perpage'      => $perpage,
            
'total'        => $total,
            
'groups'       => $groups,
            
'dataset_name' => $dataset_name,
            
'user'         => $this->cms_user
        
));

    }

    public function 
getGroupContentCounts($group) {
        return 
$this->model->getGroupContentCounts($group,
                (
$this->cms_user->is_admin || ($this->cms_user->id == $group['owner_id'])),
                array(
$this'filterPrivacyGroupsContent'));
    }


    public function 
filterPrivacyGroupsContent($ctype$content_model$group) {

        if(empty(
$ctype['is_in_groups'])){ return false; }

        
$content_model->enablePrivacyFilter();

        if (!empty(
$ctype['options']['privacy_type']) &&
                
in_array($ctype['options']['privacy_type'], array('show_title''show_all'), true)) {

            
$content_model->disablePrivacyFilter();

        }
        if(
$group['access']['member_role'] == groups::ROLE_STAFF){

            
$content_model->disablePrivacyFilter();

        }
        if (
cmsUser::isAllowed($ctype['name'], 'view_all')) {

            
$content_model->disablePrivacyFilter();

        }
        if(
$group['access']['is_member'] && $content_model->isEnablePrivacyFilter()){

            
$content_model->disablePrivacyFilter();

            
$privacy = array(035);

            if(
cmsUser::isAllowed($ctype['name'], 'add')){
                
$privacy[] = 4;
            }

            
$content_model->filterIn('i.is_private'$privacy);

        }

        return 
true;

    }

    public function 
getGroupTabs($group){

        
$menu = array();

        
$menu[] = array(
            
'title'      => LANG_GROUPS_PROFILE_INDEX,
            
'controller' => $this->name,
            
'action'     => $group['slug'],
        );

        if (
$group['content_counts']){
            foreach(
$group['content_counts'] as $ctype_name => $count){
                if (!
$count['is_in_list'] || !$count['count']) { continue; }
                
$menu[] = array(
                    
'title'      => $count['title'],
                    
'controller' => $this->name,
                    
'action'     => $group['slug'],
                    
'params'     => array('content'$ctype_name),
                    
'counter'    => $count['count']
                );
            }
        }

        if (
$this->isControllerEnabled('activity')) {
            
$menu[] = array(
                
'title'      => LANG_GROUPS_PROFILE_ACTIVITY,
                
'controller' => $this->name,
                
'action'     => $group['slug'],
                
'params'     => 'activity',
            );
        }

        
$menu[] = array(
            
'title'      => LANG_GROUPS_PROFILE_MEMBERS,
            
'controller' => $this->name,
            
'action'     => $group['slug'],
            
'params'     => 'members',
            
'counter'    => $group['members_count']
        );

        list(
$menu$group) = cmsEventsManager::hook('group_tabs', array($menu$group));

        return 
$menu;
    }

    public function 
getDatasets(){

        
$list_type $this->getListContext();

        
$datasets cmsCore::getModel('content')->getContentDatasets($this->nametrue, function ($item$model) use ($list_type) {

            
$is_view = empty($item['list']['show']) || in_array($list_type$item['list']['show']);
            
$is_user_hide = !empty($item['list']['hide']) && in_array($list_type$item['list']['hide']);

            if (!
$is_view || $is_user_hide) { return false; }

            return 
$item;

        });

        if (
$this->cms_user->is_logged){

            
$logged_user_id $this->cms_user->id;

            if(!
$datasets && $list_type == 'category_view'){
                
$datasets = array('all' => array(
                        
'name' => 'all',
                        
'title' => LANG_ALL
                
));
            }
            if(
$list_type == 'category_view'){
                
$datasets['memberships'] = array(
                    
'name'    => 'memberships',
                    
'title'   => LANG_GROUPS_DS_MEMBER,
                    
'filters' => array(
                        array(
                            
'callback' => function($model$dataset) use ($logged_user_id){
                                return 
$model->filterByMember($logged_user_id);
                            }
                        )
                    )
                );
                
$datasets['my'] = array(
                    
'name'    => 'my',
                    
'title'   => LANG_GROUPS_DS_MY,
                    
'sorting' => array(
                        array(
                            
'by' => 'members_count',
                            
'to' => 'desc'
                        
)
                    ),
                    
'filters' => array(
                        array(
                            
'field'     => 'owner_id',
                            
'condition' => 'eq',
                            
'value'     => $logged_user_id
                        
)
                    )
                );
            }

        }

        return 
cmsEventsManager::hook('group_datasets'$datasets);
    }

    public function 
getGroupEditMenu($group){

        
$menu = array();

        
$menu[] = array(
            
'title'      => LANG_GROUPS_EDIT_MAIN,
            
'controller' => $this->name,
            
'action'     => $group['slug'],
            
'params'     => 'edit'
        
);

        if (
$this->cms_user->id == $group['owner_id'] || $this->cms_user->is_admin){
            
$menu[] = array(
                
'title'      => LANG_GROUPS_EDIT_STAFF,
                
'controller' => $this->name,
                
'action'     => $group['slug'],
                
'params'     => array('edit''staff')
            );
            
$menu[] = array(
                
'title'      => LANG_GROUPS_EDIT_ROLES,
                
'controller' => $this->name,
                
'action'     => $group['slug'],
                
'params'     => array('edit''roles')
            );
        }

        if (
$group['join_policy'] != groups::JOIN_POLICY_FREE && ($group['access']['member_role'] == groups::ROLE_STAFF || $this->cms_user->is_admin)){

            
$users_model cmsCore::getModel('users');

            
$rcount $this->model->filterUsersRequests($group['id'], $users_model)->getUsersCount();

            if(
$rcount){

                
$menu[] = array(
                    
'title'      => LANG_GROUPS_REQUESTS,
                    
'counter'    => $rcount,
                    
'controller' => $this->name,
                    
'action'     => $group['slug'],
                    
'params'     => array('edit''requests')
                );

            }

        }

        list(
$menu$group) = cmsEventsManager::hook('group_edit_menu', array($menu$group));

        return 
$menu;

    }

    public function 
getToolButtons($group) {

        
$users_options cmsController::loadOptions('users');

        
$tool_buttons = array();

        if (!
$group['is_approved'] && $group['access']['is_moderator']){
            
$tool_buttons['groups_accept'] = array(
                
'title'   => LANG_MODERATION_APPROVE,
                
'options' => ['class' => 'accept''icon' => 'check-double'],
                
'url'     => href_to('groups'$group['slug'], array('approve'))
            );
        }

        if (
$group['access']['is_can_edit']){
            
$tool_buttons['groups_edit'] = array(
                
'title'   => LANG_GROUPS_EDIT,
                
'options' => ['class' => 'settings''icon' => 'cogs'],
                
'url'     => href_to('groups'$group['slug'], array('edit'))
            );
        }

        if (
$group['access']['is_owner'] || $group['access']['is_moderator']){
            
$tool_buttons['change_owner'] = array(
                
'title'   => LANG_GROUPS_CHANGE_OWNER,
                
'options' => ['class' => 'transfer ajax-modal''icon' => 'people-arrows'],
                
'url'     => href_to('groups'$group['slug'], 'change_owner'),
            );
        }

        if (
$group['access']['is_can_invite'] && !empty($users_options['is_friends_on'])){
            
$tool_buttons['groups_invite'] = array(
                
'title'   => LANG_GROUPS_INVITE_FR,
                
'options' => ['class' => 'group_add ajax-modal''icon' => 'user-friends'],
                
'url'     => href_to('groups''invite_friends'$group['id'])
            );
        }

        if (
$group['access']['is_can_invite_users']){
            
$tool_buttons['groups_invite_users'] = array(
                
'title'   => LANG_GROUPS_INVITE,
                
'options' => array('class' => 'group_add''icon' => 'user-plus'),
                
'url'     => href_to('groups''invite_users'$group['id'])
            );
        }

        if (
$group['access']['is_can_join']){
            
$tool_buttons['groups_join'] = array(
                
'title'   => LANG_GROUPS_JOIN,
                
'options' => ['class' => 'user_add''confirm' => LANG_GROUPS_JOIN '?''icon' => 'sign-in-alt'],
                
'url'     => href_to('groups'$group['slug'], 'join'),
            );
        } elseif(
$this->cms_user->is_logged && !$group['access']['is_member'] && $group['join_policy'] != groups::JOIN_POLICY_FREE){
            
$tool_buttons['groups_enter'] = array(
                
'title'   => LANG_GROUPS_ENTER,
                
'options' => ['class' => 'invites''confirm' => LANG_GROUPS_ENTER_CONFIRM'icon' => 'sign-in-alt'],
                
'url'     => href_to('groups'$group['slug'], 'enter'),
            );
        }

        if (
$group['access']['is_member'] && !$group['access']['is_owner']){
            
$tool_buttons['groups_leave'] = array(
                
'title'   => LANG_GROUPS_LEAVE,
                
'options' => ['class' => 'user_delete''confirm' => LANG_GROUPS_LEAVE '?''icon' => 'sign-out-alt'],
                
'url'     => href_to('groups'$group['slug'], 'leave'),
            );
        }

        if (
$group['access']['is_can_delete']){
            if (
$group['is_approved']){
                
$tool_buttons['groups_delete'] = array(
                    
'title'   => LANG_GROUPS_DELETE,
                    
'options' => ['class' => 'delete ajax-modal''icon' => 'minus-circle'],
                    
'url'     => href_to('groups'$group['slug'], 'delete')
                );
            } else {
                
$tool_buttons['groups_delete'] = array(
                    
'title'   => LANG_GROUPS_REFUSE,
                    
'options' => ['class' => 'delete ajax-modal''icon' => 'minus-square'],
                    
'url'     => href_to('groups'$group['slug'], 'delete')
                );
            }
        }

        if (
$group['content_counts'] && $group['access']['is_member']){
            foreach(
$group['content_counts'] as $ctype_name => $count){
                if (!
$count['is_in_list']) { continue; }
                if (!
$this->isContentAddAllowed($ctype_name$group)) { continue; }
                
$tool_buttons['groups_add_'.$ctype_name] = array(
                    
'options' => ['class' => 'add''icon' => 'plus-circle'],
                    
'title'   => sprintf(LANG_CONTENT_ADD_ITEM$count['title_add']),
                    
'url'     => href_to($ctype_name'add') . "?group_id={$group['id']}"
                
);
            }
        }

        
$buttons_hook cmsEventsManager::hook('group_view_buttons', array(
            
'profile' => $group,
            
'buttons' => $tool_buttons
        
));

        return 
$buttons_hook['buttons'];

    }

    public function 
isContentAddAllowed($ctype_name$group) {

        
// пока группа не промодерирована, контент нельзя добавлять никому
        
if(!$group['is_approved']){ return false; }

        if(
$this->cms_user->is_admin || ($group['access']['is_owner'] && cmsUser::isAllowed('groups''content_access'))){ return true; }

        
// всем, кому разрешено общими правами
        
if(empty($group['content_policy'][$ctype_name])){
            return 
cmsUser::isAllowed($ctype_name'add');
        }

        
// только администраторам
        
if($group['content_policy'][$ctype_name] == self::CTYPE_POLICY_STAFF){
            return 
$group['access']['member_role'] == self::ROLE_STAFF;
        }

        
// только владельцам группы
        
if($group['content_policy'][$ctype_name] == self::CTYPE_POLICY_OWNER){
            return 
$group['access']['is_owner'];
        }

        
// только заданным группам пользователей
        
if($group['content_policy'][$ctype_name] == self::CTYPE_POLICY_GROUPS){
            if(empty(
$group['content_groups'][$ctype_name])){
                return 
cmsUser::isAllowed($ctype_name'add');
            }
            return 
$this->cms_user->isInGroups($group['content_groups'][$ctype_name]);
        }

        
// только заданным ролям
        
if($group['content_policy'][$ctype_name] == self::CTYPE_POLICY_ROLES){
            if(empty(
$group['content_roles'][$ctype_name])){
                return 
cmsUser::isAllowed($ctype_name'add');
            }

            
$roles $this->model->getUserRoles($group['id'], $this->cms_user->id);

            return 
$roles && $this->cms_user->isUserInGroups($roles$group['content_roles'][$ctype_name]);

        }

    }

    public function 
sendInvite($invited_users_list$group_id){

        
$group $this->model->getGroup($group_id);

        if (!
$group){ cmsCore::error404(); }

        if (!
is_array($invited_users_list)) { $invited_users_list = array($invited_users_list); }

        
$messenger cmsCore::getController('messages');

        foreach(
$invited_users_list as $invited_id){

            
$messenger->clearRecipients()->addRecipient($invited_id);

            
//
            // Личное сообщение
            //
            
$sender_link '<a href="'.href_to_profile($this->cms_user).'">'.$this->cms_user->nickname.'</a>';
            
$group_link '<a href="'.href_to('groups'$group['id']).'">'.$group['title'].'</a>';

            
$notice = array(
                
'content' => sprintf(LANG_GROUPS_INVITE_NOTICE$sender_link$group_link),
                
'options' => array(
                    
'is_closeable' => true
                
),
                
'actions' => array(
                    
'accept' => array(
                        
'title' => LANG_ACCEPT,
                        
'href'  => href_to('groups'$group['slug'], 'join')
                    ),
                    
'decline' => array(
                        
'title'      => LANG_DECLINE,
                        
'controller' => $this->name,
                        
'action'     => 'invite_delete',
                        
'params'     => array($group['id'], $invited_id)
                    )
                )
            );

            
$messenger->sendNoticePM($notice'groups_invite');

            
//
            // E-mail
            //
            
$messenger->sendNoticeEmail('groups_invite', array(
                
'user_nickname' => $this->cms_user->nickname,
                
'user_url'      => href_to_profile($this->cms_userfalsetrue),
                
'group_title'   => $group['title'],
                
'group_url'     => href_to_abs('groups'$group['id'])
            ));

            
$this->model->addInvite(array(
                
'group_id'   => $group['id'],
                
'user_id'    => $this->cms_user->id,
                
'invited_id' => $invited_id
            
));

        }

        if (
$this->request->isAjax()){

            return 
$this->cms_template->renderJSON(array(
                
'errors'   => false,
                
'text'     => LANG_GROUPS_INVITE_SENT,
                
'callback' => 'inviteFormSuccess'
            
));

        } else {

            
cmsUser::addSessionMessage(LANG_GROUPS_INVITE_SENT'success');

            
$this->redirectBack();

        }

    }

    public function 
validate_slug($value){
        if (empty(
$value)) { return true; }
        if (!
is_string($value)){ return ERR_VALIDATE_GROUP_SLUG; }
        if (
is_numeric($value)){ return ERR_VALIDATE_GROUP_SLUG_NUM; }
        if (!
preg_match("/^([a-z0-9-]*)$/"$value)){ return ERR_VALIDATE_GROUP_SLUG; }
        if (
$this->isActionExists($value)){ return ERR_VALIDATE_UNIQUE; }
        return 
true;
    }

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