diff options
Diffstat (limited to 'engine/classes/ElggGroupItemVisibility.php')
| -rw-r--r-- | engine/classes/ElggGroupItemVisibility.php | 93 | 
1 files changed, 93 insertions, 0 deletions
| diff --git a/engine/classes/ElggGroupItemVisibility.php b/engine/classes/ElggGroupItemVisibility.php new file mode 100644 index 000000000..2c7e2abb4 --- /dev/null +++ b/engine/classes/ElggGroupItemVisibility.php @@ -0,0 +1,93 @@ +<?php + +/** + * Determines if otherwise visible items should be hidden from a user due to group + * policy or visibility. + * + * @class      ElggGroupItemVisibility + * @package    Elgg.Core + * @subpackage Groups + * + * @access private + */ +class ElggGroupItemVisibility { + +	const REASON_MEMBERSHIP = 'membershiprequired'; +	const REASON_LOGGEDOUT = 'loggedinrequired'; +	const REASON_NOACCESS = 'noaccess'; + +	/** +	 * @var bool +	 */ +	public $shouldHideItems = false; + +	/** +	 * @var string +	 */ +	public $reasonHidden = ''; + +	/** +	 * Determine visibility of items within a container for the current user +	 * +	 * @param int $container_guid GUID of a container (may/may not be a group) +	 * +	 * @return ElggGroupItemVisibility +	 * +	 * @todo Make this faster, considering it must run for every river item. +	 */ +	static public function factory($container_guid) { +		// cache because this may be called repeatedly during river display, and +		// due to need to check group visibility, cache will be disabled for some +		// get_entity() calls +		static $cache = array(); + +		$ret = new ElggGroupItemVisibility(); + +		if (!$container_guid) { +			return $ret; +		} + +		$user = elgg_get_logged_in_user_entity(); +		$user_guid = $user ? $user->guid : 0; + +		$container_guid = (int) $container_guid; + +		$cache_key = "$container_guid|$user_guid"; +		if (empty($cache[$cache_key])) { +			// compute + +			$container = get_entity($container_guid); +			$is_visible = (bool) $container; + +			if (!$is_visible) { +				// see if it *really* exists... +				$prev_access = elgg_set_ignore_access(); +				$container = get_entity($container_guid); +				elgg_set_ignore_access($prev_access); +			} + +			if ($container && $container instanceof ElggGroup) { +				/* @var ElggGroup $container */ + +				if ($is_visible) { +					if (!$container->isPublicMembership()) { +						if ($user) { +							if (!$container->isMember($user) && !$user->isAdmin()) { +								$ret->shouldHideItems = true; +								$ret->reasonHidden = self::REASON_MEMBERSHIP; +							} +						} else { +							$ret->shouldHideItems = true; +							$ret->reasonHidden = self::REASON_LOGGEDOUT; +						} +					} +				} else { +					$ret->shouldHideItems = true; +					$ret->reasonHidden = self::REASON_NOACCESS; +				} +			} +			$cache[$cache_key] = $ret; +		} +		return $cache[$cache_key]; +	} +} | 
