PluginProbe
Groups – Memberships and Access Control / 1.1.5
Groups – Memberships and Access Control v1.1.5
4.7.1 4.7.0 4.6.0 4.5.0 4.4.0 4.3.0 trunk 1.0.0-beta-1 1.0.0-beta-2 1.0.0-beta-3 1.0.0-beta-3b 1.0.0-beta-3c 1.0.0-beta-3d 1.1.4 1.1.5 1.10.0 1.10.1 1.10.2 1.10.3 1.11.0 1.11.1 1.11.2 1.11.3 1.12.0 1.13.0 All 131 releases
groups / lib / core / class-groups-group.php

class-groups-group.php in Groups – Memberships and Access Control 1.1.5, at lib/core/class-groups-group.php

396 lines 11.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * class-groups-group.php
4 *
5 * Copyright (c) "kento" Karim Rahimpur www.itthinx.com
6 *
7 * This code is released under the GNU General Public License.
8 * See COPYRIGHT.txt and LICENSE.txt.
9 *
10 * This code is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * This header and all notices must be kept intact.
16 *
17 * @author Karim Rahimpur
18 * @package groups
19 * @since groups 1.0.0
20 */
21 require_once( GROUPS_CORE_LIB . "/interface-i-capable.php" );
22
23 /**
24 * Group OPM.
25 */
26 class Groups_Group implements I_Capable {
27
28 /**
29 * @var Object Persisted group.
30 */
31 var $group = null;
32
33 /**
34 * Create by group id.
35 * Must have been persisted.
36 * @param int $group_id
37 */
38 public function __construct( $group_id ) {
39 $this->group = self::read( $group_id );
40 }
41
42 /**
43 * Retrieve a property by name.
44 *
45 * Possible properties:
46 * - group_id
47 * - parent_id
48 * - creator_id
49 * - datetime
50 * - name
51 * - description
52 *
53 * @param string $name property's name
54 * @return property value, will return null if property does not exist
55 */
56 public function __get( $name ) {
57 $result = null;
58 if ( $this->group !== null ) {
59 switch( $name ) {
60 case "group_id" :
61 case "parent_id" :
62 case "creator_id" :
63 case "datetime" :
64 case "name" :
65 case "description" :
66 $result = $this->group->$name;
67 break;
68 case "capabilities" :
69 $group_capability_table = _groups_get_tablename( "group_capability" );
70 $rows = $wpdb->get_results( $wpdb->prepare(
71 "SELECT capability_id FROM $group_capability_table WHERE group_id = %d",
72 Groups_Utility::id( $this->group->group_id )
73 ) );
74 if ( $rows ) {
75 $result = array();
76 foreach ( $rows as $row ) {
77 $result[] = new Groups_Capability( $row->capability_id );
78 }
79 }
80 break;
81 }
82 }
83 return $result;
84 }
85
86 /**
87 * (non-PHPdoc)
88 * @see I_Capable::can()
89 */
90 public function can( $capability ) {
91
92 global $wpdb;
93 $result = false;
94
95 if ( $this->group !== null ) {
96
97 $group_table = _groups_get_tablename( "group" );
98 $capability_table = _groups_get_tablename( "capability" );
99 $group_capability_table = _groups_get_tablename( "group_capability" );
100
101 // determine capability id
102 $capability_id = null;
103 if ( is_numeric( $capability ) ) {
104 $capability_id = Groups_Utility::id( $capability );
105 } else if ( is_string( $capability ) ) {
106 $capability_id = $wpdb->get_var( $wpdb->prepare(
107 "SELECT capability_id FROM $capability_table WHERE capability = %s",
108 $capability
109 ) );
110 }
111
112 if ( $capability_id !== null ) {
113 // check if the group itself can
114 $result = ( Groups_Group_Capability::read( $this->group->group_id, $capability_id ) !== false );
115 if ( !$result ) {
116 // find all parent groups and include in the group's
117 // upward hierarchy to see if any of these can
118 $group_ids = array( $this->group->group_id );
119 $iterations = 0;
120 $old_group_ids_count = 0;
121 $all_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $group_table" ) );
122 while( ( $iterations < $all_groups ) && ( count( $group_ids ) !== $old_group_ids_count ) ) {
123 $iterations++;
124 $old_group_ids_count = count( $group_ids );
125 $id_list = implode( ",", $group_ids );
126 $parent_group_ids = $wpdb->get_results(
127 "SELECT parent_id FROM $group_table WHERE parent_id IS NOT NULL AND group_id IN ($id_list)"
128 );
129 if ( $parent_group_ids ) {
130 foreach( $parent_group_ids as $parent_group_id ) {
131 $parent_group_id = Groups_Utility::id( $parent_group_id->parent_id );
132 if ( !in_array( $parent_group_id, $group_ids ) ) {
133 $group_ids[] = $parent_group_id;
134 }
135 }
136 }
137 }
138 if ( count( $group_ids ) > 0 ) {
139 $id_list = implode( ",", $group_ids );
140 $rows = $wpdb->get_results( $wpdb->prepare(
141 "SELECT capability_id FROM $group_capability_table WHERE capability_id = %d AND group_id IN ($id_list)",
142 Groups_Utility::id( $capability_id )
143 ) );
144
145 if ( count( $rows ) > 0 ) {
146 $result = true;
147 }
148 }
149 }
150 }
151 }
152 $result = apply_filters_ref_array( "groups_group_can", array( $result, &$this, $capability ) );
153 return $result;
154 }
155
156 /**
157 * Persist a group.
158 *
159 * Parameters:
160 * - name (required) - the group's name
161 * - creator_id (optional) - defaults to the current user's id
162 * - datetime (optional) - defaults to now
163 * - description (optional)
164 * - parent_id (optional)
165 *
166 * @param array $map attributes
167 * @return group_id on success, otherwise false
168 */
169 public static function create( $map ) {
170 global $wpdb;
171 extract( $map );
172 $result = false;
173 $error = false;
174
175 if ( !empty( $name ) ) {
176
177 $group_table = _groups_get_tablename( "group" );
178
179 $data = array( 'name' => $name );
180 $formats = array( '%s' );
181 if ( !isset( $creator_id ) ) {
182 $creator_id = get_current_user_id();
183 }
184 if ( isset( $creator_id ) ) {
185 $data['creator_id'] = Groups_Utility::id( $creator_id );
186 $formats[] = '%d';
187 }
188 if ( !isset( $datetime ) ) {
189 $datetime = date( 'Y-m-d H:i:s', time() );
190 }
191 if ( isset( $datetime ) ) {
192 $data['datetime'] = $datetime;
193 $formats[] = '%s';
194 }
195 if ( !empty( $description ) ) {
196 $data['description'] = $description;
197 $formats[] = '%s';
198 }
199 if ( !empty( $parent_id ) ) {
200 // only allow to set an existing parent group (that is from the same blog)
201 $parent_group_id = $wpdb->get_var( $wpdb->prepare(
202 "SELECT group_id FROM $group_table WHERE group_id = %d",
203 Groups_Utility::id( $parent_id )
204 ) );
205 if ( $parent_group_id === $parent_id ) {
206 $data['parent_id'] = Groups_Utility::id( $parent_id );
207 $formats[] = '%d';
208 } else {
209 $error = true;
210 }
211 }
212 // no duplicate names
213 $duplicate = Groups_Group::read_by_name( $name );
214 if ( $duplicate ) {
215 $error = true;
216 }
217 if ( !$error ) {
218 if ( $wpdb->insert( $group_table, $data, $formats ) ) {
219 if ( $result = $wpdb->get_var( $wpdb->prepare( "SELECT LAST_INSERT_ID()" ) ) ) {
220 do_action( "groups_created_group", $result );
221 }
222 }
223 }
224 }
225 return $result;
226 }
227
228 /**
229 * Retrieve a group.
230 *
231 * @param int $group_id group's id
232 * @return object upon success, otherwise false
233 */
234 public static function read( $group_id ) {
235 global $wpdb;
236 $result = false;
237
238 $group_table = _groups_get_tablename( 'group' );
239 $group = $wpdb->get_row( $wpdb->prepare(
240 "SELECT * FROM $group_table WHERE group_id = %d",
241 Groups_Utility::id( $group_id )
242 ) );
243 if ( isset( $group->group_id ) ) {
244 $result = $group;
245 }
246 return $result;
247 }
248
249 /**
250 * Retrieve a group by name.
251 *
252 * @param string $name the group's name
253 * @return object upon success, otherwise false
254 */
255 public static function read_by_name( $name ) {
256 global $wpdb;
257 $result = false;
258 $group_table = _groups_get_tablename( 'group' );
259 $group = $wpdb->get_row( $wpdb->prepare(
260 "SELECT * FROM $group_table WHERE name = %s",
261 $name
262 ) );
263 if ( isset( $group->group_id ) ) {
264 $result = $group;
265 }
266 return $result;
267 }
268
269 /**
270 * Update group.
271 *
272 * @param array $map group attribute, must contain group_id
273 * @return group_id on success, otherwise false
274 */
275 public static function update( $map ) {
276
277 global $wpdb;
278 extract( $map );
279 $result = false;
280
281 if ( isset( $group_id ) && !empty( $name ) ) {
282 $group_table = _groups_get_tablename( 'group' );
283 if ( !isset( $description ) || ( $description === null ) ) {
284 $description = '';
285 }
286 $wpdb->query( $wpdb->prepare(
287 "UPDATE $group_table SET name = %s, description = %s WHERE group_id = %d",
288 $name,
289 $description,
290 Groups_Utility::id( $group_id )
291 ) );
292 if ( empty( $parent_id ) ) {
293 $wpdb->query( $wpdb->prepare(
294 "UPDATE $group_table SET parent_id = NULL WHERE group_id = %d",
295 Groups_Utility::id( $group_id )
296 ) );
297 } else {
298
299 // Prohibit circular dependencies:
300 // This group cannot have a parent that is its successor
301 // at any level in its successor hierarchy.
302 // S(g) : successor of group g
303 // S*(g) : successors of group g, any level deep
304 // P(g) : parent of g
305 // ---
306 // It must hold: !( P(g) in S*(g) )
307
308 // Find all successors of this group
309 $groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $group_table" ) );
310 if ( $groups !== null ) {
311 $group_ids = array();
312 $group_ids[] = Groups_Utility::id( $group_id );
313 $iterations = 0;
314 $old_group_ids_count = 0;
315 while( ( $iterations < $groups ) && ( count( $group_ids ) > 0 ) && ( count( $group_ids ) !== $old_group_ids_count ) ) {
316
317 $iterations++;
318 $old_group_ids_count = count( $group_ids );
319
320 $id_list = implode( ",", $group_ids );
321 // We can trust ourselves here, no need to use prepare()
322 // but careful if this query is modified!
323 $successor_group_ids = $wpdb->get_results(
324 "SELECT group_id FROM $group_table WHERE parent_id IS NOT NULL AND parent_id IN ($id_list)"
325 );
326 if ( $successor_group_ids ) {
327 foreach( $successor_group_ids as $successor_group_id ) {
328 $successor_group_id = Groups_Utility::id( $successor_group_id->group_id );
329 if ( !in_array( $successor_group_id, $group_ids ) ) {
330 $group_ids[] = $successor_group_id;
331 }
332 }
333 }
334 }
335 // only add if condition holds
336 if ( !in_array( Groups_Utility::id( $parent_id ), $group_ids ) ) {
337 $wpdb->query( $wpdb->prepare(
338 "UPDATE $group_table SET parent_id = %d WHERE group_id = %d",
339 Groups_Utility::id( $parent_id),
340 Groups_Utility::id( $group_id )
341 ) );
342 }
343 }
344 }
345 $result = $group_id;
346 do_action( "groups_updated_group", $result );
347 }
348 return $result;
349 }
350
351 /**
352 * Remove group and its relations.
353 *
354 * @param int $group_id
355 * @return group_id if successful, false otherwise
356 */
357 public static function delete( $group_id ) {
358
359 global $wpdb;
360 $result = false;
361
362 if ( $group = self::read( $group_id ) ) {
363
364 // delete group-capabilities
365 $group_capability_table = _groups_get_tablename( 'group_capability' );
366 $wpdb->query( $wpdb->prepare(
367 "DELETE FROM $group_capability_table WHERE group_id = %d",
368 Groups_Utility::id( $group->group_id )
369 ) );
370
371 // delete group-users
372 $user_group_table = _groups_get_tablename( 'user_group' );
373 $wpdb->query( $wpdb->prepare(
374 "DELETE FROM $user_group_table WHERE group_id = %d",
375 $group->group_id
376 ) );
377
378 // set parent_id to null where this group is parent
379 $group_table = _groups_get_tablename( 'group' );
380 $wpdb->query( $wpdb->prepare(
381 "UPDATE $group_table SET parent_id = NULL WHERE parent_id = %d",
382 $group->group_id
383 ) );
384
385 // delete group
386 if ( $wpdb->query( $wpdb->prepare(
387 "DELETE FROM $group_table WHERE group_id = %d",
388 $group->group_id
389 ) ) ) {
390 $result = $group->group_id;
391 do_action( "groups_deleted_group", $result );
392 }
393 }
394 return $result;
395 }
396 }