123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591 |
- <?php
- /**
- * Class representing a container for other elgg entities.
- *
- * @package Elgg.Core
- * @subpackage Groups
- *
- * @property string $name A short name that captures the purpose of the group
- * @property string $description A longer body of content that gives more details about the group
- */
- class ElggGroup extends \ElggEntity
- implements Friendable {
- const CONTENT_ACCESS_MODE_UNRESTRICTED = 'unrestricted';
- const CONTENT_ACCESS_MODE_MEMBERS_ONLY = 'members_only';
- /**
- * Sets the type to group.
- *
- * @return void
- */
- protected function initializeAttributes() {
- parent::initializeAttributes();
- $this->attributes['type'] = "group";
- $this->attributes += self::getExternalAttributes();
- $this->tables_split = 2;
- }
- /**
- * Get default values for attributes stored in a separate table
- *
- * @return array
- * @access private
- *
- * @see \Elgg\Database\EntityTable::getEntities
- */
- final public static function getExternalAttributes() {
- return [
- 'name' => null,
- 'description' => null,
- ];
- }
- /**
- * Construct a new group entity
- *
- * Plugin developers should only use the constructor to create a new entity.
- * To retrieve entities, use get_entity() and the elgg_get_entities* functions.
- *
- * @param \stdClass $row Database row result. Default is null to create a new group.
- *
- * @throws IOException|InvalidParameterException if there was a problem creating the group.
- */
- public function __construct($row = null) {
- $this->initializeAttributes();
- // compatibility for 1.7 api.
- $this->initialise_attributes(false);
- if (!empty($row)) {
- // Is $guid is a entity table DB row
- if ($row instanceof \stdClass) {
- // Load the rest
- if (!$this->load($row)) {
- $msg = "Failed to load new " . get_class() . " for GUID:" . $row->guid;
- throw new \IOException($msg);
- }
- } else if ($row instanceof \ElggGroup) {
- // $row is an \ElggGroup so this is a copy constructor
- elgg_deprecated_notice('This type of usage of the \ElggGroup constructor was deprecated. Please use the clone method.', 1.7);
- foreach ($row->attributes as $key => $value) {
- $this->attributes[$key] = $value;
- }
- } else if (is_numeric($row)) {
- // $row is a GUID so load entity
- elgg_deprecated_notice('Passing a GUID to constructor is deprecated. Use get_entity()', 1.9);
- if (!$this->load($row)) {
- throw new \IOException("Failed to load new " . get_class() . " from GUID:" . $row);
- }
- } else {
- throw new \InvalidParameterException("Unrecognized value passed to constuctor.");
- }
- }
- }
- /**
- * {@inheritdoc}
- */
- public function getDisplayName() {
- return $this->name;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setDisplayName($displayName) {
- $this->name = $displayName;
- }
- /**
- * Add an \ElggObject to this group.
- *
- * @param \ElggObject $object The object.
- *
- * @return bool
- */
- public function addObjectToGroup(\ElggObject $object) {
- $object->container_guid = $this->guid;
- return $object->save();
- }
- /**
- * Remove an object from this containing group and sets the container to be
- * object's owner
- *
- * @param \ElggObject $object The object.
- *
- * @return bool
- */
- public function removeObjectFromGroup($object) {
- if (is_numeric($object)) {
- elgg_deprecated_notice('\ElggGroup::removeObjectFromGroup() takes an \ElggObject not a guid.', 1.9);
- $object = get_entity($object);
- if (!elgg_instanceof($object, 'object')) {
- return false;
- }
- }
- $object->container_guid = $object->owner_guid;
- return $object->save();
- }
- /**
- * Wrapper around \ElggEntity::__get()
- *
- * @see \ElggEntity::__get()
- *
- * @param string $name Name
- * @return mixed
- * @todo deprecate appending group to username. Was a hack used for creating
- * URLs for group content. We stopped using the hack in 1.8.
- */
- public function __get($name) {
- if ($name == 'username') {
- return 'group:' . $this->getGUID();
- }
- return parent::__get($name);
- }
- /**
- * Wrapper around \ElggEntity::get()
- *
- * @param string $name Name
- * @return mixed
- * @deprecated 1.9
- */
- public function get($name) {
- elgg_deprecated_notice("Use -> instead of get()", 1.9);
- return $this->__get($name);
- }
- /**
- * Start friendable compatibility block:
- *
- * public function addFriend($friend_guid);
- public function removeFriend($friend_guid);
- public function isFriend();
- public function isFriendsWith($user_guid);
- public function isFriendOf($user_guid);
- public function getFriends($subtype = "", $limit = 10, $offset = 0);
- public function getFriendsOf($subtype = "", $limit = 10, $offset = 0);
- public function getObjects($subtype="", $limit = 10, $offset = 0);
- public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0);
- public function countObjects($subtype = "");
- */
- /**
- * For compatibility with Friendable.
- *
- * Join a group when you friend \ElggGroup.
- *
- * @param int $friend_guid The GUID of the user joining the group.
- *
- * @return bool
- * @deprecated 1.9 Use \ElggGroup::join()
- */
- public function addFriend($friend_guid) {
- elgg_deprecated_notice("\ElggGroup::addFriend() is deprecated. Use \ElggGroup::join()", 1.9);
- $user = get_user($friend_guid);
- return $user ? $this->join($user) : false;
- }
- /**
- * For compatibility with Friendable
- *
- * Leave group when you unfriend \ElggGroup.
- *
- * @param int $friend_guid The GUID of the user leaving.
- *
- * @return bool
- * @deprecated 1.9 Use \ElggGroup::leave()
- */
- public function removeFriend($friend_guid) {
- elgg_deprecated_notice("\ElggGroup::removeFriend() is deprecated. Use \ElggGroup::leave()", 1.9);
- $user = get_user($friend_guid);
- return $user ? $this->leave($user) : false;
- }
- /**
- * For compatibility with Friendable
- *
- * Friending a group adds you as a member
- *
- * @return bool
- * @deprecated 1.9 Use \ElggGroup::isMember()
- */
- public function isFriend() {
- elgg_deprecated_notice("\ElggGroup::isFriend() is deprecated. Use \ElggGroup::isMember()", 1.9);
- return $this->isMember();
- }
- /**
- * For compatibility with Friendable
- *
- * @param int $user_guid The GUID of a user to check.
- *
- * @return bool
- * @deprecated 1.9 Use \ElggGroup::isMember()
- */
- public function isFriendsWith($user_guid) {
- elgg_deprecated_notice("\ElggGroup::isFriendsWith() is deprecated. Use \ElggGroup::isMember()", 1.9);
- $user = get_user($user_guid);
- return $user ? $this->isMember($user) : false;
- }
- /**
- * For compatibility with Friendable
- *
- * @param int $user_guid The GUID of a user to check.
- *
- * @return bool
- * @deprecated 1.9 Use \ElggGroup::isMember()
- */
- public function isFriendOf($user_guid) {
- elgg_deprecated_notice("\ElggGroup::isFriendOf() is deprecated. Use \ElggGroup::isMember()", 1.9);
- $user = get_user($user_guid);
- return $user ? $this->isMember($user) : false;
- }
- /**
- * For compatibility with Friendable
- *
- * @param string $subtype The GUID of a user to check.
- * @param int $limit Limit
- * @param int $offset Offset
- *
- * @return bool
- * @deprecated 1.9 Use \ElggGroup::getMembers()
- */
- public function getFriends($subtype = "", $limit = 10, $offset = 0) {
- elgg_deprecated_notice("\ElggGroup::getFriends() is deprecated. Use \ElggGroup::getMembers()", 1.9);
- return get_group_members($this->getGUID(), $limit, $offset);
- }
- /**
- * For compatibility with Friendable
- *
- * @param string $subtype The GUID of a user to check.
- * @param int $limit Limit
- * @param int $offset Offset
- *
- * @return bool
- * @deprecated 1.9 Use \ElggGroup::getMembers()
- */
- public function getFriendsOf($subtype = "", $limit = 10, $offset = 0) {
- elgg_deprecated_notice("\ElggGroup::getFriendsOf() is deprecated. Use \ElggGroup::getMembers()", 1.9);
- return get_group_members($this->getGUID(), $limit, $offset);
- }
- /**
- * Get objects contained in this group.
- *
- * @param string $subtype Entity subtype
- * @param int $limit Limit
- * @param int $offset Offset
- *
- * @return array|false
- * @deprecated 1.9 Use elgg_get_entities()
- */
- public function getObjects($subtype = "", $limit = 10, $offset = 0) {
- elgg_deprecated_notice("\ElggGroup::getObjects() is deprecated. Use elgg_get_entities()", 1.9);
- return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", $limit, $offset, false);
- }
- /**
- * For compatibility with Friendable
- *
- * @param string $subtype Entity subtype
- * @param int $limit Limit
- * @param int $offset Offset
- *
- * @return array|false
- * @deprecated 1.9 Use elgg_get_entities()
- */
- public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0) {
- elgg_deprecated_notice("\ElggGroup::getFriendsObjects() is deprecated. Use elgg_get_entities()", 1.9);
- return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", $limit, $offset, false);
- }
- /**
- * For compatibility with Friendable
- *
- * @param string $subtype Subtype of entities
- *
- * @return array|false
- * @deprecated 1.9 Use elgg_get_entities()
- */
- public function countObjects($subtype = "") {
- elgg_deprecated_notice("\ElggGroup::countObjects() is deprecated. Use elgg_get_entities()", 1.9);
- return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", 10, 0, true);
- }
- /**
- * End friendable compatibility block
- */
- /**
- * Get an array of group members.
- *
- * @param array $options Options array. See elgg_get_entities_from_relationships
- * for a complete list. Common ones are 'limit', 'offset',
- * and 'count'. Options set automatically are 'relationship',
- * 'relationship_guid', 'inverse_relationship', and 'type'. This argument
- * used to set the limit (deprecated usage)
- * @param int $offset Offset (deprecated)
- * @param bool $count Count (deprecated)
- *
- * @return array
- */
- public function getMembers($options = array(), $offset = 0, $count = false) {
- if (!is_array($options)) {
- elgg_deprecated_notice('\ElggGroup::getMembers() takes an options array.', 1.9);
- $options = array(
- 'relationship' => 'member',
- 'relationship_guid' => $this->getGUID(),
- 'inverse_relationship' => true,
- 'type' => 'user',
- 'limit' => $options,
- 'offset' => $offset,
- 'count' => $count,
- );
- } else {
- $options['relationship'] = 'member';
- $options['relationship_guid'] = $this->getGUID();
- $options['inverse_relationship'] = true;
- $options['type'] = 'user';
- }
- return elgg_get_entities_from_relationship($options);
- }
- /**
- * Returns whether the current group has open membership or not.
- *
- * @return bool
- */
- public function isPublicMembership() {
- return ($this->membership == ACCESS_PUBLIC);
- }
- /**
- * Return the content access mode used by group_gatekeeper()
- *
- * @return string One of CONTENT_ACCESS_MODE_* constants
- * @access private
- * @since 1.9.0
- */
- public function getContentAccessMode() {
- $mode = $this->content_access_mode;
- if (!is_string($mode)) {
- // fallback to 1.8 default behavior
- if ($this->isPublicMembership()) {
- $mode = self::CONTENT_ACCESS_MODE_UNRESTRICTED;
- } else {
- $mode = self::CONTENT_ACCESS_MODE_MEMBERS_ONLY;
- }
- $this->content_access_mode = $mode;
- }
- // only support two modes for now
- if ($mode === self::CONTENT_ACCESS_MODE_MEMBERS_ONLY) {
- return $mode;
- }
- return self::CONTENT_ACCESS_MODE_UNRESTRICTED;
- }
- /**
- * Set the content access mode used by group_gatekeeper()
- *
- * @param string $mode One of CONTENT_ACCESS_MODE_* constants
- * @return void
- * @access private
- * @since 1.9.0
- */
- public function setContentAccessMode($mode) {
- // only support two modes for now
- if ($mode !== self::CONTENT_ACCESS_MODE_MEMBERS_ONLY) {
- $mode = self::CONTENT_ACCESS_MODE_UNRESTRICTED;
- }
- $this->content_access_mode = $mode;
- }
- /**
- * Is the given user a member of this group?
- *
- * @param \ElggUser $user The user. Default is logged in user.
- *
- * @return bool
- */
- public function isMember(\ElggUser $user = null) {
- if ($user == null) {
- $user = _elgg_services()->session->getLoggedInUser();
- }
- if (!$user) {
- return false;
- }
- $result = (bool)check_entity_relationship($user->guid, 'member', $this->guid);
- $params = array(
- 'user' => $user,
- 'group' => $this,
- );
- return _elgg_services()->hooks->trigger('is_member', 'group', $params, $result);
- }
- /**
- * Join a user to this group.
- *
- * @param \ElggUser $user User joining the group.
- *
- * @return bool Whether joining was successful.
- */
- public function join(\ElggUser $user) {
- $result = add_entity_relationship($user->guid, 'member', $this->guid);
-
- if ($result) {
- $params = array('group' => $this, 'user' => $user);
- _elgg_services()->events->trigger('join', 'group', $params);
- }
-
- return $result;
- }
- /**
- * Remove a user from the group.
- *
- * @param \ElggUser $user User to remove from the group.
- *
- * @return bool Whether the user was removed from the group.
- */
- public function leave(\ElggUser $user) {
- // event needs to be triggered while user is still member of group to have access to group acl
- $params = array('group' => $this, 'user' => $user);
- _elgg_services()->events->trigger('leave', 'group', $params);
- return remove_entity_relationship($user->guid, 'member', $this->guid);
- }
- /**
- * Load the \ElggGroup data from the database
- *
- * @param mixed $guid GUID of an \ElggGroup entity or database row from entity table
- *
- * @return bool
- */
- protected function load($guid) {
- $attr_loader = new \Elgg\AttributeLoader(get_class(), 'group', $this->attributes);
- $attr_loader->requires_access_control = !($this instanceof \ElggPlugin);
- $attr_loader->secondary_loader = 'get_group_entity_as_row';
- $attrs = $attr_loader->getRequiredAttributes($guid);
- if (!$attrs) {
- return false;
- }
- $this->attributes = $attrs;
- $this->tables_loaded = 2;
- $this->loadAdditionalSelectValues($attr_loader->getAdditionalSelectValues());
- _elgg_cache_entity($this);
- return true;
- }
- /**
- * {@inheritdoc}
- */
- protected function update() {
- global $CONFIG;
-
- if (!parent::update()) {
- return false;
- }
-
- $guid = (int)$this->guid;
- $name = sanitize_string($this->name);
- $description = sanitize_string($this->description);
-
- $query = "UPDATE {$CONFIG->dbprefix}groups_entity set"
- . " name='$name', description='$description' where guid=$guid";
- return $this->getDatabase()->updateData($query) !== false;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function create() {
- global $CONFIG;
-
- $guid = parent::create();
- if (!$guid) {
- // @todo this probably means permission to create entity was denied
- // Is returning false the correct thing to do
- return false;
- }
-
- $name = sanitize_string($this->name);
- $description = sanitize_string($this->description);
- $query = "INSERT into {$CONFIG->dbprefix}groups_entity"
- . " (guid, name, description) values ($guid, '$name', '$description')";
- $result = $this->getDatabase()->insertData($query);
- if ($result === false) {
- // TODO(evan): Throw an exception here?
- return false;
- }
-
- return $guid;
- }
- /**
- * {@inheritdoc}
- */
- protected function prepareObject($object) {
- $object = parent::prepareObject($object);
- $object->name = $this->getDisplayName();
- $object->description = $this->description;
- unset($object->read_access);
- return $object;
- }
- // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
- /**
- * Return an array of fields which can be exported.
- *
- * @return array
- * @deprecated 1.9 Use toObject()
- */
- public function getExportableValues() {
- return array_merge(parent::getExportableValues(), array(
- 'name',
- 'description',
- ));
- }
- /**
- * Can a user comment on this group?
- *
- * @see \ElggEntity::canComment()
- *
- * @param int $user_guid User guid (default is logged in user)
- * @return bool
- * @since 1.8.0
- */
- public function canComment($user_guid = 0) {
- $result = parent::canComment($user_guid);
- if ($result !== null) {
- return $result;
- }
- return false;
- }
- }
|