Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/User/Group/Group.php
Строк: 689
<?php

namespace ConcreteCoreUserGroup;

use 
ConcreteCoreFoundationObject;
use 
ConcreteCoreUserUser;
use 
Config;
use 
GettextTranslations;
use 
Database;
use 
CacheLocal;
use 
GroupTree;
use 
GroupTreeNode;
use 
UserList;
use 
Events;
use 
ConcreteCorePackagePackageList;
use 
File;

class 
Group extends Object implements ConcreteCorePermissionObjectInterface
{
    public 
$ctID;
    public 
$permissionSet;
    private 
$permissions = array(); // more advanced version of permissions

    
public function getPermissionObjectIdentifier()
    {
        return 
$this->gID;
    }

    public function 
getPermissionResponseClassName()
    {
        return 
'\Concrete\Core\Permission\Response\GroupResponse';
    }

    public function 
getPermissionAssignmentClassName()
    {
        return 
false;
    }

    public function 
getPermissionObjectKeyCategoryHandle()
    {
        return 
false;
    }

    
/**
     * Takes the numeric id of a group and returns a group object.
     *
     * @param string $gID
     *
     * @return Group
     */
    
public static function getByID($gID)
    {
        
$db Database::connection();
        
$g CacheLocal::getEntry('group'$gID);
        if (
is_object($g)) {
            return 
$g;
        }

        
$row $db->getRow("select * from Groups where gID = ?", array($gID));
        if (isset(
$row['gID'])) {
            
$g Core::make('ConcreteCoreUserGroupGroup');
            
$g->setPropertiesFromArray($row);
            
CacheLocal::set('group'$gID$g);

            return 
$g;
        }
    }

    
/**
     * Takes the name of a group and returns a group object.
     *
     * @param string $gName
     *
     * @return Group
     */
    
public static function getByName($gName)
    {
        
$db Database::connection();
        
$row $db->getRow("select * from Groups where gName = ?", array($gName));
        if (isset(
$row['gID'])) {
            
$g = new static();
            
$g->setPropertiesFromArray($row);

            return 
$g;
        }
    }

    
/**
     * @param string $gPath The group path
     *
     * @return Group
     */
    
public static function getByPath($gPath)
    {
        
$db Database::connection();
        
$row $db->getRow("select * from Groups where gPath = ?", array($gPath));
        if (isset(
$row['gID'])) {
            
$g = new static();
            
$g->setPropertiesFromArray($row);

            return 
$g;
        }
    }

    public function 
getGroupMembers()
    {
        
$user_list = new UserList();
        
$user_list->filterByGroup($this);

        return 
$user_list->get();
    }

    public function 
getGroupMemberIDs()
    {
        
$user_list = new UserList();
        
$user_list->filterByGroup($this);

        return 
$user_list->getResultIDs();
    }

    public function 
setPermissionsForObject($obj)
    {
        
$this->pObj $obj;
        
$db Database::connection();
        if (
$obj instanceof UserInfo) {
            
$uID $this->pObj->getUserID();
            if (
$uID) {
                
$q "select gID, ugEntered from UserGroups where gID = '{$this->gID}' and uID = {$uID}";
                
$r $db->query($q);
                if (
$r) {
                    
$row $r->fetchRow();
                    if (
$row['gID']) {
                        
$this->inGroup true;
                        
$this->gDateTimeEntered $row['ugEntered'];
                    }
                }
            }
        }
    }

    public function 
getGroupMembersNum()
    {
        
$db Database::connection();
        
$cnt $db->GetOne("select count(uID) from UserGroups where gID = ?", array($this->gID));

        return 
$cnt;
    }

    
/**
     * Deletes a group.
     */
    
public function delete()
    {
        
// we will NOT let you delete the required groups
        
if ($this->gID == REGISTERED_GROUP_ID || $this->gID == GUEST_GROUP_ID) {
            return 
false;
        }

        
// run any internal event we have for group deletion
        
$ge = new DeleteEvent($this);
        
$ge Events::dispatch('on_group_delete'$ge);
        if (!
$ge->proceed()) {
            return 
false;
        }

        
$tree GroupTree::get();
        
$rootNode $tree->getRootTreeNodeObject();
        
$node GroupTreeNode::getTreeNodeByGroupID($this->gID);
        if (
is_object($node) && is_object($rootNode)) {
            
$node->populateDirectChildrenOnly();
            foreach (
$node->getChildNodes() as $childnode) {
                
$childnode->move($rootNode);
            }
            
$node GroupTreeNode::getTreeNodeByGroupID($this->gID);
            
$node->delete();
        }

        
$db Database::connection();
        
$r $db->query("DELETE FROM UserGroups WHERE gID = ?", array(intval($this->gID)));
        
$r $db->query("DELETE FROM Groups WHERE gID = ?", array(intval($this->gID)));
    }

    public function 
rescanGroupPath()
    {
        
$db Database::connection();
        
$path '';
        
// first, we get the group node for this group.
        
$node GroupTreeNode::getTreeNodeByGroupID($this->gID);
        if (
is_object($node)) {
            
$parents $node->getTreeNodeParentArray();
            
$parents array_reverse($parents);
            foreach (
$parents as $node) {
                
$g $node->getTreeNodeGroupObject();
                if (
is_object($g)) {
                    
$path .= '/' $g->getGroupName();
                }
            }
        }

        
$path .= '/' $this->gName;
        
$this->gPath $path;

        
$db->Execute('update Groups set gPath = ? where gID = ?', array($path$this->gID));
    }

    public function 
rescanGroupPathRecursive()
    {
        
$this->rescanGroupPath();

        
$node GroupTreeNode::getTreeNodeByGroupID($this->gID);
        
$node->populateDirectChildrenOnly();
        foreach (
$node->getChildNodes() as $child) {
            
$group $child->getTreeNodeGroupObject();
            
$group->rescanGroupPathRecursive();
        }
    }

    public function 
inGroup()
    {
        return 
$this->inGroup;
    }

    public function 
getGroupDateTimeEntered($user)
    {
        
$db Database::connection();
        
$q "select ugEntered from UserGroups where gID = ? and uID = ?";
        
$r $db->GetOne($q, array($this->gID$user->getUserID()));
        if (
$r) {
            return 
$r;
        }
    }

    public function 
getGroupID()
    {
        return 
$this->gID;
    }

    public function 
getGroupName()
    {
        return 
$this->gName;
    }

    public function 
getGroupPath()
    {
        return 
$this->gPath;
    }

    public function 
getParentGroups()
    {
        
$node GroupTreeNode::getTreeNodeByGroupID($this->gID);
        
$parentGroups = array();
        if (
is_object($node)) {
            
$parents $node->getTreeNodeParentArray();
            
$parents array_reverse($parents);
            foreach (
$parents as $node) {
                
$g $node->getTreeNodeGroupObject();
                if (
is_object($g)) {
                    
$parentGroups[] = $g;
                }
            }
        }

        return 
$parentGroups;
    }

    public function 
getChildGroups()
    {
        
$node GroupTreeNode::getTreeNodeByGroupID($this->gID);
        
$children = array();
        if (
is_object($node)) {
            
$node->populateDirectChildrenOnly();
            
$node_children $node->getChildNodes();
            foreach (
$node_children as $node_child) {
                
$group $node_child->getTreeNodeGroupObject();
                if (
is_object($group)) {
                    
$children[] = $group;
                }
            }
        }

        return 
$children;
    }

    public function 
getParentGroup()
    {
        
$node GroupTreeNode::getTreeNodeByGroupID($this->gID);
        
$parent $node->getTreeNodeParentObject();
        if (
$parent) {
            return 
$parent->getTreeNodeGroupObject();
        }
    }

    public function 
getGroupDisplayName($includeHTML true$includePath true)
    {
        
$return '';
        if (
$includePath) {
            
$parentGroups $this->getParentGroups();
            if (
count($parentGroups) > 0) {
                if (
$includeHTML) {
                    
$return .= '<span class="ccm-group-breadcrumb">';
                }
                foreach (
$parentGroups as $pg) {
                    
$return .= h(tc('GroupName'$pg->getGroupName()));
                    
$return .= ' ' Config::get('concrete.seo.group_name_separator') . ' ';
                }
                
$return trim($return);
                if (
$includeHTML) {
                    
$return .= '</span> ';
                }
            }
        }
        
$return .= tc('GroupName'$this->getGroupName());

        return 
$return;
    }

    public function 
getGroupDescription()
    {
        return 
$this->gDescription;
    }

    
/**
     * Gets the group start date.
     *
     * @return string date formated like: 2009-01-01 00:00:00
     */
    
public function getGroupStartDate()
    {
        return 
$this->cgStartDate;
    }

    
/**
     * Gets the group end date.
     *
     * @return string date formated like: 2009-01-01 00:00:00
     */
    
public function getGroupEndDate()
    {
        return 
$this->cgEndDate;
    }

    public function 
isGroupBadge()
    {
        return 
$this->gIsBadge;
    }

    public function 
getGroupBadgeDescription()
    {
        return 
$this->gBadgeDescription;
    }

    public function 
getGroupBadgeCommunityPointValue()
    {
        return 
$this->gBadgeCommunityPointValue;
    }

    public function 
getGroupBadgeImageID()
    {
        return 
$this->gBadgeFID;
    }

    public function 
isGroupAutomated()
    {
        return 
$this->gIsAutomated;
    }

    public function 
checkGroupAutomationOnRegister()
    {
        return 
$this->gCheckAutomationOnRegister;
    }

    public function 
checkGroupAutomationOnLogin()
    {
        return 
$this->gCheckAutomationOnLogin;
    }

    public function 
checkGroupAutomationOnJobRun()
    {
        return 
$this->gCheckAutomationOnJobRun;
    }

    public function 
getGroupAutomationController()
    {
        
$class $this->getGroupAutomationControllerClass();
        try {
            
$c Core::make($class, array($this));
        } catch (
ReflectionException $e) {
            
$c Core::make(core_class('\Core\User\Group\AutomatedGroup\DefaultAutomation'), array($this));
        }

        return 
$c;
    }

    public function 
getGroupAutomationControllerClass()
    {
        
$ts Core::make('helper/text');
        
$env Environment::get();
        
$r $env->getRecord(DIRNAME_CLASSES '/User/Group/AutomatedGroup/' camelcase($ts->handle($this->getGroupName())) . '.php');
        
$prefix $r->override true $this->getPackageHandle();
        
$class core_class('\Core\User\Group\AutomatedGroup\' . camelcase($ts->handle($this->getGroupName())), $prefix);

        return $class;
    }

    public function getGroupBadgeImageObject()
    {
        $bf = false;
        if ($this->gBadgeFID) {
            $bf = File::getByID($this->gBadgeFID);
            if (!is_object($bf) || $bf->isError()) {
                unset($bf);
            }
        }

        return $bf;
    }

    public function isGroupExpirationEnabled()
    {
        return $this->gUserExpirationIsEnabled;
    }

    public function getGroupExpirationMethod()
    {
        return $this->gUserExpirationMethod;
    }

    public function getGroupExpirationDateTime()
    {
        return $this->gUserExpirationSetDateTime;
    }

    public function getGroupExpirationAction()
    {
        return $this->gUserExpirationAction;
    }

    public function getGroupExpirationInterval()
    {
        return $this->gUserExpirationInterval;
    }

    public function getGroupExpirationIntervalDays()
    {
        return floor($this->gUserExpirationInterval / 1440);
    }

    public function getGroupExpirationIntervalHours()
    {
        return floor(($this->gUserExpirationInterval % 1440) / 60);
    }

    public function getGroupExpirationIntervalMinutes()
    {
        return floor(($this->gUserExpirationInterval % 1440) % 60);
    }

    public function isUserExpired(User $u)
    {
        if ($this->isGroupExpirationEnabled()) {
            switch ($this->getGroupExpirationMethod()) {
                case '
SET_TIME':
                    if (time() > strtotime($this->getGroupExpirationDateTime())) {
                        return true;
                    }
                    break;
                case '
INTERVAL':
                    if (time() > strtotime($this->getGroupDateTimeEntered($u)) + ($this->getGroupExpirationInterval() * 60)) {
                        return true;
                    }
                    break;
            }
        }

        return false;
    }

    public function getPackageID()
    {
        return $this->pkgID;
    }

    public function getPackageHandle()
    {
        return PackageList::getHandle($this->pkgID);
    }

    public function update($gName, $gDescription)
    {
        $db = Database::connection();
        if ($this->gID) {
            $g = CacheLocal::delete('
group', $this->gID);
            $v = array($gName, $gDescription, $this->gID);
            $r = $db->prepare("update Groups set gName = ?, gDescription = ? where gID = ?");
            $res = $db->Execute($r, $v);
            $group = static::getByID($this->gID);
            $group->rescanGroupPathRecursive();

            $ge = new Event($this);
            Events::dispatch('
on_group_update', $ge);

            return $group;
        }
    }

    /** Creates a new user group.
     * @param string $gName
     * @param string $gDescription
     *
     * @return Group
     */
    public static function add($gName, $gDescription, $parentGroup = false, $pkg = null, $gID = null)
    {
        $db = Database::connection();
        $pkgID = 0;
        if (is_object($pkg)) {
            $pkgID = $pkg->getPackageID();
        }
        $v = array($gID, $gName, $gDescription, $pkgID);
        $r = $db->prepare("insert into Groups (gID, gName, gDescription, pkgID) values (?, ?, ?, ?)");
        $res = $db->Execute($r, $v);

        if ($res) {
            $ng = static::getByID($db->Insert_ID());
            // create a node for this group.
            $node = null;
            if (is_object($parentGroup)) {
                $node = GroupTreeNode::getTreeNodeByGroupID($parentGroup->getGroupID());
            }
            if (!is_object($node)) {
                $tree = GroupTree::get();
                if (is_object($tree)) {
                    $node = $tree->getRootTreeNodeObject();
                }
            }

            if (is_object($node)) {
                GroupTreeNode::add($ng, $node);
            }

            $ge = new Event($ng);
            Events::dispatch('
on_group_add', $ge);

            $ng->rescanGroupPath();

            return $ng;
        }
    }

    public static function getBadges()
    {
        $gs = new GroupList();
        $gs->filter('
gIsBadge', 1);
        $results = $gs->getResults();
        $badges = array();
        foreach ($results as $gr) {
            $badges[] = $gr;
        }

        return $badges;
    }

    protected function getAutomationControllers($column, $excludeUser = false)
    {
        $gs = new GroupList();
        $gs->filter($column, 1);
        $excludeGIDs = array();
        if (is_object($excludeUser)) {
            $groups = $excludeUser->getUserGroups();
            $groupKeys = array_keys($groups);
            if (is_array($groupKeys)) {
                $gs->filter(false, '
gID not in (' . implode(',', $groupKeys) . ')');
            }
        }
        $results = $gs->get();
        $controllers = array();
        foreach ($results as $group) {
            $controller = $group->getGroupAutomationController();
            $controllers[] = $controller;
        }

        return $controllers;
    }

    public static function getAutomatedOnRegisterGroupControllers($u = false)
    {
        return static::getAutomationControllers('
gCheckAutomationOnRegister', $u);
    }

    public static function getAutomatedOnLoginGroupControllers($u = false)
    {
        return static::getAutomationControllers('
gCheckAutomationOnLogin', $u);
    }

    public static function getAutomatedOnJobRunGroupControllers()
    {
        return static::getAutomationControllers('
gCheckAutomationOnJobRun');
    }

    public function clearBadgeOptions()
    {
        $db = Database::connection();
        $db->Execute(
            '
update Groups set gIsBadge 0gBadgeFID 0gBadgeDescription nullgBadgeCommunityPointValue 0 where gID = ?',
            array($this->getGroupID())
        );
    }

    public function clearAutomationOptions()
    {
        $db = Database::connection();
        $db->Execute(
            '
update Groups set gIsAutomated 0gCheckAutomationOnRegister 0gCheckAutomationOnLogin 0gCheckAutomationOnJobRun 0 where gID = ?',
            array($this->getGroupID())
        );
    }

    public function removeGroupExpiration()
    {
        $db = Database::connection();
        $db->Execute(
            '
update Groups set gUserExpirationIsEnabled 0gUserExpirationMethod nullgUserExpirationSetDateTime nullgUserExpirationInterval 0gUserExpirationAction null where gID = ?',
            array($this->getGroupID())
        );
    }

    public function setBadgeOptions($gBadgeFID, $gBadgeDescription, $gBadgeCommunityPointValue)
    {
        $db = Database::connection();
        $db->Execute(
            '
update Groups set gIsBadge 1gBadgeFID = ?, gBadgeDescription = ?, gBadgeCommunityPointValue = ? where gID = ?',
            array(intval($gBadgeFID), $gBadgeDescription, $gBadgeCommunityPointValue, $this->gID)
        );
    }

    public function setAutomationOptions(
        $gCheckAutomationOnRegister,
        $gCheckAutomationOnLogin,
        $gCheckAutomationOnJobRun
    ) {
        $db = Database::connection();
        $db->Execute(
            '
update Groups set gIsAutomated 1gCheckAutomationOnRegister = ?, gCheckAutomationOnLogin = ?, gCheckAutomationOnJobRun = ? where gID = ?',
            array(
                intval($gCheckAutomationOnRegister),
                intval($gCheckAutomationOnLogin),
                intval($gCheckAutomationOnJobRun),
                $this->gID,
            )
        );
    }

    public function setGroupExpirationByDateTime($datetime, $action)
    {
        $db = Database::connection();
        $db->Execute(
            '
update Groups set gUserExpirationIsEnabled 1gUserExpirationMethod 'SET_TIME'gUserExpirationInterval 0gUserExpirationSetDateTime = ?, gUserExpirationAction = ? where gID = ?',
            array($datetime, $action, $this->gID)
        );
    }

    public function setGroupExpirationByInterval($days, $hours, $minutes, $action)
    {
        $db = Database::connection();
        $interval = $minutes + ($hours * 60) + ($days * 1440);
        $db->Execute(
            '
update Groups set gUserExpirationIsEnabled 1gUserExpirationMethod 'INTERVAL'gUserExpirationSetDateTime nullgUserExpirationInterval = ?, gUserExpirationAction = ? where gID = ?',
            array($interval, $action, $this->gID)
        );
    }

    public static function exportTranslations()
    {
        $translations = new Translations();
        $gl = new GroupList();
        $gl->includeAllGroups();
        $results = $gl->getResults();
        foreach ($results as $group) {
            $translations->insert('
GroupName', $group->getGroupName());
            if ($group->getGroupDescription()) {
                $translations->insert('
GroupDescription', $group->getGroupDescription());
            }
        }

        return $translations;
    }
}
Онлайн: 2
Реклама