/[drupal]/contributions/sandbox/megagrunt/modules/enewsletter/enewsletter.module
ViewVC logotype

Contents of /contributions/sandbox/megagrunt/modules/enewsletter/enewsletter.module

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


Revision 1.18 - (show annotations) (download) (as text)
Wed May 11 15:13:10 2005 UTC (4 years, 6 months ago) by MegaGrunt
Branch: MAIN
CVS Tags: HEAD
Changes since 1.17: +94 -62 lines
File MIME type: text/x-php
Re-factored email send out functions:
1 <?php
2 // $Id: enewsletter.module,v 1.14 2005/03/24 00:41:46 MegaGrunt Exp $
3
4 // Author: Robert Castelo
5 // Support: development@cortextcommunications.com
6 // Info: http://www.cortextcommunications.com/development/newsletter
7
8 // ********** LINKS, PERMISIONS & HELP *****************************
9
10
11 define('ANNOUNCEMENT', 1);
12 define('ANNOUNCEMENT_ENABLED', 1);
13 define('ANNOUNCEMENT_AUTO', 1);
14
15 function enewsletter_help($section = "admin/help#enewsletter") {
16
17 switch ($section) {
18 case 'admin/modules#description':
19 return t('Enables users to subscribe to email announcements and newsletters.');
20 case 'admin/help#enewsletter':
21 return t('Enables users to subscribe to an email newsletter.');
22 case 'admin/enewsletters':
23 return t('Statistics for email newsletters.');
24 case 'admin/enewsletters/add':
25 return t('Create an email newsletter.');
26 case 'admin/enewsletters/templates':
27 return t('Create an email newsletter template.');
28 case 'admin/enewsletters/templates/add':
29 return '<p>' . t('Create an email newsletter template.') . '</p>';
30 case 'admin/enewsletters/templates/edit':
31 return '<p>' . t('Edit an email newsletter template.') . '</p>';
32 case 'enewsletters/newsletter':
33 return t('Select content you would like included in this email newsletter.');
34 }
35 }
36
37
38 function enewsletter_perm() {
39 return array("administer enewsletters", "subscribe to enewsletters");
40 }
41
42
43 function enewsletter_menu($may_cache) {
44
45 $items = array();
46 $administer = user_access('administer enewsletters');
47 $subscribe = user_access('subscribe to enewsletters');
48 $email_link = 1;
49
50 $items[] = array('path' => 'enewsletters', 'title' => t('email subscription'), 'callback' => 'enewsletter_callback_subscriptions', 'access' => $email_link);
51 $items[] = array('path' => 'enewsletters/newsletter', 'title' => t('email newsletter'), 'callback' => 'enewsletter_callback_subscription_edit', 'access' => $email_link, 'type' => MENU_CALLBACK);
52
53 if ($may_cache) {
54
55 $items[] = array('path' => 'admin/enewsletters', 'title' => t('email newsletters'), 'callback' => 'enewsletter_callback_admin', 'access' => $administer);
56 $items[] = array('path' => 'admin/enewsletters/list', 'title' => t('list'), 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
57 $items[] = array('path' => 'admin/enewsletters/history', 'title' => t('history'), 'callback' => 'enewsletter_callback_newsletter_history', 'type' => MENU_CALLBACK);
58 $items[] = array('path' => 'admin/enewsletters/subscribers', 'title' => t('subscribers'), 'callback' => 'enewsletter_callback_newsletter_subscribers', 'type' => MENU_CALLBACK);
59
60 $items[] = array('path' => 'admin/enewsletters/newsletters', 'title' => t('newsletters'), 'callback' => 'enewsletter_callback_newsletters', 'access' => $administer);
61 $items[] = array('path' => 'admin/enewsletters/newsletters/list', 'title' => t('list'), 'access' => $administer, 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
62 $items[] = array('path' => 'admin/enewsletters/newsletters/add', 'title' => t('add'), 'callback' => 'enewsletter_callback_newsletter_add', 'access' => $administer, 'type' => MENU_LOCAL_TASK);
63
64 $items[] = array('path' => 'admin/enewsletters/templates', 'title' => t('templates'), 'callback' => 'enewsletter_callback_templates', 'access' => $administer);
65 $items[] = array('path' => 'admin/enewsletters/templates/list', 'title' => t('list'), 'access' => $administer, 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
66 $items[] = array('path' => 'admin/enewsletters/templates/edit', 'title' => t('edit'), 'callback' => 'enewsletter_callback_template_edit', 'access' => $administer, 'type' => MENU_CALLBACK);
67 $items[] = array('path' => 'admin/enewsletters/templates/add', 'title' => t('add'), 'callback' => 'enewsletter_callback_template_add', 'access' => $administer, 'type' => MENU_LOCAL_TASK);
68
69 $items[] = array('path' => 'admin/enewsletters/announcements', 'title' => t('announcements'), 'callback' => 'enewsletter_callback_announcements', 'access' => $administer, 'weight' => 9);
70
71 $items[] = array('path' => 'admin/enewsletters/undelivered', 'title' => t('undelivered'), 'callback' => 'enewsletter_callback_undelivered', 'access' => $administer, 'weight' => 10);
72 $items[] = array('path' => 'admin/enewsletters/configuration', 'title' => t('configuration'), 'callback' => 'enewsletter_callback_config', 'access' => $administer);
73
74 }
75
76 return $items;
77 }
78
79
80 // ********** ADMINISTRATION *****************************
81
82
83 // Display all newsletters
84 function enewsletter_callback_admin() {
85
86 $newsletters = enewsletter_get_db_rows("SELECT * FROM {enewsletter_newsletters} WHERE enewsletter_id != '%d'", ANNOUNCEMENT);
87
88 if (!$newsletters) return print theme('page', 'There are no email newsletters.');
89
90 $configuration = enewsletter_get_configuration();
91
92 // convert to function
93 foreach($newsletters as $newsletter) {
94 unset($rows);
95 $header = array(t('last publication'), t('sent (last)'), t('in que'), t('next publication'));
96 $last = ($newsletter->last == 0) ? '-' : format_date($newsletter->last, 'small');
97 $next = ($newsletter->next == 0) ? t('manual') : format_date($newsletter->next, 'small');
98
99 $sent_count = enewsletter_count_sent($newsletter->enewsletter_id, $newsletter->next, $newsletter->last);
100 $qued_count = enewsletter_count_qued($newsletter->enewsletter_id, $newsletter->next, $configuration['bounce_limit']);
101
102 $last_subscribers = db_result(db_query("SELECT count(*) FROM {enewsletter_subscriptions} WHERE enewsletter_id = '%d' AND subscribed <= '%d'", $newsletter->enewsletter_id, $newsletter->last));
103
104 if ($que == 0) {
105 $sent = $last_subscribers;
106 } else {
107 $sent = db_result(db_query("SELECT count(*) FROM {enewsletter_subscriptions} WHERE enewsletter_id = '%d' AND uid <= '%d' AND subscribed <= '%d'", $newsletter->enewsletter_id, $que, $newsletter->last));
108 }
109
110 $qued = $last_subscribers - $sent;
111
112 $rows[] = array(
113 array("data" => $last, "align" => "center"),
114 array("data" => $sent_count, "align" => "center"),
115 array("data" => $qued_count, "align" => "center"),
116 array("data" => $next, "align" => "center")
117 );
118
119 $output .= '<div class="enewsletter-status">';
120 $output .= '<h2>';
121 $output .= $newsletter->title;
122 $output .= '</h2>';
123 $output .= '<p>';
124 $output .= $newsletter->description;
125 $output .= '</p>';
126 $output .= theme('table', $header, $rows, array('id' => 'enewsletter-admin'));
127 $output .= '</div>';
128 }
129
130 print theme('page', $output);
131 return;
132 }
133
134
135 function enewsletter_count_qued($publication_id, $publication_timestamp, $bounce_limit) {
136
137 // publication has finished sending
138 if ($publication_timestamp > time() || $publication_timestamp == 0) return 0;
139
140 $qued_count = db_result(db_query("
141 SELECT count(*)
142 FROM {enewsletter_subscriptions} s
143 LEFT JOIN {users} u ON s.uid = u.uid
144 LEFT JOIN {enewsletter_bounce_count} b ON u.mail = b.email
145 LEFT JOIN {enewsletter_sent} m ON (m.uid = s.uid AND m.enewsletter_id = s.enewsletter_id AND m.pub_time = '%d')
146 WHERE s.enewsletter_id = '%d'
147 AND (b.bounces IS NULL OR b.bounces < '%d')
148 AND m.sent IS NULL
149 ORDER BY u.name
150 ", $publication_timestamp, $publication_id, $bounce_limit));
151
152 return $qued_count;
153
154 }
155
156
157 function enewsletter_count_sent($publication_id, $publication_timestamp, $previous_publication_timestamp) {
158
159 // publication finished sending?
160 // count all emails on this send out - or
161 // count all emails on last send out
162 $timestamp = ($publication_timestamp > time() || $publication_timestamp == 0) ? $previous_publication_timestamp : $publication_timestamp;
163
164 $sent_count = db_result(db_query("
165 SELECT count(*)
166 FROM {enewsletter_sent}
167 WHERE enewsletter_id = '%d'
168 AND pub_time = '%d'
169 ", $publication_id, $timestamp));
170
171 return $sent_count;
172 }
173
174
175 function enewsletter_callback_newsletter_subscribers($newsletter_id) {
176
177 $result = db_query("SELECT s.uid, s.format, s.subscribed, u.name FROM {enewsletter_subscriptions} s LEFT JOIN {users} u ON s.uid = u.uid WHERE s.enewsletter_id = '%d'", $newsletter_id);
178 if (!$result) return print theme('page', 'No subscribers');
179
180 $header = array(t('user'), t('format'), t('subscribed'));
181
182 while ($subscriber = db_fetch_object($result)) {
183
184 $name = l($subscriber->name, "user/$subscriber->uid/edit");
185 $format = $subscriber->format;
186
187 if ( !$subscriber->subscribed ) {
188 $subscriber->subscribed = time();
189 db_query("UPDATE {enewsletter_subscriptions} SET subscribed = '%d' WHERE enewsletter_id = '%d' AND uid = '%d'", $subscriber->subscribed, $newsletter_id, $subscriber->uid);
190 }
191
192 $subscribed= format_date($subscriber->subscribed, 'medium');
193 $rows[] = array(array("data" => $name), array("data" => $format), array("data" => $subscribed));
194 }
195
196 $newsletter = enewsletter_get_newsletter($newsletter_id);
197 $title = t('Subscribers to %newsletter', array('%newsletter' => $newsletter['title']));
198 $output = theme('table', $header, $rows, array('id' => 'enewsletter-subscriptions'));
199
200 print theme('page', $output, $title);
201 return;
202 }
203
204
205 function enewsletter_callback_config() {
206
207 $edit = $_POST["edit"];
208
209 if ($edit) {
210 enewsletter_set_configuration($edit);
211 drupal_set_message (t("Newsletter settings have been updated." ));
212 }
213 $configuration = enewsletter_get_configuration();
214 $output = enewsletter_form_configuration($configuration);
215 $output .= form_submit(t("Save settings"));
216 $output = form($output);
217 print theme('page', $output);
218 return;
219 }
220
221
222 // Display all newsletters
223 function enewsletter_callback_newsletters() {
224
225 $edit = $_POST["edit"];
226 $operation = $_POST["op"];
227
228
229 switch ($operation) {
230
231 case t('Send Now'):
232 case t('Send'):
233 $form = enewsletter_form_send_now($edit, $operation);
234 break;
235 case t('Schedule'):
236 case t('Set Schedule'):
237 $form = enewsletter_callback_newsletter_schedule($edit, $operation);
238 break;
239 case t('Set Content'):
240 case t('Save Newsletter'):
241 $form = enewsletter_callback_newsletter_content($edit, $operation);
242 break;
243 case t('Delete'):
244 case t('Delete Newsletter'):
245 $form = enewsletter_callback_newsletter_delete($edit, $operation);
246 break;
247 default:
248 break;
249 }
250
251 if ($form) {
252 print theme('page', form($form));
253 return;
254 }
255
256 $newsletters = enewsletter_get_db_rows('SELECT * FROM {enewsletter_newsletters} WHERE enewsletter_id != ' . ANNOUNCEMENT);
257 if (!$newsletters) return print theme('page', 'There are no email newsletters.');
258
259 foreach($newsletters as $newsletter) {
260
261 $header = array(t('first published'), t('last published'), t('next published'), t('subscribers'));
262 $first = ($newsletter->first == 0) ? '-' : format_date($newsletter->first, 'small');
263 $last = ($newsletter->last == 0) ? '-' : format_date($newsletter->last, 'small');
264 $next = ($newsletter->next== 0) ? t('manual') : format_date($newsletter->next, 'small');
265 $subscribers = db_result(db_query("SELECT count(*) FROM {enewsletter_subscriptions} WHERE enewsletter_id = '%d'", $newsletter->enewsletter_id));
266 $subscribers = ($subscribers) ? l($subscribers, "admin/enewsletters/subscribers/$newsletter->enewsletter_id") : 0;
267
268 unset($rows);
269 $rows[] = array(
270 array('data' => $first, 'align' => 'center'),
271 array('data' => $last, 'align' => 'center'),
272 array('data' => $next, 'align' => 'center'),
273 array('data' => $subscribers, 'align' => 'center')
274 );
275
276 $controls = form_hidden ('enewsletter_id' , $newsletter->enewsletter_id);
277 $controls .= form_submit(t('Send Now'));
278 $controls .= form_submit(t('Schedule'));
279 $controls .= form_submit(t('Set Content'));
280 $controls .= form_submit(t('Delete'));
281
282 $form = '<div class="enewsletter-controls">';
283 $form .= '<h2>' . $newsletter->title . '</h2>';
284 $form .= '<p>' . $newsletter->description . '</p>';
285 $form .= theme('table', $header, $rows, array('id' => 'enewsletter-newsletters'));
286 $form .= '<p>' . $controls . '</p>';
287 $form .= '</div>';
288 $output .= form($form);
289 }
290
291 print theme('page', $output);
292 return;
293 }
294
295
296 // Create new newsletter
297 function enewsletter_callback_newsletter_add() {
298
299 $edit = $_POST["edit"];
300 $operation = $_POST["op"];
301
302 if ($operation == 'Cancel') {
303 drupal_goto('admin/enewsletters/newsletters');
304 }
305
306 if ($operation == 'Save newsletter') {
307 $edit['tid'] = enewsletter_selected_checkboxes($edit['tid']);
308 enewsletter_validate_content($edit);
309 enewsletter_validate_schedule($edit);
310 $error = form_get_errors();
311
312 if ($error) {
313 $output = enewsletter_form_content($edit);
314 $output .= enewsletter_form_schedule($edit);
315 $output .= form_submit(t("Save newsletter"));
316 $output .= form_submit(t("Cancel"));
317 return print theme('page', form($output));
318 }
319
320 db_query("INSERT INTO {enewsletter_newsletters} (enewsletter_id, title, description, track, template_text, template_html, start, next, every, frequency) VALUES (NULL, '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%s')", $edit['title'], $edit['description'], $edit['track'], $edit['template_text'], $edit['template_html'], $edit['start'], $edit['next'], $edit['every'], $edit['frequency']);
321 $edit['enewsletter_id'] = db_result(db_query("SELECT LAST_INSERT_ID()"));
322 enewsletter_set_allowed_terms($edit);
323 drupal_set_message (t('Email newsletter settings have been saved for "' . $edit['title'] . '"'));
324 drupal_goto('admin/enewsletters/newsletters');
325 }
326
327 $output = enewsletter_form_content();
328 $output .= enewsletter_form_schedule();
329 $output .= form_submit(t("Save newsletter"));
330 $output .= form_submit(t("Cancel"));
331 print theme('page', form($output));
332 return;
333 }
334
335
336 // Edit content of existing newsletter
337 function enewsletter_callback_newsletter_content($edit, $operation) {
338
339 if ($operation == t('Save Newsletter')) {
340 $edit['tid'] = enewsletter_selected_checkboxes($edit['tid']);
341 enewsletter_validate_content($edit);
342 $error = form_get_errors();
343 if (!$error) {
344 if ($edit['enewsletter_id']) {
345 db_query("UPDATE {enewsletter_newsletters} SET title = '%s', description = '%s', track = '%d', template_text = '%d', template_html = '%d' WHERE enewsletter_id = '%d'", $edit['title'], $edit['description'], $edit['track'], $edit['template_text'], $edit['template_html'], $edit['enewsletter_id']);
346 }
347 enewsletter_set_allowed_terms($edit);
348 drupal_set_message (t('Email newsletter content settings have been saved for "' . $edit['title'] . '"'));
349 return;
350 }
351 }
352
353 $edit = enewsletter_get_newsletter($edit['enewsletter_id']);
354 $edit['tid'] = enewsletter_get_allowed_terms($edit['enewsletter_id']);
355 $output = enewsletter_form_content($edit);
356 $output .= form_submit(t("Save Newsletter"));
357 $output .= form_submit(t("Cancel"));
358
359 return $output;
360 }
361
362
363 // Edit schedule of existing newsletter
364 function enewsletter_callback_newsletter_schedule($edit, $operation) {
365
366 if ($operation == t('Set Schedule')) {
367 enewsletter_validate_schedule($edit);
368 $error = form_get_errors();
369 if (!$error) {
370 db_query("UPDATE {enewsletter_newsletters} SET start = '%d', next = '%d', every = '%d', frequency = '%s' WHERE enewsletter_id = '%d'", $edit['start'], $edit['next'], $edit['every'], $edit['frequency'], $edit['enewsletter_id']);
371 drupal_set_message (t('Publication schedule settings have been saved for "' . $edit['title'] . '"'));
372 return;
373 }
374 }
375
376 $edit = enewsletter_get_newsletter($edit['enewsletter_id']);
377 $output = '<h2>' . t('Schedule: ') . $edit['title'] . '</h2>';
378 $output .= enewsletter_form_schedule($edit);
379 $output .= form_submit(t('Set Schedule'));
380 $output .= form_submit(t("Cancel"));
381 return $output;
382 }
383
384
385 // Edit content of existing newsletter
386 function enewsletter_callback_newsletter_delete($edit, $operation) {
387
388 if ($operation == t('Delete Newsletter')) {
389
390 if ($edit['enewsletter_id']) {
391
392 $newsletter = db_fetch_object(db_query("SELECT enewsletter_id, title FROM {enewsletter_newsletters} WHERE enewsletter_id = '%d' LIMIT 1", $edit['enewsletter_id']));
393 if ($newsletter) {
394 db_query("DELETE FROM {enewsletter_newsletters} WHERE enewsletter_id = '%d'", $newsletter->enewsletter_id);
395 db_query("DELETE FROM {enewsletter_allowed} WHERE enewsletter_id = '%d'", $newsletter->enewsletter_id);
396 db_query("DELETE FROM {enewsletter_selected} WHERE enewsletter_id = '%d'", $newsletter->enewsletter_id);
397 db_query("DELETE FROM {enewsletter_subscriptions} WHERE enewsletter_id = '%d'", $newsletter->enewsletter_id);
398 watchdog("special", "Email newsletter: deleted newsletter '$enewsletter_id'");
399 drupal_set_message(t('The newsletter "' . $newsletter->title . '" has been deleted.'));
400 cache_clear_all();
401 } else {
402 drupal_set_message(t("Newsletter doesn't exist."));
403 }
404
405 return;;
406 }
407 }
408
409 $edit = enewsletter_get_newsletter($edit['enewsletter_id']);
410 $output = '<p>';
411 $output .= t('Are you sure you want to delete the email newsletter ') . '<strong>' . $edit['title'] . '</strong>';
412 $output .= '</p>';
413 $output .= form_hidden ('enewsletter_id', $edit['enewsletter_id']);
414 $output .= form_submit(t('Delete Newsletter'));
415 $output .= form_submit(t('Cancel'));
416
417 return $output;
418 }
419
420
421 // Display all templates
422 function enewsletter_callback_templates() {
423 $templates = enewsletter_get_db_rows("SELECT * FROM {enewsletter_templates} WHERE template_id > 2 ORDER BY type");
424 $output .= enewsletter_form_templates($templates);
425 print theme('page', $output);
426 }
427
428
429 // add template
430 function enewsletter_callback_template_add() {
431
432 $edit = $_POST["edit"];
433
434 if ($edit) {
435 enewsletter_validate_template($edit);
436 $errors = form_get_errors();
437 if ($errors) return print theme('page', enewsletter_form_template($edit));
438
439 $edit['template_id'] = enewsletter_set_template($edit);
440 drupal_set_message (t('Settings have been saved for "' . $edit['name'] . '" template.'));
441 drupal_goto('admin/enewsletters/templates');
442 }
443
444 $output .= enewsletter_form_template();
445 print theme('page', $output);
446 return;
447 }
448
449
450 // edit template
451 function enewsletter_callback_template_edit($template_id = NULL) {
452
453 $edit = $_POST["edit"];
454 $operation = $_POST["op"];
455
456 if ($operation == 'Delete template') {
457 enewsletter_template_delete($edit['template_id']);
458 drupal_goto('admin/enewsletters/templates');
459 return;
460 }
461
462 if ($operation == 'Save template') {
463 enewsletter_validate_template($edit);
464
465 $errors = form_get_errors();
466 if ($errors) return print theme('page', enewsletter_form_template($edit));
467
468 enewsletter_set_template($edit);
469 drupal_set_message (t('Settings have been saved for "' . $edit['name'] . '" template.'));
470 drupal_goto('admin/enewsletters/templates');
471 return;
472 }
473
474 // if new form
475 $edit = enewsletter_get_template($template_id);
476 $edit['delete_button'] = 'YES';
477 $output = enewsletter_form_template($edit);
478 print theme('page', $output);
479 return;
480 }
481
482
483 // Process edited template form
484 function enewsletter_validate_template($edit) {
485
486 if (!$edit['name']) form_set_error('name', t('Template name must be set.'));
487
488 // Check if template has unique title
489 $template_id = db_result(db_query("SELECT template_id FROM {enewsletter_templates} WHERE name = '%s' LIMIT 1", $edit['name']));
490 if ($template_id && $template_id != $edit['template_id']) {
491 form_set_error('name', t('Title already in use by another email template.'));
492 }
493
494 if (!$edit['template']) form_set_error('template', t('Template layout must be set.'));
495
496 return;
497 }
498
499 function enewsletter_callback_announcements() {
500
501 $edit = $_POST["edit"];
502 $operation = $_POST["op"];
503
504 $configuration = enewsletter_get_configuration();
505
506 if ($configuration['announce_enable'] != ANNOUNCEMENT_ENABLED) {
507 $output = t('Announcements must be enabled in ') . l('configuration', 'admin/enewsletters/configuration');
508 return print theme('page', $output);
509 }
510
511 switch ($operation) {
512
513 case t('Send Now'):
514 enewsletter_validate_announcement($edit);
515 $errors = form_get_errors();
516 if (!$errors) {
517 enewsletter_set_template(array('template_id' => 1, 'name' => t('announcements'), 'template' => $edit['announce_text_msg'], 'type' => 0, 'format' => $edit['format_text']));
518 enewsletter_set_template(array('template_id' => 2, 'name' => t('announcements HTML'), 'template' => $edit['announce_html_msg'], 'type' => 1, 'format' => $edit['format_html']));
519 $form = enewsletter_form_send_now($edit, $operation);
520 }
521 break;
522 case t('Send'):
523 db_query("UPDATE {enewsletter_newsletters} SET next = '%d' WHERE enewsletter_id = '%d'", time(), $edit['enewsletter_id']);
524 $form = enewsletter_form_send_now($edit, $operation);
525 break;
526 case t('Schedule'):
527 enewsletter_validate_announcement($edit);
528 $errors = form_get_errors();
529 if (!$errors) {
530 enewsletter_set_template(array('template_id' => 1, 'name' => t('announcements'), 'template' => $edit['announce_text_msg'], 'type' => 0, 'format' => $edit['format_text']));
531 enewsletter_set_template(array('template_id' => 2, 'name' => t('announcements HTML'), 'template' => $edit['announce_html_msg'], 'type' => 1, 'format' => $edit['format_html']));
532 $form = enewsletter_callback_newsletter_schedule($edit, $operation);
533 }
534 break;
535 case t('Set Schedule'):
536 $form = enewsletter_callback_newsletter_schedule($edit, $operation);
537 break;
538 default:
539 break;
540 }
541
542 if ($form) {
543 print theme('page', form($form));
544 return;
545 }
546
547 $announcement = enewsletter_get_template(1);
548 $announcement_HTML = enewsletter_get_template(2);
549
550 $edit['announce_text_msg'] = $announcement['template'];
551 $edit['format_text'] = $announcement['format'];
552 $edit['announce_html_msg'] = $announcement_HTML['template'];
553 $edit['format_html'] = $announcement_HTML['format'];
554
555 $output .= enewsletter_form_announcement($edit);
556
557 print theme('page', $output);
558 return;
559 }
560
561 function enewsletter_form_announcement($edit = NULL) {
562
563 $output .= enewsletter_form_profile_fields();
564 $output .= form_hidden ('enewsletter_id' , ANNOUNCEMENT);
565 $output .= form_textarea(t('Text Message'), 'announce_text_msg', $edit['announce_text_msg'], 50, 6, t('Plain text version of announcement message'), '', TRUE);
566 $output .= filter_form('format_text', $edit['format_text']);
567 $output .= form_textarea(t('HTML Message'), 'announce_html_msg', $edit['announce_html_msg'], 50, 6, t("HTML version of announcement message - leave blank if you don't want to send a HTML version"));
568 $output .= filter_form('format_html', $edit['format_html']);
569 $output .= form_submit(t('Send Now'));
570 $output .= form_submit(t('Schedule'));
571 return form($output);
572 }
573
574 function enewsletter_validate_announcement($edit) {
575
576 if (!$edit['announce_text_msg']) form_set_error('announce_text_msg', t('Plain text version of announcement message must be set.'));
577 return;
578 }
579
580
581
582 // Get rows from database
583 function enewsletter_get_db_rows($query) {
584
585 $results = db_query($query);
586
587 while ($row = db_fetch_object($results)) {
588 $rows[] = $row;
589 }
590
591 return $rows;
592 }
593
594
595 function enewsletter_get_configuration() {
596 $results = db_query("SELECT * FROM {enewsletter_config}");
597 while ($row = db_fetch_object($results)) {
598 $configuration[$row->variable] = $row->value;
599 }
600 return $configuration;
601 }
602
603
604 function enewsletter_set_configuration($configuration) {
605
606 while(list($variable, $value) = each ($configuration)) {
607 db_query("DELETE FROM {enewsletter_config} WHERE variable = '%s'", $variable);
608 db_query("INSERT INTO {enewsletter_config} (variable, value) VALUES ('%s', '%s')", $variable, $value);
609 }
610
611 return;
612 }
613
614
615 function enewsletter_form_configuration($configuration) {
616
617 // Email Addresses
618 if ($configuration[ "set_return_path" ] == NULL) $configuration[ "set_return_path" ] = 'Yes';
619 $addresses = form_textfield (t('From'), 'from_address', $configuration[ 'from_address' ], 40, 64, t('The email address you would like messages to be sent from.'));
620 $addresses .= form_textfield (t('Reply-To'), 'reply_address', $configuration[ 'reply_address' ], 40, 64, t('The email address you would like messages to go to when a recipient uses their Reply button. (can be the same as the From address)'));
621 $addresses .= form_textfield (t('Bounce'), 'bounce_addresss', $configuration[ 'bounce_addresss' ], 40, 64, t('The email address you would like messages to bounce back to if undelivered - configuration settings below. (sets Errors-To: and Return-Path:)'));
622 $addresses .= form_radios(t("Set Return-Path"), "set_return_path", $configuration["set_return_path"], array(t('No'), t('Yes')), t("It's preferable to set the Return-Path, but some systems do not allow Drupal to set this."));
623 $output = form_group(t('Email Addresses'), $addresses, t('Make sure that these addresses correspond to mailboxes you have set up on your server.'));
624
625 // Sending Configuration
626 if ($configuration[ 'send_maximum' ] == NULL) $configuration[ 'send_maximum' ] = 50;
627 if ($configuration[ 'send_delay' ] == NULL) $configuration[ 'send_delay' ] = 2;
628 $send = form_textfield (t('Maximum Emails'), 'send_maximum', $configuration[ 'send_maximum' ], 10, 64, t('The maximum number of emails to send at each cron run'));
629 $send .= form_textfield (t('Send Delay'), 'send_delay', $configuration[ 'send_delay' ], 10, 64, t('Delay in microseconds between each email (avoid chocking mail server)'));
630 $output .= form_group( t('Sending'), $send );
631
632 // Announcements
633 $announcements = form_checkbox(t('Enabled'), 'announce_enable', ANNOUNCEMENT_ENABLED, $configuration['announce_enable'], t('Allow announcement messages.'));
634 $announcements .= form_checkbox(t('Automatic Subscription'), 'announce_auto', ANNOUNCEMENT_AUTO, $configuration['announce_auto'], t('When users create accounts, automatically subscribe them to announcements.'));
635 $announcements .= form_textarea(t('Subscribe Message (Optional)'), 'announce_optional_msg', $configuration['announce_optional_msg'], 50, 2, t('Displayed when users have the option to subscribe to announcements - always displayed on the user account page'));
636 $announcements .= form_textarea(t('Subscribe Message (Automatic)'), 'announce_auto_msg', $configuration['announce_auto_msg'], 50, 2, t('Displayed when users are automatically subscribed as part of account creation'));
637 $output .= form_group( t('Announcements'), $announcements );
638
639 // Security
640 if ($configuration[ 'loggin' ] == NULL) $configuration[ 'loggin' ] = 0;
641 $loggin = form_radios(t("Loggin"), "loggin", $configuration["loggin"], array(t('Limited'), t('Full')), t("Restricts access to just the subscription settings, or all aspects of an account."));
642 $output .= form_group( t('Security'), $loggin, t("Controls how much access links in email newsletters give to an account. Limited loggin gives access to specific pages only, the user is still treated as if they have not logged in." ) );
643
644 // Receiving Configuration
645 if ($configuration[ "bounce_store_deleted" ] == NULL) $configuration[ "bounce_store_deleted" ] = '48';
646 if ($configuration[ "bounce_mailbox_connection" ] == NULL) $configuration[ "bounce_mailbox_connection" ] = 'POP';
647 $receive = form_radios(t("Connection Type"), "bounce_mailbox_connection", $configuration["bounce_mailbox_connection"], array(t('POP'), t('IMAP')), t("How to connect to your mail server."));
648 $receive .= form_textfield (t("Mailbox Host" ), "bounce_mailbox_host" , $configuration[ "bounce_mailbox_host" ], 40, 64, t('Your host mail sever, usualy in the format: mail.yourdomain.com'));
649 $receive .= form_textfield (t("Mailbox Port" ), "bounce_port" , $configuration[ "bounce_port" ], 40, 64, t("For POP connection usually: '110/pop3' or '110/pop3/notls'. For IMAP usually: '143'."));
650 $receive .= form_textfield (t("Mailbox Username" ), "bounce_mailbox_user" , $configuration[ "bounce_mailbox_user" ], 40, 64, t("Username of mailbox for receiving undelivered email, usually the address of the mailbox: bounce@yourdomain.com."));
651 $receive .= form_password (t("Mailbox Password" ), "bounce_mailbox_password" , $configuration[ "bounce_mailbox_password" ], 40, 64, t("Password of mailbox for receiving undelivered email."));
652 $receive .= form_textfield (t("Max Process" ), "bounce_max_process" , $configuration[ "bounce_max_process" ], 10, 64, t("Maximum number of bounced emails to process per run."));
653 $receive .= form_textfield (t("Store Processed" ), "bounce_store_processed" , $configuration[ "bounce_store_processed" ], 10, 64, t("How long to store copy of processed messages in Drupal. (hours)"));
654 $receive .= form_textfield (t("Bounce Limit" ), "bounce_limit" , $configuration[ "bounce_limit" ], 10, 64, t("Stop sending to an address after this number of bounces"));
655 $output .= form_group(t('Receiving (Undelivered)'), $receive, t("Settings for connecting to a mailbox and processing emails that have bounced back as undelivered" ));
656
657 return $output;
658 }
659
660
661 // Get newsletter settings from database (single)
662 function enewsletter_get_newsletter($enewsletter_id) {
663
664 $settings = db_fetch_array(db_query("SELECT * FROM {enewsletter_newsletters} WHERE enewsletter_id = '%d'", $enewsletter_id));
665
666 return $settings;
667 }
668
669
670 // Get terms allowed in newsletter from database (all) (single)
671 function enewsletter_get_allowed_terms($enewsletter_id = NULL) {
672
673 if ($enewsletter_id == NULL) {
674 $terms = db_query("SELECT DISTINCT tid FROM {enewsletter_allowed} ORDER BY tid");
675 } else {
676 $terms = db_query("SELECT tid FROM {enewsletter_allowed} WHERE enewsletter_id = '%d' ORDER BY tid", $enewsletter_id);
677 }
678
679 $term_rows = db_num_rows($terms) - 1;
680
681 for ($counter = 0; $counter <= $term_rows; $counter++) {
682 $allowed_terms[] = db_result($terms, $counter);
683 }
684
685 return $allowed_terms;
686 }
687
688
689 // Update database with terms allowed in database (single)
690 function enewsletter_set_allowed_terms($settings) {
691
692 db_query("DELETE FROM {enewsletter_allowed} WHERE enewsletter_id = '%d'", $settings['enewsletter_id']);
693
694 foreach($settings['tid'] as $tid) {
695 db_query("INSERT INTO {enewsletter_allowed} (enewsletter_id, tid) VALUES ('%d', '%d')", $settings['enewsletter_id'], $tid);
696 }
697
698 return;
699 }
700
701
702
703 function enewsletter_validate_content(&$edit) {
704
705 // Check that there is a title
706 if (!$edit['title']) form_set_error('title', t('A title must be set.'));
707
708 // Check if new newsletter has unique title
709 $newsletter_id = db_result(db_query("SELECT enewsletter_id FROM {enewsletter_newsletters} WHERE title = '%s' LIMIT 1", $edit['title']));
710 if (is_string($newsletter_id) == true && $edit['enewsletter_id'] != $newsletter_id) {
711 form_set_error('title', t('Title already in use by another email newsletter.'));
712 }
713
714 // Check that at least one term has been selected
715 if (!$edit['tid']) form_set_error('tid', t('At least one term must be selected.'));
716
717 return;
718 }
719
720
721 // Date and time checks
722 function enewsletter_validate_schedule(&$edit) {
723
724 // Skip these checks if announcement is being validated
725 if ($edit['enewsletter_id'] != ANNOUNCEMENT) {
726
727 // Check node inclusion date
728 // - if before first publication
729 if ($edit['last'] == 0) {
730
731 if ($edit['start'] == 0) {
732 $edit['start'] = mktime (1, 0, 0, 1, 1, 1999, -1);
733 } else {
734
735 $edit['start'] = strtotime ($edit['start']);
736 $include_nodes_date = getdate($edit['start']);
737
738 // Is node inclusion date a valid date?
739 if (checkdate( $include_nodes_date['mon'], $include_nodes_date['mday'], $include_nodes_date['year'] ) == FALSE) {
740 form_set_error('start', t("The 'Include Nodes From' date is not correct, please use the mm/dd/yy format."));
741 $edit['start'] = mktime (1, 0, 0, 1, 1, 1999, -1);
742 }
743
744 }
745 }
746
747 // If schedule set to Manual, set 'every' to 0
748 if ($edit['frequency'] == 'manual') {
749 $edit['every'] = 0;
750 $edit['next_date'] = 0;
751 return;
752 }
753
754 // Check frequency amount has been set
755 if ($edit['every'] == 0) form_set_error('every', t("Send Schedule: 'Every' cannot be 0"));
756
757 }
758
759 // Check there is a publication date
760 if ($edit['next_date'] == 0) {
761
762 form_set_error('next_date', t("The 'Send Start' date must be set if you want to send a scheduled email."));
763
764 } else {
765
766 $next = strtotime ($edit['next_date']);
767 $next_array = getdate($next);
768
769 // Is this a valid date?
770 if (checkdate( $next_array['mon'], $next_array['mday'], $next_array['year'] ) == FALSE) {
771 drupal_set_message (t("The 'Send Start' date is not correct, please use the mm/dd/yy format."), 'error');
772 $edit['next'] = time();
773 } else {
774 $edit['next'] = mktime ($edit['next_hour'], 0, 0, $next_array['mon'], $next_array['mday'], $next_array['year'], -1);
775 }
776
777 // Has publication time already passed?
778 $send_time = mktime ($edit['next_hour'], 0, 0, $next_array['mon'], $next_array['mday'], $next_array['year'], -1);
779 if ( $send_time <= time() ) form_set_error('next_hour', t("The 'Send Start' date has already passed."));
780
781 }
782
783 // Is nodes inclusion date earlier than send out time?
784 if ( $edit['start'] > $send_time && $edit['frequency'] != 'manual' && $edit['enewsletter_id'] != 1) form_set_error('start', t("The 'Include Nodes From' date is later than the send time."));
785
786 return;
787 }
788
789
790
791 // Validate 'save newsletter' form submition
792 function enewsletter_validate_newsletter(&$edit) {
793
794 // Check that there is a title
795 if (!$edit['title']) form_set_error('title', t('A title must be set.'));
796
797 // Check if new newsletter has unique title
798 $newsletter_id = db_result(db_query("SELECT enewsletter_id FROM {enewsletter_newsletters} WHERE title = '%s' LIMIT 1", $edit['title']));
799 if (is_string($newsletter_id) == true && $edit['enewsletter_id'] != $newsletter_id) {
800 form_set_error('title', t('Title already in use by another email newsletter.'));
801 }
802
803 // Check that at least one term has been selected
804 if (!$edit['tid']) form_set_error('tid', t('At least one term must be selected.'));
805
806 // If schedule set to Manual, set 'every' to 0
807 if ($edit['frequency'] == 'manual') {
808
809 $edit['every'] = 0;
810
811 } else {
812
813 // Date and time checks
814
815 // Check Schedule (every) has been set
816 if ($edit['every'] == 0) form_set_error('every', t("Send Schedule: 'Every' cannot be 0"));
817
818 // Check there is a start date
819 if ($edit['next_date'] == 0) {
820
821 form_set_error('next_date', t("The 'Send Start' date must be set if you want to send a scheduled email."));
822
823 } else {
824
825 $next = strtotime ($edit['next_date']);
826 $next_array = getdate($next);
827
828 // Is this a valid date?
829 if (checkdate( $next_array['mon'], $next_array['mday'], $next_array['year'] ) == FALSE) {
830 drupal_set_message (t("The 'Send Start' date is not correct, please use the mm/dd/yy format."), 'error');
831 $edit['next'] = time();
832 } else {
833 $edit['next'] = mktime ($edit['next_hour'], 0, 0, $next_array['mon'], $next_array['mday'], $next_array['year'], -1);
834 }
835
836 // Has Start time already passed?
837 $send_time = mktime ($edit['next_hour'], 0, 0, $next_array['mon'], $next_array['mday'], $next_array['year'], -1);
838 if ( $send_time <= time() ) form_set_error('next_hour', t("The 'Send Start' date has already passed."));
839
840 }
841
842 // Check Node Start date (if before first publication)
843 if ($edit['last'] == 0) {
844 if ($edit['start'] == 0) {
845 $edit['start'] = mktime (1, 0, 0, 1, 1, 1999, -1);
846 } else {
847
848 $edit['start'] = strtotime ($edit['start']);
849 $include_nodes_date = getdate($edit['start']);
850
851 // Is node start date a valid date?
852 if (checkdate( $include_nodes_date['mon'], $include_nodes_date['mday'], $next_array['year'] ) == FALSE) {
853 form_set_error('start', t("The 'Include Nodes From' date is not correct, please use the mm/dd/yy format."));
854 $edit['start'] = mktime (1, 0, 0, 1, 1, 1999, -1);
855 }
856
857 // Is Nodes Start time earlier than send out time?
858 if ( $edit['start'] > $send_time) form_set_error('start', t("The 'Include Nodes From' date is later than the send time."));
859
860 }
861 }
862 }
863
864 return;
865 }
866
867
868 function enewsletter_form_content($settings = array()) {
869
870 $allowed_terms = $settings['tid'];
871 if ($settings['enewsletter_id']) $output .= form_hidden ("enewsletter_id" , $settings['enewsletter_id']);
872 if ($settings['last']) $output .= form_hidden ("last" , $settings['last']);
873 $description .= form_textfield(t("Title" ), "title" , $settings[ "title" ], 50, 64, t('Used as the subject line of each email'));
874 $description .= form_textarea(t("Description" ), "description" , $settings[ "description" ], 50, 2, t('Description for subscribers'));
875 $output .= form_group(t('Description'), $description);
876
877 $after_send = form_checkbox(t('Track'), "track", 1, $settings[ "track" ]);
878 $output .= form_group(t('After Sending'), $after_send, t('Track user behaviour after email is sent'));
879 $templates = enewsletter_get_db_rows("SELECT * FROM {enewsletter_templates} WHERE template_id > 2 ORDER BY type");
880
881 foreach($templates as $template) {
882 // set default to text template
883 if ($template->type == '0') {
884 $text_templates["$template->template_id"] = $template->name;
885 } else {
886 $html_templates["$template->template_id"] = $template->name;
887 }
888 }
889
890 $template_select .= form_select(t('Text Template'), 'template_text', $settings['template_text'], $text_templates);
891 $template_select .= form_select(t('HTMLTemplate'), 'template_html', $settings['template_html'], $html_templates);
892 $output .= form_group(t('Templates'), $template_select, t('Select a plain text template and a HTML template'));
893 $header = array(t("include"), t("name"), t("node types"));
894 $vocabularies = taxonomy_get_vocabularies();
895
896 foreach ($vocabularies as $vocabulary) {
897 $links = array();
898 $types = array();
899 foreach(explode(",", $vocabulary->nodes) as $type) {
900 $types[] = node_invoke($type, "node_name");
901 }
902 $rows[] = array('select', $vocabulary->name, array("data" => implode(", ", $types), "align" => "center"));
903
904 $tree = taxonomy_get_tree($vocabulary->vid);
905 if ($tree) {
906 unset($checkboxes);
907 unset($data);
908 foreach ($tree as $term) {
909 $label = _taxonomy_depth($term->depth) ." ". $term->name;
910 if (is_array($allowed_terms)) {
911 $checked = in_array($term->tid, $allowed_terms) ? 1 : 0;
912 } else {
913 $checked = 0;
914 }
915 $checkboxes = form_checkbox($label, "tid][$term->tid", 1, $checked);
916 $rows[] = array(array("data" => $checkboxes, "colspan" => 3));
917 }
918
919 }
920
921 }
922
923 $taxonomy .= theme('table', $header, $rows, array('id' => 'enewsletter-content'));
924 $output .= form_group(t('Content'), $taxonomy);
925 return $output;
926 }
927
928
929 function enewsletter_form_schedule($settings = array()) {
930
931 // Frequency form group
932 $start_date = date ("m/d/y", time());
933 $start_day = date ("l, M j Y", time());
934 if ($settings['enewsletter_id']) $output .= form_hidden ('enewsletter_id', $settings['enewsletter_id']);
935 if ($settings['title']) $output .= form_hidden ('title', $settings[ 'title' ]);
936 if ($settings['last']) $output .= form_hidden ('last', $settings[ 'last' ]);
937 if ($settings[ 'frequency' ] == NULL) $settings[ 'frequency' ] = 'manual';
938
939 if ($settings['enewsletter_id'] != ANNOUNCEMENT) {
940
941 if ($settings[ 'next' ] == NULL OR $settings[ 'next' ] == 0) {
942 $start_hour = ($settings[ 'next_hour' ]) ? $settings[ 'next_hour' ] : '8';
943 } else {
944 $start_hour = date ('G', $settings[ 'next' ]);
945 $start_date = date ('m/d/y', $settings[ 'next' ]);
946 $start_day = date ('l, M j Y', $settings[ 'next' ]);
947 }
948
949 $frequency .= form_textfield (t("Every" ), "every" , $settings[ "every" ], 5, 3);
950 $frequency .= form_radios(t("Frequency"), "frequency", $settings[ 'frequency' ], array('hour' => t('Hour(s)'), 'day' => t('Day(s)'), 'month' => t('Month(s)'), 'manual' => t('Manual')));
951 $output .= form_group(t('Frequency'), $frequency, t('How often this email newsletter should be sent'));
952 }
953
954 // Include start form group
955 // Only needed before first send out
956 if ($settings[ "last" ] == 0) {
957 if ($settings[ "start" ] == NULL OR $settings[ "start" ] == 0) {
958 $nodes_date = '1/1/99';
959 } else {
960 $nodes_date = date ("m/d/y", $settings[ "start" ]);
961 }
962
963 $include_start .= form_textfield (t("Include Nodes From (date)" ),