blob: 743c935dadaf639a1130178a97a485a4547acadb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
<?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 = '';
/**
* @var bool
*/
public $requireLogin = false;
/**
* 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;
}
}
if ($ret->shouldHideItems && !$user) {
$ret->requireLogin = true;
}
$cache[$cache_key] = $ret;
}
return $cache[$cache_key];
}
}
|