bp-em-groups.php
6.97 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
/**
* Turns an event private if the event belongs to a private BP Group
* @param EM_Event $EM_Event
*/
function bp_em_group_event_save($result, $EM_Event){
if( is_object($EM_Event) && !empty($EM_Event->event_id) ){
if( !empty($_REQUEST['group_id']) && is_numeric($_REQUEST['group_id']) && bp_is_active('groups') ){
//firstly, we check that the event has been published, otherwise users without publish rights can submit an event at a private group and event is marked private/published immediately
if( $EM_Event->event_status == 1 ){
//we have been requested an event creation tied to a group, so does this group exist, and does this person have admin rights to it?
if( groups_is_user_admin(get_current_user_id(), absint($_REQUEST['group_id']) ) ){
$EM_Event->group_id = absint($_REQUEST['group_id']);
}
if( !empty($EM_Event->group_id) ){
//if group is private, make it private
$group = groups_get_group(array('group_id'=>$EM_Event->group_id));
$is_member = groups_is_user_member(get_current_user_id(), $EM_Event->group_id) || groups_is_user_admin(get_current_user_id(), $EM_Event->group_id) || groups_is_user_mod(get_current_user_id(), $EM_Event->group_id);
if( $group->status != 'public' && $is_member ){
//Make sure event status is private and set post status to private
global $wpdb;
$EM_Event->event_private = 1;
$wpdb->update($wpdb->posts, array('post_status'=>'private'), array('ID'=>$EM_Event->post_id));
$wpdb->update(EM_EVENTS_TABLE, array('event_private'=>1), array('event_id'=>$EM_Event->event_id));
}
}
}
}else{
$EM_Event->group_id = null;
}
}
return $result;
}
add_action('em_event_save','bp_em_group_event_save',1,2);
/**
* Overrides the default capability of the user for another owner's event if the user is a group admin and the event belongs to a group.
* User must have the relevant permissions globally in order to inherit that capability for this event as well.
* @param boolean $result
* @param EM_Event $EM_Event
*/
function bp_em_group_event_can_manage( $result, $EM_Event, $owner_capability, $admin_capability, $user_to_check){
if( !$result && $EM_Event->event_owner != get_current_user_id() && !empty($EM_Event->group_id) && bp_is_active('groups') ){ //only override if already false, incase it's true
//if the user is an admin of this group, and actually has the relevant permissions globally, they can manage this event
$EM_Object = new EM_Object(); //create new object to prevent infinite loop should we call $EM_Event->can_manage();
if( groups_is_user_admin(get_current_user_id(),$EM_Event->group_id) && $EM_Object->can_manage($owner_capability, $admin_capability, $user_to_check) ){
//This user is an admin of the owner's group, so they can edit this event.
array_pop($EM_Event->errors); //remove last error
return true;
}else{
$EM_Event->add_error($EM_Object->get_errors()); //add any applicable errors
}
}
return $result;
}
add_filter('em_event_can_manage','bp_em_group_event_can_manage',1,5);
function bp_em_group_events_accepted_searches($searches){
if( bp_is_active('groups') ){
$searches[] = 'group';
}
return $searches;
}
add_filter('em_accepted_searches','bp_em_group_events_accepted_searches',1,1);
function bp_em_group_events_get_default_search($searches, $array){
if( !empty($array['group']) && (is_numeric($array['group']) || $array['group'] == 'my' || $array['group'] == 'this') && bp_is_active('groups') ){
if($array['group'] == 'this'){ //shows current group, if applicable
if( is_numeric(bp_get_current_group_id()) ){
$searches['group'] = bp_get_current_group_id();
}
}else{
$searches['group'] = $array['group'];
}
}
return $searches;
}
add_filter('em_events_get_default_search','bp_em_group_events_get_default_search',1,2);
/*
* Privacy Functions
*/
function bp_em_group_events_build_sql_conditions( $conditions, $args ){
if( !empty($args['group']) && is_numeric($args['group']) ){
$conditions['group'] = "( `group_id`={$args['group']} )";
}elseif( !empty($args['group']) && $args['group'] == 'my' ){
$groups = groups_get_user_groups(get_current_user_id());
if( count($groups) > 0 ){
$conditions['group'] = "( `group_id` IN (".implode(',',$groups['groups']).") )";
}
}
//deal with private groups and events
if( is_user_logged_in() ){
global $wpdb;
//find out what private groups they belong to, and don't show private group events not in their memberships
$group_ids = BP_Groups_Member::get_group_ids(get_current_user_id());
if( $group_ids['total'] > 0){
$conditions['group_privacy'] = "(`event_private`=0 OR (`event_private`=1 AND (`group_id` IS NULL OR `group_id` = 0)) OR (`event_private`=1 AND `group_id` IN (".implode(',',$group_ids['groups']).")))";
}else{
//find out what private groups they belong to, and don't show private group events not in their memberships
$conditions['group_privacy'] = "(`event_private`=0 OR (`event_private`=1 AND (`group_id` IS NULL OR `group_id` = 0)))";
}
}
return $conditions;
}
add_filter('em_events_build_sql_conditions','bp_em_group_events_build_sql_conditions',1,2);
/**
* Checks if the event is private and either belongs to a group or private group, as members of that group should be able to see the post even if not able to see private events.
* @param string $template
* @return string
*/
function bp_em_private_event_check($template){
global $post, $wpdb, $wp_query, $bp;
if( $post->post_type == EM_POST_TYPE_EVENT ){
$EM_Event = em_get_event($post);
//echo "<pre>"; print_r($EM_Event); echo "</pre>"; die();
if( !empty($EM_Event->event_private) && !empty($EM_Event->group_id) ){
if( is_user_logged_in() ){
//make sure user is a member of this group, whether private or not, private groups just aren't shown to non-members of a group
$id_lookup = $wpdb->get_var( $wpdb->prepare( "SELECT m.group_id FROM {$bp->groups->table_name_members} m WHERE m.group_id = %s AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $EM_Event->group_id, get_current_user_id() ) );
if($id_lookup != $EM_Event->group_id){
unset($post);
$wp_query->set_404();
$template = locate_template(array('404.php'),false);
}
}else{
unset($post);
$wp_query->set_404();
$template = locate_template(array('404.php'),false);
}
}
}
return $template;
}
add_filter('single_template','bp_em_private_event_check',20);
/*
* Admin Meta Boxes
*/
function bp_em_meta_boxes(){
add_meta_box('em-event-group', __('Group Ownership','events-manager'), 'bp_em_meta_box_group',EM_POST_TYPE_EVENT, 'side','low');
add_meta_box('em-event-group', __('Group Ownership','events-manager'), 'bp_em_meta_box_group','event-recurring', 'side','low');
}
add_action('add_meta_boxes', 'bp_em_meta_boxes');
function bp_em_meta_box_group(){
em_locate_template('forms/event/group.php',true);
}