1 <?php
2
3 4 5 6 7
8 class NewsletterAdmin extends LeftAndMain {
9
10 static $subitem_class = 'Member';
11 static $most_recent_seperator = 5;
12 static $template_path = null;
13 static $template_paths = null;
14 static $allowed_actions = array(
15 'adddraft',
16 'addgroup',
17 'addtype',
18 'autocomplete',
19 'displayfilefield',
20 'exportrecipients',
21 'getformcontent',
22 'getsentstatusreport',
23 'getsitetree',
24 'memberblacklisttoggle',
25 'newmember',
26 'preview',
27 'remove',
28 'removebouncedmember',
29 'removenewsletter',
30 'save',
31 'savemember',
32 'savenewsletter',
33 'sendnewsletter',
34 'showdrafts',
35 'showmailtype',
36 'shownewsletter',
37 'showrecipients',
38 'showsent',
39 'MailingListEditForm',
40 'TypeEditForm',
41 'UploadForm',
42 'NewsletterEditForm',
43 );
44 static $url_segment = 'newsletter';
45 static $url_rule = '/$Action/$ID/$OtherID';
46 static = 'Newsletter';
47 protected static $makeSendNewslettersReadonly = true;
48
49 static function setSendNewslettersReadonly($val = true) {
50 self::$makeSendNewslettersReadonly = $val;
51 }
52
53 public function init() {
54 parent::init();
55
56 Requirements::javascript(MCE_ROOT . 'tiny_mce_src.js');
57 Requirements::javascript(THIRDPARTY_DIR . '/tiny_mce_improvements.js');
58
59 Requirements::javascript(THIRDPARTY_DIR . '/hover.js');
60 Requirements::javascript(THIRDPARTY_DIR . '/scriptaculous/controls.js');
61
62 Requirements::javascript(CMS_DIR . '/javascript/SecurityAdmin.js');
63
64 Requirements::javascript(CMS_DIR . '/javascript/LeftAndMain_left.js');
65 Requirements::javascript(CMS_DIR . '/javascript/LeftAndMain_right.js');
66 Requirements::javascript(CMS_DIR . '/javascript/CMSMain_left.js');
67
68 Requirements::javascript('newsletter/javascript/NewsletterAdmin_left.js');
69 Requirements::javascript('newsletter/javascript/NewsletterAdmin_right.js');
70 Requirements::javascript('newsletter/javascript/ProgressBar.js');
71
72
73 if (!Director::is_ajax()) {
74 Requirements::javascript(MCE_ROOT . 'tiny_mce_src.js');
75 HtmlEditorConfig::get('cms')->setOption('ContentCSS', project() . '/css/editor.css');
76 HtmlEditorConfig::get('cms')->setOption('Lang', i18n::get_tinymce_lang());
77 }
78
79
80 Requirements::block(SAPPHIRE_DIR . '/javascript/HtmlEditorField.js');
81
82 Requirements::css('newsletter/css/NewsletterAdmin.css');
83 }
84
85 public function remove() {
86 $ids = explode(',', $_REQUEST['csvIDs']);
87
88 $count = 0;
89 foreach ($ids as $id) {
90 if (preg_match('/^mailtype_(\d+)$/', $id, $matches))
91 $record = DataObject::get_by_id('NewsletterType', $matches[1]);
92 else if (preg_match('/^[a-z]+_\d+_(\d+)$/', $id, $matches))
93 $record = DataObject::get_by_id('Newsletter', $matches[1]);
94
95 if ($record) {
96 $record->delete();
97 }
98
99 FormResponse::add("removeTreeNodeByIdx(\$('sitetree'), '$id' );");
100
101 FormResponse::add("$('Form_EditForm').closeIfSetTo('$matches[1]');");
102 $count++;
103 }
104
105 FormResponse::status_message('Deleted ' . $count . ' items', 'good');
106
107 return FormResponse::respond();
108 }
109
110
111 public function currentPageID() {
112 if(isset($_REQUEST['ID']) && is_numeric($_REQUEST['ID'])) {
113 return $_REQUEST['ID'];
114 } elseif (isset($this->urlParams['ID']) && is_numeric($this->urlParams['ID'])) {
115 return $this->urlParams['ID'];
116 } elseif(Session::get("currentPage")) {
117 return Session::get("currentPage");
118 } else {
119 return null;
120 }
121 }
122
123 public function getformcontent() {
124 Session::set('currentPage', $_REQUEST['ID']);
125 Session::set('currentType', $_REQUEST['type']);
126
127 if ($_REQUEST['otherID']) {
128 Session::set('currentOtherID', $_REQUEST['otherID']);
129 }
130
131 SSViewer::setOption('rewriteHashlinks', false);
132
133 $result = $this->renderWith($this->class . '_right');
134
135 return $this->getLastFormIn($result);
136 }
137
138 139 140 141
142 public function showrecipients($params) {
143 $params = $params->allParams();
144 return $this->showWithEditForm($params, $this->getMailingListEditForm($params['ID']));
145 }
146
147 148 149 150 151
152 public function shownewsletter($params) {
153 if ($params instanceof SS_HTTPRequest) {
154 $params = $params->allParams();
155 }
156 if (is_numeric($params['ID'])) {
157 return $this->showWithEditForm($params, $this->getNewsletterEditForm($params['ID']));
158 }
159 return null;
160 }
161
162 163 164 165 166
167 public function preview($request) {
168 $newsletterID = (int) $request->param('ID');
169 $obj = DataObject::get_by_id('Newsletter', $newsletterID);
170 $templateName = ($obj && ($obj->Parent()->Template)) ? $obj->Parent()->Template : 'GenericEmail';
171
172
173 Requirements::clear();
174
175
176 $obj->Body = $obj->Content;
177 $obj->NewsLetterData = $obj;
178
179 return $this->customise($obj)->renderWith($templateName);
180 }
181
182 183 184 185
186 public function showmailtype($params) {
187 $params = $params->allParams();
188 return $this->showWithEditForm($params, $this->getNewsletterTypeEditForm($params['ID']));
189 }
190
191 192 193 194
195 public function showdrafts($params) {
196 $params = $params->allParams();
197 return $this->ShowNewsletterFolder($params, 'Draft');
198 }
199
200 201 202 203
204 public function showsent($params) {
205 $params = $params->allParams();
206 return $this->ShowNewsletterFolder($params, 'Sent');
207 }
208
209 210 211 212 213
214 public function ShowNewsletterFolder($params, $type) {
215 $id = $params['ID'];
216 if (!is_numeric($id)) {
217 $id = Session::get('currentPage');
218 }
219 if (is_a($id, 'NewsletterType')) {
220 $mailType = $id;
221 $id = $mailType->ID;
222 } else {
223 if ($id && is_numeric($id)) {
224 $mailType = DataObject::get_by_id('NewsletterType', $id);
225 }
226 }
227 $draftList = new NewsletterList($type, $mailType, $type);
228 return $draftList->renderWith("NewsletterList");
229 }
230
231 232 233
234 private function showWithEditForm($params, $editForm) {
235 if (isset($params['ID'])) {
236 Session::set("currentPage", $params['ID']);
237 }
238 if (isset($params['OtherID'])) {
239 Session::set('currentMember', $params['OtherID']);
240 }
241 if (Director::is_ajax()) {
242 SSViewer::setOption('rewriteHashlinks', false);
243 return $editForm->formHtmlContent();
244 } else {
245 return array();
246 }
247 }
248
249 public function getEditForm($id) {
250 $form = $this->getNewsletterTypeEditForm($id);
251 $form->disableDefaultAction();
252 return $form;
253 }
254
255 256 257
258 public function EditForm() {
259
260 HtmlEditorField::include_js();
261
262 if ((isset($_REQUEST['ID']) && isset($_REQUEST['Type']) && $_REQUEST['Type'] == 'Newsletter') || isset($_REQUEST['action_savenewsletter'])) {
263 $form = $this->NewsletterEditForm();
264 } else {
265
266
267 if ((isset($_REQUEST['fieldName']) && 'Recipients' == $_REQUEST['fieldName']) || (!empty($_REQUEST['MemberSearch']))) {
268 $form = $this->MailingListEditForm();
269 } else {
270 $form = $this->TypeEditForm();
271 }
272 }
273 if ($form)
274 $form->disableDefaultAction();
275 return $form;
276 }
277
278 public function NewsletterEditForm() {
279 $id = isset($_REQUEST['ID']) ? $_REQUEST['ID'] : $this->currentPageID();
280 if (!is_numeric($id)) {
281 $id = 0;
282 }
283 return $this->getNewsletterEditForm($id);
284 }
285
286 public function TypeEditForm() {
287 $id = isset($_REQUEST['ID']) ? $_REQUEST['ID'] : $this->currentPageID();
288 if (!is_numeric($id)) {
289 $id = 0;
290 }
291 return $this->getNewsletterTypeEditForm($id);
292 }
293
294 public function MailingListEditForm() {
295 $id = isset($_REQUEST['ID']) ? $_REQUEST['ID'] : $this->currentPageID();
296 return $this->getMailingListEditForm($id);
297 }
298
299 public function getNewsletterTypeEditForm($id) {
300 if (!is_numeric($id)) {
301 $id = Session::get('currentPage');
302 }
303 if (is_a($id, 'NewsletterType')) {
304 $mailType = $id;
305 $id = $mailType->ID;
306 } else {
307 if ($id && is_numeric($id)) {
308 $mailType = DataObject::get_by_id('NewsletterType', $id);
309 }
310 }
311
312 if (isset($mailType) && is_object($mailType) && $mailType->GroupID) {
313 $group = DataObject::get_one("Group", "ID = $mailType->GroupID");
314 }
315 if (isset($mailType) && $mailType) {
316 $fields = $mailType->getCMSFields();
317
318 $fields->push($idField = new HiddenField("ID"));
319 $fields->push(new HiddenField("executeForm", "", "TypeEditForm"));
320 $idField->setValue($id);
321
322 $actions = new FieldSet(new FormAction('save', _t('NewsletterAdmin.SAVE', 'Save')));
323
324 $form = new Form($this, "TypeEditForm", $fields, $actions);
325 $form->loadDataFrom($mailType);
326
327 $form->setHTMLID('Form_EditForm');
328 } else {
329 $form = false;
330 }
331
332 return $form;
333 }
334
335 public function getMailingListEditForm($id) {
336 if (!is_numeric($id)) {
337 $id = Session::get('currentPage');
338 }
339 if (is_a($id, 'NewsletterType')) {
340 $mailType = $id;
341 $id = $mailType->ID;
342 } else {
343 if ($id && is_numeric($id)) {
344 $mailType = DataObject::get_by_id('NewsletterType', $id);
345 }
346 }
347 $group = null;
348
349 if (isset($mailType) && is_object($mailType) && $mailType->GroupID) {
350 $group = DataObject::get_one("Group", "ID = $mailType->GroupID");
351 }
352
353 if (isset($mailType) && is_object($mailType)) {
354 $fields = new FieldSet(
355 new TabSet("Root",
356 new Tab('Recipients', _t('NewsletterAdmin.RECIPIENTS', 'Recipients'),
357 $recipients = new MemberTableField(
358 $this,
359 "Recipients",
360 $group
361 ),
362 $exportField = new RecipientExportField("ExportRecipients", _t('NewsletterAdmin.EXPORTRECIPIENTS', 'Export Newsletter Recipients'), $group)
363 ),
364 new Tab('Import', _t('NewsletterAdmin.IMPORT', 'Import'),
365 $importField = new RecipientImportField("ImportFile", _t('NewsletterAdmin.IMPORTFROM', 'Import from file'), $group)
366 ),
367 new Tab('Unsubscribers', _t('NewsletterAdmin.UNSUBSCRIBERS', 'Unsubscribers'),
368 $unsubscribedList = new UnsubscribedList("Unsubscribed", $mailType)
369 ),
370 new Tab('Bounced', _t('NewsletterAdmin.BOUNCED', 'Bounced'), $bouncedList = new BouncedList("Bounced", $mailType)
371 )
372 )
373 );
374
375 $recipients->setController($this);
376 $importField->setController($this);
377 $exportField->setController($this);
378 $unsubscribedList->setController($this);
379 $bouncedList->setController($this);
380
381 $importField->setTypeID($id);
382 $exportField->setTypeID($id);
383
384 $fields->push($idField = new HiddenField("ID"));
385 $fields->push(new HiddenField("executeForm", "", "MailingListEditForm"));
386 $idField->setValue($id);
387
388 $actions = new FieldSet(new HiddenField("save"));
389
390 $form = new Form($this, "MailingListEditForm", $fields, $actions);
391 $form->loadDataFrom(array(
392 'Title' => $mailType->Title,
393 'FromEmail' => $mailType->FromEmail
394 ));
395
396 $form->setHTMLID('Form_EditForm');
397 } else {
398 $form = false;
399 }
400
401 return $form;
402 }
403
404 405 406 407 408
409 function removebouncedmember($params) {
410 $params = $params->allParams();
411
412
413 $id = Convert::raw2sql($params['ID']);
414 if (is_numeric($id)) {
415 $bounceObject = DataObject::get_by_id('Email_BounceRecord', $id);
416 if ($bounceObject) {
417
418 $bounceObject->delete();
419
420 $memberObject = DataObject::get_by_id('Member', $bounceObject->MemberID);
421 $groupID = Convert::raw2sql($_REQUEST['GroupID']);
422 if (is_numeric($groupID) && is_object($memberObject)) {
423
424 $memberObject->Groups()->remove($groupID);
425 } else {
426 user_error("NewsletterAdmin::removebouncedmember: Bad parameters: Group=$groupID, Member=" . $bounceObject->MemberID, E_USER_ERROR);
427 }
428 FormResponse::status_message($memberObject->Email . ' ' . _t('NewsletterAdmin.REMOVEDSUCCESS', 'was removed from the mailing list'), 'good');
429 FormResponse::add("$('Form_EditForm').getPageFromServer($('Form_EditForm_ID').value, 'recipients');");
430 return FormResponse::respond();
431 }
432 } else {
433 user_error("NewsletterAdmin::removebouncedmember: Bad parameters: Group=$groupID, Member=" . $bounceObject->MemberID, E_USER_ERROR);
434 }
435 }
436
437 438 439 440
441 function getsentstatusreport($params) {
442 $params = $params->allParams();
443 if (Director::is_ajax()) {
444 $newsletter = DataObject::get_by_id('Newsletter', $params['ID']);
445 $sent_status_report = $newsletter->renderWith("Newsletter_SentStatusReport");
446 return $sent_status_report;
447 }
448 }
449
450 451 452 453 454 455 456
457 public static function template_path() {
458 user_error("NewsletterAdmin::template_path() is deprecated; use NewsletterAdmin::template_paths() and NewsletterAdmin::templateSource()", E_USER_NOTICE);
459 if (self::$template_path)
460 return self::$template_path;
461 else
462 return self::$template_path = project() . '/templates/email';
463 }
464
465 466 467 468 469 470 471 472
473 public static function template_paths() {
474 if (!isset(self::$template_paths)) {
475 if (file_exists(BASE_PATH . "/" . THEMES_DIR . "/" . SSViewer::current_theme() . "/templates/email")) {
476 self::$template_paths[] = THEMES_DIR . "/" . SSViewer::current_theme() . "/templates/email";
477 }
478
479 if (file_exists(BASE_PATH . "/" . THEMES_DIR . "/" . SSViewer::current_theme() . "/templates/Email")) {
480 self::$template_paths[] = THEMES_DIR . "/" . SSViewer::current_theme() . "/templates/Email";
481 }
482
483 if (file_exists(BASE_PATH . "/" . project() . '/templates/email')) {
484 self::$template_paths[] = project() . '/templates/email';
485 }
486
487 if (file_exists(BASE_PATH . "/" . project() . '/templates/Email')) {
488 self::$template_paths[] = project() . '/templates/Email';
489 }
490 }
491
492 return self::$template_paths;
493 }
494
495 496 497 498 499
500 public function templateSource() {
501 $paths = self::template_paths();
502 $templates = array("" => _t('TemplateList.NONE', 'None'));
503
504 if (isset($paths) && count($paths)) {
505 $absPath = Director::baseFolder();
506 if ($absPath{strlen($absPath) - 1} != "/")
507 $absPath .= "/";
508
509 foreach ($paths as $path) {
510 $path = $absPath . $path;
511 if (is_dir($path)) {
512 $templateDir = opendir($path);
513
514
515 while (( $templateFile = readdir($templateDir) ) !== false) {
516
517 if (preg_match('/(.*)\.ss$/', $templateFile, $match)) {
518 $templates[$match[1]] = $match[1];
519 }
520 }
521 }
522 }
523 }
524 return $templates;
525 }
526
527 528 529 530 531
532
533 public function getNewsletterEditForm($myId) {
534 $email = DataObject::get_by_id("Newsletter", $myId);
535 if ($email) {
536
537 $fields = $email->getCMSFields($this);
538 $fields->push($idField = new HiddenField("ID"));
539 $idField->setValue($myId);
540 $fields->push($ParentidField = new HiddenField("ParentID"));
541 $ParentidField->setValue($email->ParentID);
542 $fields->push($typeField = new HiddenField("Type"));
543 $typeField->setValue('Newsletter');
544
545
546 $actions = new FieldSet();
547
548 if ($email->SentDate)
549 $actions->push(new FormAction('send', _t('NewsletterAdmin.RESEND', 'Resend')));
550 else
551 $actions->push(new FormAction('send', _t('NewsletterAdmin.SEND', 'Send...')));
552
553 $actions->push(new FormAction('save', _t('NewsletterAdmin.SAVE')));
554
555 $form = new Form($this, "NewsletterEditForm", $fields, $actions);
556 $form->loadDataFrom($email);
557
558 $form->setHTMLID('Form_EditForm');
559
560 if (self::$makeSendNewslettersReadonly && $email->Status != 'Draft') {
561 $readonlyFields = $form->Fields()->makeReadonly();
562 $form->setFields($readonlyFields);
563 }
564
565
566
567 return $form;
568 } else {
569 user_error('Unknown Email ID: ' . $myId, E_USER_ERROR);
570 }
571 }
572
573 public function SendProgressBar() {
574 $progressBar = new ProgressBar('SendProgressBar', _t('NewsletterAdmin.SENDING', 'Sending emails...'));
575 return $progressBar->FieldHolder();
576 }
577
578 public function sendnewsletter() {
579
580 $id = isset($_REQUEST['ID']) ? $_REQUEST['ID'] : $_REQUEST['NewsletterID'];
581
582 if (!$id) {
583 FormResponse::status_message(_t('NewsletterAdmin.NONLSPECIFIED', 'No newsletter specified'), 'bad');
584 return FormResponse::respond();
585 }
586
587 $newsletter = DataObject::get_by_id("Newsletter", $id);
588 $nlType = $newsletter->getNewsletterType();
589
590 $e = new Newsletter_Email($nlType);
591 $e->Body = $body = $newsletter->Content;
592 $e->Subject = $subject = $newsletter->Subject;
593
594
595
596 if ($nlType && $nlType->FromEmail)
597 $e->From = $from = $nlType->FromEmail;
598 else
599 $e->From = $from = Email::getAdminEmail();
600
601 if (isset($_REQUEST['TestEmail']))
602 $e->To = $_REQUEST['TestEmail'];
603 $e->setTemplate($nlType->Template);
604 $e->populateTemplate(array(
605 'NewsLetterData'=> $newsletter
606 ));
607 $messageID = base64_encode($newsletter->ID . '_' . date('d-m-Y H:i:s'));
608
609 switch ($_REQUEST['SendType']) {
610 case "Test":
611 if ($_REQUEST['TestEmail']) {
612 $e->To = $_REQUEST['TestEmail'];
613 $e->setTemplate($nlType->Template);
614
615 self::sendToAddress($e, $_REQUEST['TestEmail'], $messageID);
616 FormResponse::status_message(_t('NewsletterAdmin.SENTTESTTO', 'Sent test to ') . $_REQUEST['TestEmail'], 'good');
617 } else {
618 FormResponse::status_message(_t('NewsletterAdmin.PLEASEENTERMAIL', 'Please enter an email address'), 'bad');
619 }
620 break;
621 case "List":
622
623 $groupID = $nlType->GroupID;
624 $group = DataObject::get_by_id('Group', $groupID);
625 if ($group) {
626 $members = $group->Members();
627 if ($members) {
628 echo self::sendToList($subject, $body, $from, $newsletter, $nlType, $messageID,$members);
629 }
630 }
631 break;
632 case "Unsent":
633
634 $only_to_unsent = 1;
635 echo self::sendToList($subject, $body, $from, $newsletter, $nlType, $messageID, $newsletter->UnsentSubscribers());
636 break;
637 }
638
639 return FormResponse::respond();
640 }
641
642 static function sendToAddress($email, $address, $messageID = null) {
643 $email->To = $address;
644 $email->send();
645 }
646
647 static function sendToList($subject, $body, $from, $newsletter, $nlType, $messageID = null, $recipients) {
648 $emailProcess = new NewsletterEmailProcess($subject, $body, $from, $newsletter, $nlType, $messageID, $recipients);
649 return $emailProcess->start();
650 }
651
652 653 654 655 656 657
658 public function save($params, $form) {
659 if (is_object($params))
660 $params = $params->allParams();
661
662
663
664
665 if (isset($_REQUEST['Type']) && $_REQUEST['Type'] == 'Newsletter') {
666 return $this->savenewsletter($params, $form);
667 }
668
669 $id = $_REQUEST['ID'];
670 $className = 'NewsletterType';
671
672 if (defined('DB::USE_ANSI_SQL')) {
673 $record = DataObject::get_one($className, "\"$className\".ID = $id");
674 } else {
675 $record = DataObject::get_one($className, "`$className`.ID = $id");
676 }
677
678
679 $record->Template = addslashes($_REQUEST['Template']);
680
681 $form->saveInto($record);
682 $record->write();
683
684 FormResponse::set_node_title("mailtype_$id", $record->Title);
685 FormResponse::status_message(_t('NewsletterAdmin.SAVED', 'Saved'), 'good');
686 $result = $this->getActionUpdateJS($record);
687 return FormResponse::respond();
688 }
689
690 691 692
693
694 public function savenewsletter($urlParams, $form) {
695 $id = $_REQUEST['ID'];
696
697 $className = 'Newsletter';
698 if (defined('DB::USE_ANSI_SQL')) {
699 $record = DataObject::get_one($className, "\"$className\".ID = $id");
700 } else {
701 $record = DataObject::get_one($className, "`$className`.ID = $id");
702 }
703
704
705 $type = $record->getNewsletterType();
706
707 $form->saveInto($record);
708 $record->write();
709
710 $id = 'draft_' . $record->ParentID . '_' . $record->ID;
711
712 FormResponse::set_node_title($id, $record->Title);
713 FormResponse::status_message('Saved', 'good');
714
715 $actionList = '';
716 foreach ($form->Actions() as $action) {
717 $actionList .= $action->Field() . ' ';
718 }
719 FormResponse::add("$('Form_EditForm').loadActionsFromString('" . Convert::raw2js($actionList) . "');");
720 return FormResponse::respond();
721 }
722
723 724 725 726
727
728 public function memberblacklisttoggle($urlParams) {
729 $id = $urlParams->param('ID');
730 if ($bounceObject = DataObject::get_by_id('Email_BounceRecord', $id)) {
731 if ($memberObject = DataObject::get_by_id('Member', $bounceObject->MemberID)) {
732
733 if (FALSE == $memberObject->BlacklistedEmail) {
734 $memberObject->setBlacklistedEmail(TRUE);
735 FormResponse::status_message($memberObject->Email . ' ' . _t('NewsletterAdmin.ADDEDTOBL', 'was added to blacklist'), 'good');
736 } else {
737
738 $memberObject->setBlacklistedEmail(FALSE);
739 FormResponse::status_message($memberObject->Email . ' ' . _t('NewsletterAdmin.REMOVEDFROMBL', 'was removed from blacklist'), 'good');
740 }
741 }
742 }
743 return FormResponse::respond();
744 }
745
746 function NewsletterAdminSiteTree() {
747 return $this->getsitetree();
748 }
749
750 function getsitetree() {
751 return $this->renderWith('NewsletterAdmin_SiteTree');
752 }
753
754 755 756 757 758
759 public function SiteTreeAsUL() {
760 return "Please refresh the page";
761 }
762
763 public function AddRecordForm() {
764 $m = new MemberTableField($this, "Members", $this->currentPageID());
765 return $m->AddRecordForm();
766 }
767
768 769 770
771 public function autocomplete() {
772 $fieldName = $this->urlParams['ID'];
773 $fieldVal = $_REQUEST[$fieldName];
774
775 $matches = DataObject::get("Member", "$fieldName LIKE '" . addslashes($fieldVal) . "%'");
776 if ($matches) {
777 echo "<ul>";
778 foreach ($matches as $match) {
779 $data = $match->FirstName;
780 $data .= ",$match->Surname";
781 $data .= ",$match->Email";
782 $data .= ",$match->Password";
783 echo "<li>" . $match->$fieldName . "<span class=\"informal\">($match->FirstName $match->Surname, $match->Email)</span><span class=\"informal data\">$data</li>";
784 }
785 echo "</ul>";
786 }
787 }
788
789 function savemember() {
790 $data = $_REQUEST;
791
792 $className = $this->stat('subitem_class');
793
794 $id = $_REQUEST['ID'];
795 if ($id == 'new')
796 $id = null;
797
798 if ($id) {
799 if (defined('DB::USE_ANSI_SQL')) {
800 $record = DataObject::get_one($className, "\"$className\".ID = $id");
801 } else {
802 $record = DataObject::get_one($className, "`$className`.ID = $id");
803 }
804 } else {
805
806 $record = new $className();
807 }
808
809 $record->update($data);
810 $record->ID = $id;
811 $record->write();
812
813 $record->Groups()->add($data['GroupID']);
814
815 $FirstName = Convert::raw2js($record->FirstName);
816 $Surname = Convert::raw2js($record->Surname);
817 $Email = Convert::raw2js($record->Email);
818 $Password = Convert::raw2js($record->Password);
819 $response = <<<JS
820 $('MemberList').setRecordDetails($record->ID, {
821 FirstName : "$FirstName",
822 Surname : "$Surname",
823 Email : "$Email"
824 });
825 $('MemberList').clearAddForm();
826 JS;
827 FormResponse::add($response);
828 FormResponse::status_message(_t('NewsletterAdmin.SAVED'), 'good');
829
830 return FormResponse::respond();
831 }
832
833 public function NewsletterTypes() {
834 return DataObject::get("NewsletterType", "");
835 }
836
837 838 839 840
841 public function addtype($params) {
842 $params = $params->allParams();
843 $params['ID'] = $typeid = $this->newNewsletterType();
844
845 $form = $this->getNewsletterTypeEditForm($typeid);
846 return $this->showWithEditForm($params, $form);
847 }
848
849 850 851 852
853 public function adddraft($params) {
854 $params = $params->allParams();
855
856 $draftID = $this->newDraft($_REQUEST['ParentID']);
857
858 $params['ID'] = $draftID;
859 return $this->shownewsletter($params);
860 }
861
862 863 864
865 private function newNewsletterType() {
866
867
868 $newsletterType = new NewsletterType();
869 $newsletterType->Title = _t('NewsletterAdmin.NEWNEWSLTYPE', 'New newsletter type');
870 $newsletterType->write();
871
872
873 return $newsletterType->ID;
874 }
875
876 private function newDraft($parentID) {
877 if (!$parentID || !is_numeric($parentID)) {
878 $parent = DataObject::get_one("NewsletterType");
879 if ($parent) {
880 $parentID = $parent->ID;
881 } else {
882
883 $parentID = $this->newNewsletterType();
884 }
885 }
886 if ($parentID && is_numeric($parentID)) {
887 $parent = DataObject::get_by_id("NewsletterType", $parentID);
888
889 if (!$parent) {
890 $parentID = $this->newNewsletterType();
891 }
892 $newsletter = new Newsletter();
893 $newsletter->Status = 'Draft';
894 $newsletter->Title = $newsletter->Subject = _t('NewsletterAdmin.MEWDRAFTMEWSL', 'New draft newsletter');
895 $newsletter->ParentID = $parentID;
896 $newsletter->write();
897 } else {
898 user_error("You must first create a newsletter type before creating a draft", E_USER_ERROR);
899 }
900
901 return $newsletter->ID;
902 }
903
904 public function newmember() {
905 Session::clear('currentMember');
906 $newMemberForm = array(
907 "MemberForm" => $this->getMemberForm('new'),
908 );
909
910 if (Director::is_ajax()) {
911 SSViewer::setOption('rewriteHashlinks', false);
912 $customised = $this->customise($newMemberForm);
913 $result = $customised->renderWith($this->class . "_rightbottom");
914 $parts = split('</?form[^>]*>', $result);
915 echo $parts[1];
916 } else {
917 return $newMemberForm;
918 }
919 }
920
921 public function EditedMember() {
922 if (Session::get('currentMember'))
923 return DataObject::get_by_id("Member", Session::get('currentMember'));
924 }
925
926 public function Link($action = null) {
927 return "admin/newsletter/";
928 }
929
930 public function displayfilefield() {
931
932 $id = $this->urlParams['ID'];
933
934 return $this->customise(array('ID' => $id, "UploadForm" => $this->UploadForm()))->renderWith('Newsletter_RecipientImportField');
935 }
936
937 public function exportrecipients() {
938 if ($newsletter = DataObject::get_by_id('NewsletterType', (int)$this->urlParams['ID'])) {
939 $csv = "FirstName;Surname;Email\n";
940 foreach($newsletter->Recipients() as $recipient) {
941 $csv .= "{$recipient->FirstName};{$recipient->Surname};{$recipient->Email}\n";
942 }
943 $rs = Controller::curr()->getResponse();
944 $rs->addHeader('Content-Type', 'application/csv');
945 $rs->addHeader('Content-Disposition', 'attachment; filename=recipients.csv');
946
947 $rs->addHeader('Cache-Control', 'must-revalidate');
948 $rs->addHeader('Expires', '0');
949 echo $csv;
950 return;
951 }
952 return $this->customise(array('ID' => $id, "UploadForm" => $this->UploadForm()))->renderWith('Newsletter_RecipientImportField');
953 }
954
955 function UploadForm($id = null) {
956
957 if (!$id)
958 $id = $this->urlParams['ID'];
959
960 $fields = new FieldSet(
961 new FileField("ImportFile", ""),
962
963 new HiddenField("ID", "", $id)
964 );
965
966 $actions = new FieldSet(
967 new FormAction("action_import", _t('NewsletterAdmin.SHOWCONTENTS', 'Show contents'))
968 );
969
970 $form = new RecipientImportField_UploadForm($this, "UploadForm", $fields, $actions);
971 $form->disableSecurityToken();
972 return $form;
973 }
974
975 function () {
976 return _t('LeftAndMain.NEWSLETTERS', "Newsletters", PR_HIGH, "Menu title");
977 }
978
979 }
980
981 ?>
982
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-