pierre@0
|
1 <?php |
sly@2
|
2 // $Id: ad_owners.module,v 1.1.2.8.2.8 2009/03/31 21:01:31 jeremy Exp $ |
pierre@0
|
3 |
pierre@0
|
4 /** |
pierre@0
|
5 * @file |
pierre@0
|
6 * Enhances the ad module to support ad owners. |
pierre@0
|
7 * |
pierre@1
|
8 * Copyright (c) 2008-2009. |
pierre@0
|
9 * Jeremy Andrews <jeremy@tag1consulting.com>. |
pierre@0
|
10 */ |
pierre@0
|
11 |
pierre@0
|
12 /** |
pierre@0
|
13 * Implementation of hook_theme(). |
pierre@0
|
14 */ |
pierre@0
|
15 function ad_owners_theme() { |
pierre@0
|
16 return array( |
pierre@0
|
17 'ad_owner_permissions_form' => array( |
pierre@0
|
18 'arguments' => array( |
pierre@0
|
19 'form' => NULL, |
pierre@0
|
20 ), |
pierre@0
|
21 ), |
pierre@0
|
22 ); |
pierre@0
|
23 }; |
pierre@0
|
24 |
pierre@0
|
25 /** |
pierre@0
|
26 * Implementation of hook_menu(). |
pierre@0
|
27 */ |
pierre@0
|
28 function ad_owners_menu() { |
pierre@0
|
29 $items = array(); |
pierre@0
|
30 |
pierre@0
|
31 $items['node/%node/adowners'] = array( |
pierre@0
|
32 'title' => 'Ad owners', |
pierre@0
|
33 'page callback' => 'ad_owners_overview', |
pierre@0
|
34 'page arguments' => array(1), |
pierre@0
|
35 'access callback' => 'ad_owners_access', |
pierre@0
|
36 'access arguments' => array(1), |
pierre@0
|
37 'type' => MENU_LOCAL_TASK, |
pierre@0
|
38 'weight' => 5, |
pierre@0
|
39 ); |
pierre@0
|
40 $items['node/%node/adowners/list'] = array( |
pierre@0
|
41 'title' => 'List', |
pierre@1
|
42 'access callback' => 'ad_permission', |
pierre@0
|
43 'access arguments' => array(1, 'manage owners'), |
pierre@0
|
44 'type' => MENU_DEFAULT_LOCAL_TASK, |
pierre@0
|
45 'weight' => 0, |
pierre@0
|
46 ); |
pierre@0
|
47 $items['node/%node/adowners/%user/permissions'] = array( |
pierre@0
|
48 'title callback' => 'owner_permissions_title', |
pierre@0
|
49 'title arguments' => array('!owner' => 3), |
pierre@0
|
50 'page callback' => 'drupal_get_form', |
pierre@0
|
51 'page arguments' => array('ad_owner_permissions_form', 1, 3), |
pierre@1
|
52 'access callback' => 'ad_permission', |
pierre@0
|
53 'access arguments' => array(1, 'manage owners'), |
pierre@0
|
54 'type' => MENU_LOCAL_TASK, |
pierre@0
|
55 'weight' => 2, |
pierre@0
|
56 ); |
pierre@0
|
57 $items['node/%node/adowners/%user/remove'] = array( |
pierre@0
|
58 'title' => 'Remove owner', |
pierre@0
|
59 'page callback' => 'drupal_get_form', |
pierre@0
|
60 'page arguments' => array('ad_owner_remove_form', 1, 3), |
pierre@1
|
61 'access callback' => 'ad_permission', |
pierre@0
|
62 'access arguments' => array(1, 'manage owners'), |
pierre@0
|
63 'type' => MENU_CALLBACK, |
pierre@0
|
64 'weight' => 6, |
pierre@0
|
65 ); |
pierre@0
|
66 $items['node/%node/adowners/add'] = array( |
pierre@0
|
67 'title' => 'Add owner', |
pierre@0
|
68 'page callback' => 'drupal_get_form', |
pierre@0
|
69 'page arguments' => array('ad_owners_add_form', 1), |
pierre@1
|
70 'access callback' => 'ad_permission', |
pierre@0
|
71 'access arguments' => array(1, 'manage owners'), |
pierre@0
|
72 'type' => MENU_LOCAL_TASK, |
pierre@0
|
73 'weight' => 4, |
pierre@0
|
74 ); |
pierre@0
|
75 |
pierre@0
|
76 return $items; |
pierre@0
|
77 } |
pierre@0
|
78 |
pierre@0
|
79 /** |
pierre@1
|
80 * Implementation of hook_perm(). |
pierre@1
|
81 */ |
pierre@1
|
82 function ad_owners_perm() { |
pierre@1
|
83 return array('grant default per ad type permissions'); |
pierre@1
|
84 } |
pierre@1
|
85 |
pierre@1
|
86 /** |
pierre@0
|
87 * Menu item access callback. |
pierre@0
|
88 */ |
pierre@0
|
89 function ad_owners_access($node) { |
pierre@1
|
90 return ($node->type == 'ad') && ad_permission($node->nid, 'manage owners'); |
pierre@0
|
91 } |
pierre@0
|
92 |
pierre@0
|
93 /** |
pierre@0
|
94 * Menu item title callback - use the user name |
pierre@0
|
95 */ |
pierre@0
|
96 function owner_permissions_title($account) { |
pierre@0
|
97 return t('!owner\'s permissions', array('!owner' => $account->name)); |
pierre@0
|
98 } |
pierre@0
|
99 |
pierre@0
|
100 /** |
pierre@1
|
101 * Return array default permissions. |
pierre@1
|
102 */ |
pierre@1
|
103 function ad_owners_default_permissions() { |
pierre@1
|
104 $permissions = module_invoke_all('adapi', 'permissions', NULL); |
pierre@1
|
105 $all = array(); |
pierre@1
|
106 $perms = array(); |
pierre@1
|
107 foreach ($permissions as $permission => $default) { |
pierre@1
|
108 if ($default) { |
pierre@1
|
109 $perms[] = $permission; |
pierre@1
|
110 } |
pierre@1
|
111 $all[] = $permission; |
pierre@1
|
112 } |
pierre@1
|
113 return array('default' => $perms, 'all' => $all); |
pierre@1
|
114 } |
pierre@1
|
115 |
pierre@1
|
116 /** |
pierre@0
|
117 * Implementation of hook_form_alter(). |
pierre@0
|
118 */ |
pierre@0
|
119 function ad_owners_form_alter(&$form, &$form_state, $form_id) { |
pierre@0
|
120 if ($form_id == 'ad_'. arg(4) .'_global_settings' || $form_id == 'ad_no_global_settings') { |
pierre@0
|
121 if (!isset($form['adtype'])) { |
pierre@0
|
122 $form['adtype'] = array('#type' => 'value', '#value' => arg(4)); |
pierre@0
|
123 } |
pierre@1
|
124 |
pierre@1
|
125 $perms = ad_owners_default_permissions(); |
pierre@0
|
126 $form['permissions'] = array( |
pierre@0
|
127 '#type' => 'fieldset', |
pierre@0
|
128 '#title' => t('Permissions'), |
pierre@0
|
129 '#collapsible' => TRUE, |
pierre@1
|
130 '#description' => t('Select which permissions will be automatically granted to new owners of <em>!type</em> advertisements, per role. If a user is a member of multiple roles, he will get all default permissions defined for each role he is a member of.', array('!type' => ad_get_types('name', arg(4)))), |
pierre@0
|
131 ); |
pierre@1
|
132 |
pierre@1
|
133 $roles = user_roles(TRUE); |
pierre@1
|
134 foreach ($roles as $rid => $role) { |
pierre@1
|
135 $defaults = variable_get("ad_default_permissions_{$rid}_". $form['adtype']['#value'], $perms['default']); |
pierre@1
|
136 $form['permissions']["role-$rid"] = array( |
pierre@1
|
137 '#type' => 'fieldset', |
pierre@1
|
138 '#title' => $role, |
pierre@1
|
139 '#collapsible' => TRUE, |
pierre@1
|
140 '#collapsed' => TRUE, |
pierre@1
|
141 ); |
pierre@1
|
142 $form['permissions']["role-$rid"]["default_permissions_$rid"] = array( |
pierre@1
|
143 '#type' => 'checkboxes', |
pierre@1
|
144 '#title' => t('Default permissions for users in the <em>!role</em> role', array('!role' => $role)), |
pierre@1
|
145 '#options' => drupal_map_assoc($perms['all']), |
pierre@1
|
146 '#default_value' => $defaults, |
pierre@1
|
147 ); |
pierre@1
|
148 } |
pierre@0
|
149 if (isset($form['save'])) { |
pierre@0
|
150 $form['save']['#weight'] = 10; |
pierre@0
|
151 } |
pierre@0
|
152 if (isset($form['#submit']) && is_array($form['#submit'])) { |
pierre@1
|
153 $form['#submit'] = array_merge(array('ad_owners_settings_submit'), $form['#submit']); |
pierre@0
|
154 } |
pierre@0
|
155 else { |
pierre@1
|
156 $form['#submit'] = array('ad_owners_settings_submit'); |
pierre@0
|
157 } |
pierre@0
|
158 } |
pierre@0
|
159 } |
pierre@0
|
160 |
pierre@0
|
161 /** |
pierre@1
|
162 * Submit handler for global settings of all ad types. |
pierre@1
|
163 * @see ad_form_alter() |
pierre@1
|
164 */ |
pierre@1
|
165 function ad_owners_settings_submit($form, $form_state) { |
pierre@1
|
166 $roles = user_roles(TRUE); |
pierre@1
|
167 foreach ($roles as $rid => $role) { |
pierre@1
|
168 variable_set("ad_default_permissions_{$rid}_". $form_state['values']['adtype'], $form_state['values']["default_permissions_$rid"]); |
pierre@1
|
169 unset($form_state['values']["default_permissions_$rid"]); |
pierre@1
|
170 } |
pierre@1
|
171 unset($form_state['values']['adtype']); |
pierre@1
|
172 } |
pierre@1
|
173 |
pierre@1
|
174 /** |
pierre@0
|
175 * Implementation of hook_nodeapi(). |
pierre@0
|
176 */ |
pierre@0
|
177 function ad_owners_nodeapi(&$node, $op, $teaser, $page) { |
pierre@0
|
178 global $user; |
pierre@0
|
179 |
pierre@0
|
180 switch ($op) { |
pierre@0
|
181 case 'insert': |
pierre@0
|
182 case 'update': |
pierre@0
|
183 if (isset($node->adtype)) { |
pierre@0
|
184 // Be sure ad owner has at least default ad permissions. |
pierre@0
|
185 ad_owners_add($node, $node->uid); |
pierre@1
|
186 ad_owners_create_hostid($node->uid); |
pierre@0
|
187 } |
pierre@0
|
188 break; |
pierre@0
|
189 case 'delete': |
pierre@0
|
190 // Clean up ad_permissions and any other per-ad tables. |
pierre@0
|
191 $result = db_query('SELECT oid, uid FROM {ad_owners} WHERE aid = %d', $node->nid); |
pierre@0
|
192 while ($id = db_fetch_object($result)) { |
pierre@0
|
193 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $id->oid); |
pierre@0
|
194 $owner = user_load(array('uid' => $id->uid)); |
pierre@0
|
195 // Tell plug-in modules to clean up. |
pierre@0
|
196 module_invoke_all('adowners', 'remove', $id->oid, $owner); |
pierre@0
|
197 } |
pierre@0
|
198 db_query('DELETE FROM {ad_owners} WHERE aid = %d', $node->nid); |
pierre@0
|
199 break; |
pierre@0
|
200 } |
pierre@0
|
201 } |
pierre@0
|
202 |
pierre@0
|
203 /** |
pierre@0
|
204 * Implementation of hook_adapi(). |
pierre@0
|
205 */ |
pierre@0
|
206 function ad_owners_adapi($op, $node = NULL) { |
pierre@0
|
207 switch ($op) { |
pierre@0
|
208 case 'permissions': |
pierre@1
|
209 return array('manage owners' => FALSE); |
pierre@0
|
210 break; |
pierre@0
|
211 } |
pierre@0
|
212 } |
pierre@0
|
213 |
pierre@0
|
214 /** |
pierre@0
|
215 * Determine whether the ad owner has a given privilege. |
pierre@0
|
216 * |
pierre@0
|
217 * @param $ad |
pierre@0
|
218 * Node object or aid of advertisement. |
pierre@0
|
219 * @param $permission |
pierre@0
|
220 * Special Ad owners permission which should be checked (such as 'manage owners') |
pierre@0
|
221 * @param $account |
pierre@0
|
222 * User object, which are accessing the ad or current user by default. |
pierre@0
|
223 */ |
pierre@0
|
224 function ad_owners_adaccess($ad, $permission, $account = NULL) { |
pierre@0
|
225 global $user; |
pierre@0
|
226 static $permissions = array(); |
pierre@0
|
227 |
pierre@0
|
228 if (!isset($account)) { |
pierre@0
|
229 $account = $user; |
pierre@0
|
230 } |
pierre@0
|
231 |
pierre@0
|
232 $aid = 0; |
pierre@0
|
233 if (isset($ad)) { |
pierre@0
|
234 if (is_numeric($ad)) { |
pierre@0
|
235 $aid = $ad; |
pierre@0
|
236 } |
pierre@0
|
237 else if (is_object($ad) && isset($ad->nid)) { |
pierre@0
|
238 $aid = $ad->nid; |
pierre@0
|
239 } |
pierre@0
|
240 } |
pierre@0
|
241 |
pierre@0
|
242 if (!isset($permissions[$aid][$account->uid])) { |
pierre@0
|
243 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $aid, $account->uid)); |
pierre@0
|
244 $permissions[$aid][$account->uid] = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); |
pierre@0
|
245 } |
pierre@0
|
246 $access = ''; |
pierre@0
|
247 if (is_array($permission)) { |
pierre@0
|
248 foreach ($permission as $perm) { |
pierre@0
|
249 $access |= in_array($perm, $permissions[$aid][$account->uid]); |
pierre@0
|
250 } |
pierre@0
|
251 } |
pierre@0
|
252 else { |
pierre@0
|
253 $access = in_array($permission, $permissions[$aid][$account->uid]); |
pierre@0
|
254 } |
pierre@0
|
255 |
pierre@0
|
256 return $access; |
pierre@0
|
257 } |
pierre@0
|
258 |
pierre@0
|
259 |
pierre@0
|
260 /** |
pierre@0
|
261 * TODO: Make this themeable. |
pierre@0
|
262 * TODO: Group permissions by module. |
pierre@0
|
263 * TODO: Allow modules to define default value for permission. |
pierre@0
|
264 */ |
pierre@0
|
265 function ad_owners_overview($node) { |
pierre@0
|
266 drupal_set_title(t('Ad owners')); |
pierre@0
|
267 |
pierre@0
|
268 // Be sure the node owner is listed as an ad owner |
pierre@0
|
269 if (!db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $node->uid, $node->nid))) { |
pierre@0
|
270 ad_owners_add($node, $node->uid); |
pierre@0
|
271 } |
pierre@0
|
272 |
pierre@0
|
273 $header = array( |
pierre@0
|
274 array('data' => t('Username'), 'field' => 'uid'), |
pierre@0
|
275 array('data' => t('Options')), |
pierre@0
|
276 ); |
pierre@0
|
277 |
pierre@0
|
278 $sql = "SELECT a.uid, u.name FROM {ad_owners} a INNER JOIN {users} u ON a.uid = u.uid WHERE aid = %d"; |
pierre@0
|
279 $sql .= tablesort_sql($header); |
pierre@0
|
280 $result = pager_query($sql, 25, 0, NULL, $node->nid); |
pierre@0
|
281 |
pierre@0
|
282 $rows = array(); |
pierre@0
|
283 while ($owner = db_fetch_object($result)) { |
pierre@0
|
284 $row = array(); |
pierre@0
|
285 $row[] = $owner->name; |
pierre@0
|
286 $options = array(); |
pierre@0
|
287 // first option is 'permissions', plug-ins come afterwards |
pierre@0
|
288 $options[] = l(t('permissions'), 'node/'. $node->nid .'/adowners/'. $owner->uid .'/permissions'); |
pierre@0
|
289 $options = array_merge($options, module_invoke_all('adowners', 'overview', $node->nid, $owner->uid)); |
pierre@0
|
290 // node owner has to remain an ad owner |
pierre@0
|
291 if ($node->uid != $owner->uid) { |
pierre@0
|
292 $options[] = l(t('remove'), 'node/'. $node->nid .'/adowners/'. $owner->uid .'/remove'); |
pierre@0
|
293 } |
pierre@0
|
294 $options = implode(' | ', $options); |
pierre@0
|
295 $row[] = $options; |
pierre@0
|
296 $rows[] = $row; |
pierre@0
|
297 } |
pierre@0
|
298 |
pierre@0
|
299 $output = theme('table', $header, $rows); |
pierre@0
|
300 $output .= theme('pager', NULL, 25, 0); |
pierre@0
|
301 |
pierre@0
|
302 return $output; |
pierre@0
|
303 } |
pierre@0
|
304 |
pierre@0
|
305 /** |
pierre@0
|
306 * A simple form for adding new users as owners of ads. |
pierre@0
|
307 */ |
pierre@0
|
308 function ad_owners_add_form($form_state, $node) { |
pierre@0
|
309 $form = array(); |
pierre@0
|
310 drupal_set_title(t('Add owner')); |
pierre@0
|
311 |
pierre@0
|
312 $form['aid'] = array( |
pierre@0
|
313 '#type' => 'value', |
pierre@0
|
314 '#value' => $node->nid, |
pierre@0
|
315 ); |
pierre@0
|
316 $form['username'] = array( |
pierre@0
|
317 '#autocomplete_path' => 'user/autocomplete', |
pierre@0
|
318 '#description' => t('Enter the username of the user who should have ownership permissions on this advertisement.'), |
pierre@0
|
319 '#required' => TRUE, |
pierre@0
|
320 '#type' => 'textfield', |
pierre@0
|
321 '#title' => t('Username'), |
pierre@0
|
322 ); |
pierre@0
|
323 $form['save'] = array( |
pierre@0
|
324 '#type' => 'submit', |
pierre@0
|
325 '#value' => t('Add owner'), |
pierre@0
|
326 ); |
pierre@0
|
327 |
pierre@0
|
328 return $form; |
pierre@0
|
329 } |
pierre@0
|
330 |
pierre@0
|
331 function ad_owners_add_form_validate($form, &$form_state) { |
pierre@0
|
332 $owner = user_load(array('name' => $form_state['values']['username'])); |
pierre@0
|
333 if (!is_object($owner)) { |
pierre@0
|
334 form_set_error('username', t('The specified username %username does not exist.', array('%username' => $form_state['values']['username']))); |
pierre@0
|
335 } |
pierre@0
|
336 else if (db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $owner->uid, $form_state['values']['aid']))) { |
pierre@0
|
337 form_set_error('username', t('The specified user %username is already an owner of this ad.', array('%username' => $form_state['values']['username']))); |
pierre@0
|
338 } |
pierre@0
|
339 else if (!user_access('edit own advertisements', $owner) && |
pierre@0
|
340 !user_access('administer advertisements', $owner)) { |
pierre@0
|
341 form_set_error('username', t('The specified user %username does not have <em>edit own advertisements</em> nor <em>administer advertisements</em> permissions. The user must be !assigned to a !role with these privileges before you can add them as an ad owner.', array('%username' => $form_state['values']['username'], '!assigned' => l(t('assigned'), "user/$owner->uid/edit"), '!role' => l(t('role'), 'admin/user/permissions')))); |
pierre@0
|
342 } |
pierre@0
|
343 module_invoke_all('adowners', 'validate', $owner, $form_state['values']['aid']); |
pierre@0
|
344 } |
pierre@0
|
345 |
pierre@0
|
346 function ad_owners_add_form_submit($form, &$form_state) { |
pierre@0
|
347 $owner = user_load(array('name' => $form_state['values']['username'])); |
pierre@0
|
348 $node = node_load($form_state['values']['aid']); |
pierre@0
|
349 if (!(ad_owners_add($node, $owner->uid))) { |
pierre@0
|
350 form_set_error('username', t('The user is already an owner of the ad.')); |
pierre@0
|
351 } |
pierre@0
|
352 else { |
pierre@0
|
353 drupal_set_message(t('The user %username has been added as an owner of this advertisement.', array('%username' => $form_state['values']['username']))); |
pierre@0
|
354 drupal_goto('node/'. $form_state['values']['aid'] .'/adowners/'. $owner->uid .'/permissions'); |
pierre@0
|
355 } |
pierre@0
|
356 } |
pierre@0
|
357 |
pierre@1
|
358 function is_ad_owner($aid, $account = NULL) { |
pierre@0
|
359 global $user; |
pierre@0
|
360 if (!isset($account)) { |
pierre@0
|
361 $account = $user; |
pierre@0
|
362 } |
pierre@0
|
363 if (db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $account->uid, $aid))) { |
pierre@0
|
364 return 1; |
pierre@0
|
365 } |
pierre@0
|
366 else { |
pierre@0
|
367 return 0; |
pierre@0
|
368 } |
pierre@0
|
369 } |
pierre@0
|
370 |
pierre@0
|
371 /** |
pierre@0
|
372 * Add an owner to an ad. |
pierre@0
|
373 */ |
pierre@0
|
374 function ad_owners_add($node, $owner, $permissions = array()) { |
pierre@0
|
375 $rc = 0; |
pierre@0
|
376 $uid = is_numeric($owner) ? $owner : $owner->uid; |
pierre@0
|
377 if (!db_result(db_query('SELECT oid FROM {ad_owners} WHERE aid = %d AND uid = %d', $node->nid, $uid))) { |
pierre@0
|
378 db_query('INSERT INTO {ad_owners} (aid, uid) VALUES(%d, %d)', $node->nid, $uid); |
pierre@0
|
379 $rc = db_affected_rows() ? 1 : 0; |
pierre@0
|
380 |
pierre@1
|
381 if (empty($permissions)) { |
pierre@1
|
382 // build permissions array from defaults |
pierre@1
|
383 $perms = ad_owners_default_permissions(); |
pierre@1
|
384 $owner = user_load($uid); |
pierre@1
|
385 if (is_array($owner->roles)) { |
pierre@1
|
386 foreach ($owner->roles as $rid => $role) { |
pierre@1
|
387 $default = variable_get("ad_default_permissions_{$rid}_". $node->adtype, $perms['default']); |
pierre@1
|
388 $new = array(); |
pierre@1
|
389 foreach ($default as $key => $value) { |
pierre@1
|
390 if ($value) { |
pierre@1
|
391 $new[] = $value; |
pierre@1
|
392 } |
pierre@1
|
393 } |
pierre@1
|
394 $permissions = $permissions + $new; |
pierre@1
|
395 } |
pierre@1
|
396 } |
pierre@0
|
397 } |
pierre@0
|
398 |
pierre@0
|
399 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $uid)); |
pierre@0
|
400 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $oid); |
pierre@0
|
401 db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $oid, implode('|,|', $permissions)); |
pierre@0
|
402 module_invoke_all('adowners', 'add', $node, array('oid' => $oid, 'uid' => $uid, 'aid' => $node->nid)); |
pierre@0
|
403 } |
pierre@0
|
404 return $rc; |
pierre@0
|
405 } |
pierre@0
|
406 |
pierre@0
|
407 /** |
pierre@0
|
408 * Create a unique host id for each ad owner, used when displaying ads remotely. |
pierre@0
|
409 */ |
pierre@1
|
410 function ad_owners_create_hostid($uid) { |
pierre@0
|
411 $hostid = db_result(db_query('SELECT hostid FROM {ad_hosts} WHERE uid = %d', $uid)); |
pierre@0
|
412 if (!$hostid) { |
pierre@0
|
413 $hostid = md5($uid . time()); |
pierre@0
|
414 db_query("INSERT INTO {ad_hosts} (uid, hostid) VALUES (%d, '%s')", $uid, md5($uid . time())); |
pierre@0
|
415 } |
pierre@0
|
416 |
pierre@0
|
417 return $hostid; |
pierre@0
|
418 } |
pierre@0
|
419 |
pierre@0
|
420 /** |
pierre@0
|
421 * Removes ad owner from an ad. |
pierre@0
|
422 */ |
pierre@0
|
423 function ad_owner_remove_form($form_state, $node, $owner) { |
pierre@0
|
424 $form['aid'] = array( |
pierre@0
|
425 '#type' => 'value', |
pierre@0
|
426 '#value' => $node->nid, |
pierre@0
|
427 ); |
pierre@0
|
428 $form['uid'] = array( |
pierre@0
|
429 '#type' => 'value', |
pierre@0
|
430 '#value' => $owner->uid, |
pierre@0
|
431 ); |
pierre@0
|
432 |
pierre@0
|
433 return confirm_form($form, |
pierre@0
|
434 t('Are you sure you want to remove user %name as an owner of this advertisement?', array('%name' => $owner->name)), |
pierre@1
|
435 "node/$node->nid/adowners", |
pierre@0
|
436 t('This action cannot be undone.'), |
pierre@0
|
437 t('Remove'), |
pierre@0
|
438 t('Cancel') |
pierre@0
|
439 ); |
pierre@0
|
440 } |
pierre@0
|
441 |
pierre@0
|
442 /** |
pierre@0
|
443 * Don't allow the removal of the primary owner of the advertisement. |
pierre@0
|
444 */ |
pierre@0
|
445 function ad_owner_remove_form_validate($form, &$form_state) { |
pierre@0
|
446 $node = node_load($form_state['values']['aid']); |
pierre@0
|
447 if ($node->uid == $form_state['values']['uid']) { |
pierre@0
|
448 $owner = user_load(array('uid' => $form_state['values']['uid'])); |
pierre@0
|
449 drupal_set_message(t('%name is the primary owner of this advertisement. You cannot remove the primary owner.', array('%name' => $owner->name)), 'error'); |
pierre@0
|
450 |
pierre@0
|
451 $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; |
pierre@0
|
452 } |
pierre@0
|
453 } |
pierre@0
|
454 |
pierre@0
|
455 /** |
pierre@0
|
456 * Remove the ad owner, and all associated permissions. |
pierre@0
|
457 */ |
pierre@0
|
458 function ad_owner_remove_form_submit($form, &$form_state) { |
pierre@0
|
459 $oid = db_result(db_query('SELECT oid FROM {ad_owners} WHERE aid = %d AND uid = %d', $form_state['values']['aid'], $form_state['values']['uid'])); |
pierre@0
|
460 db_query('DELETE FROM {ad_owners} WHERE oid = %d', $oid); |
pierre@0
|
461 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $oid); |
pierre@0
|
462 $owner = user_load(array('uid' => $form_state['values']['uid'])); |
pierre@0
|
463 module_invoke_all('adowners', 'remove', $oid, $owner); |
pierre@0
|
464 drupal_set_message(t('The ad owner %name has been removed.', array('%name' => $owner->name))); |
pierre@0
|
465 |
pierre@0
|
466 $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; |
pierre@0
|
467 } |
pierre@0
|
468 |
pierre@0
|
469 |
pierre@0
|
470 /** |
pierre@0
|
471 * Display a form with all available permissions and their status for the |
pierre@0
|
472 * selected ad and ad owner. |
pierre@0
|
473 */ |
pierre@0
|
474 function ad_owner_permissions_form($form_state, $node, $user) { |
pierre@0
|
475 drupal_set_title(t('Permissions')); |
pierre@0
|
476 |
pierre@0
|
477 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $user->uid)); |
pierre@0
|
478 $granted = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); |
pierre@0
|
479 |
pierre@0
|
480 $form['header'] = array( |
pierre@0
|
481 '#type' => 'value', |
pierre@1
|
482 '#value' => array(t('permission'), t('granted')) |
pierre@0
|
483 ); |
pierre@0
|
484 |
pierre@0
|
485 $rows = array(); |
pierre@0
|
486 |
pierre@0
|
487 $permissions = module_invoke_all('adapi', 'permissions', $node); |
pierre@1
|
488 foreach ($permissions as $permission => $default) { |
pierre@0
|
489 $form['permission'][$permission] = array( |
pierre@0
|
490 '#value' => t($permission), |
pierre@0
|
491 ); |
pierre@0
|
492 $form['grant'][str_replace(' ', '_', $permission)] = array( |
pierre@0
|
493 '#type' => 'checkbox', |
pierre@0
|
494 '#default_value' => in_array($permission, $granted) ? 1 : 0, |
pierre@0
|
495 ); |
pierre@0
|
496 } |
pierre@0
|
497 |
pierre@0
|
498 $form['oid'] = array( |
pierre@0
|
499 '#type' => 'hidden', |
pierre@0
|
500 '#value' => $oid, |
pierre@0
|
501 ); |
pierre@0
|
502 |
pierre@0
|
503 $form['aid'] = array( |
pierre@0
|
504 '#type' => 'hidden', |
pierre@0
|
505 '#value' => $node->nid, |
pierre@0
|
506 ); |
pierre@0
|
507 |
pierre@0
|
508 $form['uid'] = array( |
pierre@0
|
509 '#type' => 'hidden', |
pierre@0
|
510 '#value' => $user->uid, |
pierre@0
|
511 ); |
pierre@0
|
512 |
pierre@0
|
513 $form['submit'] = array( |
pierre@0
|
514 '#type' => 'submit', |
pierre@0
|
515 '#value' => t('Save'), |
pierre@0
|
516 ); |
pierre@0
|
517 |
pierre@0
|
518 return $form; |
pierre@0
|
519 } |
pierre@0
|
520 |
pierre@0
|
521 /** |
pierre@0
|
522 * Display ad owner permissions in a simple table. |
pierre@0
|
523 */ |
pierre@0
|
524 function theme_ad_owner_permissions_form($form) { |
pierre@0
|
525 $output = drupal_render($form['options']); |
pierre@0
|
526 foreach (element_children($form['permission']) as $key) { |
pierre@0
|
527 $row = array(); |
pierre@0
|
528 $row[] = drupal_render($form['permission'][$key]); |
pierre@0
|
529 $row[] = drupal_render($form['grant'][str_replace(' ', '_', $key)]); |
pierre@0
|
530 $rows[] = $row; |
pierre@0
|
531 } |
pierre@0
|
532 |
pierre@0
|
533 $output = theme('table', $form['header']['#value'], $rows); |
pierre@0
|
534 $output .= drupal_render($form); |
pierre@0
|
535 return $output; |
pierre@0
|
536 } |
pierre@0
|
537 |
pierre@0
|
538 /** |
pierre@0
|
539 * Store the ad owner's updated permissions in the ad_permissions table. |
pierre@0
|
540 */ |
pierre@0
|
541 function ad_owner_permissions_form_submit($form, &$form_state) { |
pierre@0
|
542 $permissions = module_invoke_all('adapi', 'permissions', array()); |
pierre@0
|
543 $perms = array(); |
pierre@1
|
544 foreach ($permissions as $permission => $default) { |
pierre@0
|
545 $perm = str_replace(' ', '_', $permission); |
pierre@0
|
546 if (isset($form_state['values'][$perm]) && $form_state['values'][$perm] > 0) { |
pierre@0
|
547 $perms[] = $permission; |
pierre@0
|
548 } |
pierre@0
|
549 } |
pierre@0
|
550 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $form_state['values']['oid']); |
pierre@0
|
551 db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $form_state['values']['oid'], implode('|,|', $perms)); |
pierre@0
|
552 |
pierre@0
|
553 drupal_set_message(t('The permissions have been saved.')); |
pierre@0
|
554 $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; |
pierre@0
|
555 } |
pierre@1
|
556 |
pierre@1
|
557 /** |
pierre@1
|
558 * Determine whether the user has a given privilege. |
pierre@1
|
559 */ |
pierre@1
|
560 function ad_owners_permission($aid, $string, $account) { |
pierre@1
|
561 static $permissions = array(); |
pierre@1
|
562 |
sly@2
|
563 if (!isset($permissions[$aid]) || !isset($permissions[$aid][$account->uid])) { |
pierre@1
|
564 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $aid, $account->uid)); |
pierre@1
|
565 if ($oid) { |
pierre@1
|
566 $permissions[$aid][$account->uid] = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); |
pierre@1
|
567 } |
pierre@1
|
568 else { |
pierre@1
|
569 $account = user_load($account->uid); |
pierre@1
|
570 if (user_access('grant default per ad type permissions')) { |
pierre@1
|
571 $perms = ad_owners_default_permissions(); |
pierre@1
|
572 $permissions[$aid][$account->uid] = $perms['default']; |
pierre@1
|
573 } |
sly@2
|
574 else { |
sly@2
|
575 $permissions[$aid][$account->uid] = array(); |
sly@2
|
576 } |
pierre@1
|
577 } |
pierre@1
|
578 } |
pierre@1
|
579 |
pierre@1
|
580 return (in_array("$string", $permissions[$aid][$account->uid])); |
pierre@1
|
581 } |