/[drupal]/contributions/modules/membership/membership.module
ViewVC logotype

Contents of /contributions/modules/membership/membership.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download) (as text)
Wed Feb 20 20:01:15 2008 UTC (21 months, 1 week ago) by boobaa
Branch: MAIN
CVS Tags: DRUPAL-6--1-0, HEAD
Branch point for: DRUPAL-6--1
Changes since 1.1: +213 -183 lines
File MIME type: text/x-php
update for drupal6
1 <?php
2 // $Id: membership.module,v 1.1 2008/02/17 16:50:46 boobaa Exp $
3
4 /**
5 * @file
6 * Provides easy time-limited membership management.
7 */
8
9 /**
10 * Implementation of hook_help().
11 */
12 function membership_help($path, $arg) {
13 $output = '';
14 switch($path) {
15 case 'admin/help#membership':
16 $output = '<p>'. t('Provides easy time-limited membership management.') . '</p>';
17 break;
18 }
19 return $output;
20 }
21
22 /**
23 * Implementation of hook_menu()
24 */
25 function membership_menu() {
26 $items = array();
27 $items['admin/settings/membership'] = array(
28 'title' => t('Membership management'),
29 'description' => t('Configure time-limited membership management.'),
30 'page callback' => 'drupal_get_form',
31 'page arguments' => array('membership_admin_settings'),
32 'access arguments' => array('administer membership'),
33 'type' => MENU_NORMAL_ITEM,
34 );
35 $items['admin/user/membership'] = array(
36 'title' => t('Membership management'),
37 'description' => t('Easy time-limited membership management.'),
38 'page callback' => 'membership_edit',
39 'access arguments' => array('access membership'),
40 'type' => MENU_NORMAL_ITEM,
41 );
42 return $items;
43 }
44
45 /**
46 * Implementation of hook_perm()
47 */
48 function membership_perm() {
49 return array('access membership', 'administer membership');
50 }
51
52 function membership_list_form() {
53 $pagelen = 25;
54 $header = array(
55 array('data' => t('Username'), 'field' => 'name'),
56 array('data' => t('Last modified'), 'field' => 'lastmod'),
57 array('data' => t('Expires'), 'field' => 'expires'),
58 t('Operations'),
59 );
60 $sql = 'SELECT u.uid AS uid, name, lastmod, expires FROM {membership} AS m INNER JOIN {users} AS u ON u.uid = m.uid';
61 $sql .= tablesort_sql($header);
62 $result = pager_query($sql, $pagelen, 0, NULL);
63 $form = array();
64 while($user = db_fetch_object($result)) {
65 $form['name'][$user->uid] = array('#value' => theme('username', $user));
66 $form['lastmod'][$user->uid] = array('#value' => format_date($user->lastmod, 'custom', t('Y-m-d')));
67 $form['expires'][$user->uid] = array('#value' => format_date($user->expires, 'custom', t('Y-m-d')));
68 $form['expire_now'][$user->uid] = array('#value' => l(t('Expire now'), 'admin/user/membership/expire/' . $user->uid) . ' - '.
69 l(t('Edit membership'), 'admin/user/membership/edit/' . $user->uid));
70 }
71 if($form['name']) {
72 $form['pager'] = array('#value' => theme('pager', NULL, $pagelen, 0));
73 }
74 $form['newmember'] = array(
75 '#type' => 'fieldset',
76 '#title' => t('Add a new member'),
77 '#tree' => TRUE,
78 '#collapsible' => TRUE,
79 );
80 $form['newmember']['member'] = array(
81 '#type' => 'textfield',
82 '#title' => t('New member'),
83 '#autocomplete_path' => 'user/autocomplete',
84 );
85 $form['newmember']['expires'] = array(
86 '#type' => 'date',
87 '#title' => t('Expires'),
88 '#default_value' => array( // XXX: is there any nicer way to set it to "tomorrow"?
89 'year' => date('Y',strtotime('now') + 60*60*24),
90 'month' => date('n',strtotime('now') + 60*60*24),
91 'day' => date('j',strtotime('now') + 60*60*24),
92 ),
93 );
94 $form['newmember']['submit'] = array(
95 '#type' => 'submit',
96 '#value' => t('Save'),
97 '#weight' => 1,
98 );
99 return $form;
100 }
101
102 function membership_list_form_validate($form_id, &$form_state) {
103 if(empty($form_state['values']['newmember']['member'])) {
104 form_set_error('newmember][member', t('A username must be given.'));
105 }
106 else {
107 // FIXME: user_load() wouldn't be better?
108 $user = db_fetch_object(db_query("SELECT uid FROM {users} WHERE name = '%s'", $form_state['values']['newmember']['member']));
109 if($user) {
110 $roles = user_roles(TRUE); // XXX: wouldn't it be faster without TRUE?
111 $result = db_fetch_object(db_query("SELECT COUNT(mid) AS mid_cnt FROM {membership} WHERE uid = %d", $user->uid));
112 if($result->mid_cnt > 0) {
113 form_set_error('newmember][member', t('This user is already a member of the %role role.',
114 array('%role' => $roles[variable_get('membership_role', 0)])));
115 }
116 }
117 else {
118 form_set_error('newmember][member', t('Nonexistent username.'));
119 }
120 }
121 $form_time = strtotime($form_state['values']['newmember']['expires']['year'] . '-'.
122 $form_state['values']['newmember']['expires']['month'] . '-' . $form_state['values']['newmember']['expires']['day']);
123 $sys_time = strtotime(date('Y-n-j'));
124 if($form_time < ($sys_time + 60*60*24)) {
125 form_set_error('newmember][expires][year', t('Expires should be in the future.'));
126 // XXX: form_set_error DOES NOT set error on all the children of newmember][expires - so we must use this hack :S
127 form_set_error('newmember][expires][month', ' ');
128 form_set_error('newmember][expires][day', ' ');
129 }
130 }
131
132 function membership_list_form_submit($form_id, &$form_state) {
133 global $user;
134 $role = variable_get('membership_role', 0);
135 $member = user_load(array('name' => $form_state['values']['newmember']['member']));
136 $datestamp = mktime(0, 0, 0, $form_state['values']['newmember']['expires']['month'], $form_state['values']['newmember']['expires']['day'],
137 $form_state['values']['newmember']['expires']['year']);
138 db_query('INSERT INTO {membership} (uid, oid, lastmod, expires) VALUES (%d, %d, %d, %d)', $member->uid, $user->uid, mktime(),
139 $datestamp);
140 db_query('INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $member->uid, $role);
141 $roles = user_roles(TRUE); // XXX: wouldn't it be faster without TRUE?
142 $params['variables'] = array(
143 '!member' => $form_state['values']['newmember']['member'],
144 '!role' => $roles[$role],
145 '!expire' => format_date($datestamp, 'custom', t('Y-m-d')),
146 '!owner' => $user->name,
147 );
148 // send a mail to the new member
149 $params['account'] = $member;
150 drupal_mail('membership', 'member_add', $member->mail, user_preferred_language($member), $params);
151 // send a mail to the manager (if exists)
152 if(($uid = variable_get('membership_manager', 0)) != 0) {
153 $manager = user_load(array('uid' => $uid));
154 $params['account'] = $manager;
155 drupal_mail('membership', 'managed_add', $manager->mail, user_preferred_language($manager), $params);
156 }
157 }
158
159 /**
160 * Implementation of hook_theme().
161 */
162 function membership_theme() {
163 return array(
164 'membership_list_form' => array(
165 'arguments' => array('form' => NULL),
166 ),
167 );
168 }
169
170 function theme_membership_list_form($form) {
171 $header = array(
172 array('data' => t('Username'), 'field' => 'name'),
173 array('data' => t('Last modified'), 'field' => 'lastmod'),
174 array('data' => t('Expires'), 'field' => 'expires'),
175 t('Operations'),
176 );
177 if(isset($form['name']) && is_array($form['name'])) {
178 foreach(element_children($form['name']) as $key) {
179 $rows[] = array(
180 drupal_render($form['name'][$key]),
181 drupal_render($form['lastmod'][$key]),
182 drupal_render($form['expires'][$key]),
183 drupal_render($form['expire_now'][$key]),
184 );
185 }
186 }
187 else {
188 $rows[] = array(array('data' => t('There are no members.'), 'colspan' => '4'));
189 }
190 $output = theme('table', $header, $rows);
191 if($form['pager']['#value']) {
192 $output .= drupal_render($form['pager']);
193 }
194 $output .= drupal_render($form);
195 return $output;
196 }
197
198 function membership_expire($uid) {
199 global $user;
200 $member = user_load(array('uid' => $uid));
201 $role = variable_get('membership_role', 0);
202 $roles = user_roles(TRUE); // XXX: wouldn't it be faster without TRUE?
203 $params['variables'] = array(
204 '!member' => check_plain($member->name),
205 '!role' => $roles[$role],
206 '!owner' => $user->name,
207 );
208 // send a mail to the ex-member
209 $params['account'] = $member;
210 drupal_mail('membership', 'member_del', $member->mail, user_preferred_language($member), $params);
211 // send a mail to the manager (if exists)
212 if(($manager_uid = variable_get('membership_manager', 0)) != 0) {
213 $manager = user_load(array('uid' => $manager_uid));
214 $params['account'] = $manager;
215 drupal_mail('membership', 'managed_del', $manager->mail, user_preferred_language($manager), $params);
216 }
217 // mail should be sent before delete, as we need some info for it
218 db_query('DELETE FROM {membership} WHERE uid = %d', $uid);
219 db_query('DELETE FROM {users_roles} WHERE uid = %d AND rid = %d', $uid, $role);
220 }
221
222 function membership_edit_form() {
223 $uid = arg(4);
224 $result = db_query('SELECT expires FROM {membership} WHERE uid = %d', $uid);
225 $member = db_fetch_object($result);
226 if(!$member) {
227 drupal_set_message(t('There is no such member.'), 'error');
228 drupal_goto('admin/user/membership');
229 }
230 $user = user_load(array('uid' => $uid));
231 $form = array();
232 $form['expires'] = array(
233 '#type' => 'date',
234 '#title' => t('Expire date of !member', array('!member' => theme('username', $user))),
235 '#default_value' => array(
236 'year' => date('Y', $member->expires),
237 'month' => date('n', $member->expires),
238 'day' => date('j', $member->expires),
239 ),
240 '#required' => TRUE,
241 );
242 $form['submit'] = array(
243 '#type' => 'submit',
244 '#value' => t('Save'),
245 );
246 return $form;
247 }
248
249 function membership_edit_form_validate($form_id, &$form_state) {
250 $form_time = strtotime($form_state['values']['expires']['year'] . '-' . $form_state['values']['expires']['month'] . '-'.
251 $form_state['values']['expires']['day']);
252 $sys_time = strtotime(date('Y-n-j'));
253 if($form_time < ($sys_time + 60*60*24)) {
254 form_set_error('expires', t('Expires should be in the future.'));
255 }
256 }
257
258 function membership_edit_form_submit($form_id, &$form_state) {
259 global $user;
260 $datestamp = mktime(0, 0, 0, $form_state['values']['expires']['month'], $form_state['values']['expires']['day'],
261 $form_state['values']['expires']['year']);
262 db_query('UPDATE {membership} SET oid = %d, lastmod = %d, expires = %d WHERE uid = %d', $user->uid, mktime(), $datestamp, arg(4));
263 $member = user_load(array('uid' => arg(4)));
264 $roles = user_roles(TRUE); // XXX: wouldn't it be faster without TRUE?
265 $params['variables'] = array(
266 '!member' => check_plain($member->name),
267 '!role' => $roles[variable_get('membership_role', 0)],
268 '!expire' => format_date($datestamp, 'custom', t('Y-m-d')),
269 '!owner' => $user->name,
270 );
271 // send a mail to the new member
272 $params['account'] = $member;
273 drupal_mail('membership', 'member_mod', $member->mail, user_preferred_language($member), $params);
274 // send a mail to the manager (if exists)
275 if(($uid = variable_get('membership_manager', 0)) != 0) {
276 $manager = user_load(array('uid' => $uid));
277 $params['account'] = $manager;
278 drupal_mail('membership', 'managed_mod', $manager->mail, user_preferred_language($manager), $params);
279 }
280 $form_state['redirect'] = 'admin/user/membership';
281 }
282
283 function membership_edit() {
284 if(variable_get('membership_role', 0) == 0) {
285 return t('The module has not been set up yet.');
286 }
287 switch(arg(3)) {
288 case NULL:
289 $form = drupal_get_form('membership_list_form');
290 break;
291 case 'expire':
292 membership_expire(arg(4));
293 drupal_goto('admin/user/membership');
294 break;
295 case 'edit':
296 $form = drupal_get_form('membership_edit_form');
297 break;
298 default:
299 $form = 'Op: ' . arg(3) . ', uid: ' . arg(4);
300 break;
301 }
302 return $form;
303 }
304
305 function membership_admin_settings() {
306 $roles = user_roles(TRUE);
307 $keys = array_keys($roles, 'authenticated user');
308 unset($roles[$keys[0]]);
309 $form['membership_role'] = array(
310 '#type' => 'radios',
311 '#title' => t('Membership-managed role'),
312 '#default_value' => variable_get('membership_role', 0),
313 '#options' => $roles,
314 '#description' => t('Select the role whose members should be managed in a time-limited manner.'),
315 );
316 $cnt = db_fetch_object(db_query('SELECT COUNT(uid) AS uid_cnt FROM {users_roles} WHERE rid = %d', variable_get('membership_role', 0)));
317 if($cnt->uid_cnt != 0) {
318 $form['membership_role']['#disabled'] = 'disabled';
319 $form['membership_role']['#description'] = t('Membership-managed role cannot be changed as it already has members.');
320 }
321 $result = db_query('SELECT DISTINCT u.uid AS uid, name FROM {permission} AS p INNER JOIN {users_roles} AS ur ON ur.rid = p.rid '.
322 'INNER JOIN {users} AS u ON ur.uid = u.uid WHERE p.perm LIKE "%access membership%" AND status != 0 AND access != 0 ORDER BY name');
323 $users = array('0' => t('none'));
324 $userlist = array();
325 while($account = db_fetch_object($result)) {
326 // XXX: is it the intended way to output usernames into a dropdown select?
327 $users[$account->uid] = check_plain($account->name);
328 $userlist[] = $account;
329 }
330 if($userlist) {
331 $form['membership_manager'] = array(
332 '#type' => 'select',
333 '#title' => t('Membership Power Manager'),
334 '#default_value' => variable_get('membership_manager', 1),
335 '#options' => $users,
336 '#description' => t('Select the Power Manager who will receive emails on every membership change.'),
337 );
338 }
339 else {
340 $form['membership_manager'] = array(
341 '#type' => 'markup',
342 '#value' => t('Power Manager cannot be specified as there are no roles with %priv privilege.',
343 array('%priv' => t('access membership'))) . '<br />',
344 );
345 }
346 return system_settings_form($form);
347 }
348
349 /**
350 * Implementation of hook_mail().
351 */
352 function membership_mail($key, &$message, $params) {
353 global $base_url;
354 $language = $message['language'];
355 $variables = user_mail_tokens($params['account'], $language);
356 $variables += $params['variables'];
357 $variables['!url'] = $base_url;
358 switch($key) {
359 case 'member_del':
360 $message['subject'] = t('Deleted membership', $variables, $language->language);
361 $message['body'] = t("Dear !username,\n\nyou have just been removed from the !role role at !site (!url).\n\nSincerely: !owner",
362 $variables, $language->language);
363 break;
364 case 'managed_del':
365 $message['subject'] = t('Deleted membership', $variables, $language->language);
366 $message['body'] = t("Dear Power Manager,\n\n!owner has just removed !member from the !role role at !site (!url).", $variables,
367 $language->language);
368 break;
369 case 'member_add':
370 $message['subject'] = t('New membership', $variables, $language->language);
371 $message['body'] = t("Dear !username,\n\nyou have just been added to the !role role at !site (!url). Your membership expires at !expire.\n\nSincerely: !owner",
372 $variables, $language->language);
373 break;
374 case 'managed_add':
375 $message['subject'] = t('New membership', $variables, $language->language);
376 $message['body'] = t("Dear Power Manager,\n\n!owner has just added !member to the !role role at !site (!url). This new membership expires at !expire.",
377 $variables, $language->language);
378 break;
379 case 'member_mod':
380 $message['subject'] = t('Modified membership', $variables, $language->language);
381 $message['body'] = t("Dear !username,\n\nyour membership of the !role role has just been modified at !site (!url): it expires at !expire.\n\nSincerely: !owner",
382 $variables, $language->language);
383 break;
384 case 'managed_mod':
385 $message['subject'] = t('Modified membership', $variables, $language->language);
386 $message['body'] = t("Dear Power Manager,\n\n!owner has just modified the membership of !member regarding to the !role role at !site (!url): it expires at !expire.",
387 $variables, $language->language);
388 break;
389 case 'member_exp':
390 $message['subject'] = t('Expired membership', $variables, $language->language);
391 $message['body'] = t("Dear !member,\n\nyou have just been removed from the !role role at !site (!url) because of membership expiration.",
392 $variables, $language->language);
393 break;
394 case 'managed_exp':
395 $message['subject'] = t('Expired membership', $variables, $language->language);
396 $message['body'] = t("Dear Power Manager,\n\n!member has just been removed from the !role role at !site (!url) because of membership expiration.",
397 $variables, $language->language);
398 break;
399 }
400 }
401
402 /**
403 * Implementation of hook_cron().
404 */
405 function membership_cron() {
406 $result = db_query('SELECT uid FROM {membership} WHERE expires < %d', mktime());
407 $users = array();
408 while($row = db_fetch_object($result)) {
409 $users[] = user_load(array('uid' => $row->uid));
410 }
411 if($users) {
412 $roles = user_roles(TRUE); // XXX: wouldn't it be faster without TRUE?
413 $role = variable_get('membership_role', 0);
414 $params['variables']['!role'] = $roles[$role];
415 if(($manager_uid = variable_get('membership_manager', 0)) != 0) {
416 $manager = user_load(array('uid' => $manager_uid));
417 }
418 foreach($users as $user) {
419 $params['variables']['!member'] = check_plain($user->name);
420 // send a mail to the ex-member
421 drupal_mail('membership', 'member_exp', $user->mail, user_preferred_language($user), $params);
422 // send a mail to the manager (if exists)
423 if($manager) {
424 drupal_mail('membership', 'managed_exp', $manager->mail, user_preferred_language($manager), $params);
425 }
426 // mail should be sent before delete, as we need some info for it
427 db_query('DELETE FROM {membership} WHERE uid = %d', $user->uid);
428 db_query('DELETE FROM {users_roles} WHERE uid = %d AND rid = %d', $user->uid, $role);
429 }
430 }
431 }
432
433 // vim: set ft=php syntax=php expandtab ts=2 sw=2 autoindent smartindent:

  ViewVC Help
Powered by ViewVC 1.1.2