PluginProbe
Groups – Memberships and Access Control / 1.1.4
Groups – Memberships and Access Control v1.1.4
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.4, at lib/core/class-groups-group.php

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