Projet

Général

Profil

Paste
Télécharger (9,4 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / comment_notify / comment_notify.inc @ 87dbc3bf

1
<?php
2

    
3
/**
4
 * @file
5
 *
6
 * Contains functions which utilize the database and other internal helpers.
7
 */
8

    
9
/**
10
 * Get the notification preferences for a specific user.
11
 *
12
 * @param integer $uid
13
 * @return mixed
14
 *  StdClass if found, else NULL
15
 */
16
function comment_notify_get_user_notification_setting($uid) {
17
  $users = &drupal_static(__FUNCTION__);
18
  if (!isset($users[$uid])) {
19
    if (is_null($uid)) {
20
      throw new Exception('Cannot get user preference, uid missing');
21
    }
22
    // Handle anonymous users with defaults.
23
    if ($uid == 0) {
24
      $users[0] = new stdClass();
25
      $users[0]->comment_notify = comment_notify_variable_registry_get('default_registered_mailalert');
26
      $users[0]->node_notify = comment_notify_variable_registry_get('node_notify_default_mailalert');
27
    }
28
    else {
29
      $setting = db_select('comment_notify_user_settings', 'cnus')
30
        ->fields('cnus')
31
        ->condition('uid', $uid)
32
        ->execute()
33
        ->fetchObject();
34

    
35
      if (!$setting) {
36
        return NULL;
37
      }
38
      else {
39
        $users[$uid] = $setting;
40
      }
41
    }
42
  }
43
  return $users[$uid];
44
}
45

    
46
function comment_notify_get_default_notification_setting() {
47
  return (object) array(
48
    'comment_notify' => comment_notify_variable_registry_get('default_registered_mailalert'),
49
    'node_notify' => comment_notify_variable_registry_get('node_notify_default_mailalert')
50
  );
51
}
52

    
53
/**
54
 * Remove comment notification preferences for a user.
55
 *
56
 * @param integer $uid
57
 * @return boolean
58
 */
59
function comment_notify_delete_user_notification_setting($uid) {
60
  return (bool)db_delete('comment_notify_user_settings')
61
    ->condition('uid', $uid)
62
    ->execute();
63
}
64

    
65
/**
66
 * Get a user's default preference for comment notification.
67
 *
68
 * @param integer $uid
69
 * @return integer
70
 */
71
function comment_notify_get_user_comment_notify_preference($uid) {
72
  $setting = comment_notify_get_user_notification_setting($uid);
73
  if (!$setting) {
74
    $setting = comment_notify_get_default_notification_setting();
75
  }
76
  return $setting->comment_notify;
77
}
78

    
79
/**
80
 * Get a user's default preference for node update notification.
81
 *
82
 * This is notification on nodes where the user is the author.
83
 *
84
 * @param integer $uid
85
 * @return integer
86
 */
87
function comment_notify_get_user_node_notify_preference($uid) {
88
  $setting = comment_notify_get_user_notification_setting($uid);
89
  if (!$setting) {
90
    $setting = comment_notify_get_default_notification_setting();
91
  }
92
  return $setting->node_notify;
93
}
94

    
95
/**
96
 * Sets the notification preferences for a specific user.
97
 *
98
 * @param integer $uid
99
 * @param integer $node_notification
100
 * @param integer $comment_notification
101
 * @return boolean
102
 */
103
function comment_notify_set_user_notification_setting($uid, $node_notification = NULL, $comment_notification = NULL) {
104
  if (!$uid) {
105
    throw new Exception('Cannot set user preference, uid missing');
106
  }
107
  $fields = array('uid' => $uid);
108

    
109
  if (!is_null($node_notification)) {
110
    $fields['node_notify'] = $node_notification;
111
  }
112
  if (!is_null($comment_notification)) {
113
    $fields['comment_notify'] = $comment_notification;
114
  }
115
  if (comment_notify_get_user_notification_setting($uid)) {
116
    $query = db_update('comment_notify_user_settings');
117
    $query->condition('uid', $uid);
118
  }
119
  else {
120
    $query = db_insert('comment_notify_user_settings');
121
  }
122
  return (bool)$query
123
    ->fields($fields)
124
    ->execute();
125
}
126

    
127
/**
128
 * Add a notification against a comment.
129
 *
130
 * @param integer $cid
131
 * @param integer $notify
132
 * @param string $notify_hash
133
 * @return boolean
134
 */
135
function comment_notify_add_notification($cid, $notify, $notify_hash) {
136
  return (bool)db_insert('comment_notify')
137
    ->fields(array(
138
      'cid' => $cid,
139
      'notify' => $notify === NULL ? 0 : $notify,
140
      'notify_hash' => $notify_hash,
141
    ))
142
    ->execute();
143
}
144

    
145
/**
146
 * Remove all the notifications linked with a comment
147
 *
148
 * @param integer $cid
149
 * @return boolean
150
 */
151
function comment_notify_remove_all_notifications($cid) {
152
  return (bool)db_delete('comment_notify')
153
    ->condition('cid', $cid)
154
    ->execute();
155
}
156

    
157
/**
158
 * Updated a notification with a different notification type
159
 *
160
 * @param integer $cid
161
 * @param integer $notify
162
 * @return boolean
163
 */
164
function comment_notify_update_notification($cid, $notify) {
165
  return (bool)db_update('comment_notify')
166
    ->fields(array(
167
      'notify' => $notify === NULL ? 0 : $notify,
168
    ))
169
    ->condition('cid', $cid)
170
    ->execute();
171
}
172

    
173
/**
174
 * Get the type of notification for a comment notification record.
175
 *
176
 * @param integer $cid
177
 * @return integer
178
 */
179
function comment_notify_get_notification_type($cid) {
180
  return db_select('comment_notify', 'cn')
181
    ->fields('cn', array('notify'))
182
    ->condition('cid', $cid)
183
    ->execute()
184
    ->fetchField();
185
}
186

    
187
/**
188
 * Get a list of mails which need to be contacted for a node.
189
 *
190
 * @param integer $nid
191
 * @return QueryStatement
192
 */
193
function comment_notify_get_watchers($nid) {
194
  $cids = db_query("SELECT c.cid FROM {comment} c INNER JOIN {comment_notify} cn ON c.cid = cn.cid LEFT JOIN {users} u ON c.uid = u.uid WHERE c.nid = :nid AND c.status = :status AND cn.notify <> :notify AND (u.uid = 0 OR u.status = 1)", array(
195
    ':nid' => $nid,
196
    ':status' => COMMENT_PUBLISHED,
197
    ':notify' => COMMENT_NOTIFY_DISABLED,
198
  ))->fetchCol();
199
  return comment_load_multiple($cids);
200
}
201

    
202
/**
203
 * Record that the owner of a comment notification request has already been notified.
204
 *
205
 * @param integer $cid
206
 * @return boolean
207
 */
208
function comment_notify_mark_comment_as_notified($comment) {
209
  // First, mark the passed comment (an object, so passed by reference).
210
  $comment->notified = 1;
211

    
212
  // Next, store this fact in the DB as well.
213
  return (bool)db_update('comment_notify')
214
    ->fields(array(
215
      'notified' => 1,
216
    ))
217
    ->condition('cid', $comment->cid)
218
    ->execute();
219
}
220

    
221
/**
222
 * Unsubscribe all comment notification requests associated with an email.
223
 *
224
 * If the email belongs to a user, it will unsubscribe all of their Comment Notify records.
225
 * If it does not, then it will unsubscribe all anonymous users.
226
 *
227
 * @param string $mail
228
 * @return boolean
229
 */
230
function comment_notify_unsubscribe_by_email($mail) {
231
  $update_query = db_update('comment_notify');
232
  $update_query->fields(array('notify' => 0));
233

    
234
  $comment_query = db_select('comment', 'c');
235
  $comment_query->fields('c', array('cid'));
236

    
237
  $uid = db_select('users', 'u')
238
    ->fields('u', array('uid'))
239
    ->condition('mail', $mail)
240
    ->execute()
241
    ->fetchField();
242
  if ($uid) {
243
    $comment_query->condition('uid', $uid);
244
  }
245
  else {
246
    $comment_query->condition('mail', $mail);
247
  }
248
  $update_query->condition('cid', $comment_query, 'IN');
249

    
250
  return (bool)$update_query->execute();
251
}
252

    
253
/**
254
 * Unsubscribe comment notification requests associated with a hash.
255
 *
256
 * This is used in the unsubscribe link.
257
 *
258
 * @param string $hash
259
 * @return boolean
260
 */
261
function comment_notify_unsubscribe_by_hash($hash) {
262
  $notification = db_select('comment_notify')
263
      ->fields('comment_notify')
264
      ->condition('notify_hash', $hash)
265
      ->execute()->fetchAll();
266

    
267
  // If this notification is at the node level, delete all notifications for this node.
268
  if (COMMENT_NOTIFY_NODE == $notification[0]->notify) {
269
    // Get all this user's comments for this node.
270
    $result = db_query("SELECT c.cid
271
      FROM {comment} c, (
272
        SELECT oc.nid, oc.uid
273
        FROM {comment} AS oc, comment_notify AS ocn
274
        WHERE oc.cid = ocn.cid
275
        AND ocn.notify_hash = :hash
276
      ) AS o
277
      WHERE o.nid = c.nid
278
      AND o.uid = c.uid", array(':hash' => $hash));
279

    
280
    $cids = $result->fetchCol();
281

    
282
    // Update all comment notifications to be disabled.
283
    return (bool)db_update('comment_notify')
284
      ->fields(array(
285
        'notify' => 0,
286
      ))
287
      ->condition('cid', $cids, 'IN')
288
      ->execute();
289
  }
290
  else {
291
   // Update this notification to be disabled.
292
   return (bool)db_update('comment_notify')
293
     ->fields(array(
294
       'notify' => 0,
295
     ))
296
    ->condition('notify_hash', $hash)
297
    ->execute();
298
  }
299
}
300

    
301
/**
302
 * Helper function to centralize variable management and defaults.
303
 *
304
 * All variables fall under the "comment_notify" psuedo namespace.  This ensures
305
 * consistancy, and eliminates some verbosity in the calling code.  In addition
306
 * by storing all of the variables in one place, we avoid repeating duplicate
307
 * defaults which are harder to maintain.
308
 *
309
 * @param string $name
310
 * @return mixed
311
 */
312
function comment_notify_variable_registry_get($name) {
313
  $variables = array();
314
  $variables['author_subject'] = t('[site:name] :: new comment for your post.');
315
  $variables['available_alerts'] = array(COMMENT_NOTIFY_NODE, COMMENT_NOTIFY_COMMENT);
316
  $variables['default_anon_mailalert'] = COMMENT_NOTIFY_NODE;
317
  $variables['node_notify_default_mailtext'] = AUTHOR_MAILTEXT;
318
  $variables['default_registered_mailalert'] = COMMENT_NOTIFY_DISABLED;
319
  $variables['node_notify_default_mailalert'] = 0;
320
  $variables['watcher_subject'] = '[site:name] :: new comment on [comment:node:title]';
321
  $variables['comment_notify_default_mailtext'] = DEFAULT_MAILTEXT;
322
  $variables['node_types'] = array('article' => 'article');
323

    
324
  // Errors
325
  $variables['error_anonymous_email_missing'] = 'If you want to subscribe to comments you must supply a valid e-mail address.';
326
  return variable_get("comment_notify_" . $name, $variables[$name]);
327
}
328

    
329
/**
330
 * Helper function to centralize setting variables.
331
 *
332
 * @param string $name
333
 * @param mixed $value
334
 * @return boolean
335
 */
336
function comment_notify_variable_registry_set($name, $value) {
337
  return variable_set("comment_notify_" . $name, $value);
338
}