PageRenderTime 52ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/controllers/subscriptions_controller.php

https://github.com/danfreak/cakephp-newsletter-plugin
PHP | 272 lines | 202 code | 41 blank | 29 comment | 46 complexity | 2d6183f9a655bf5b8a9e2369f5d20102 MD5 | raw file
  1. <?php
  2. /**
  3. * Copyright (c) 2009, Fabio Kreusch
  4. *
  5. * Licensed under The MIT License
  6. * Redistributions of files must retain the above copyright notice.
  7. * @copyright Copyright (c) 2009, Fabio Kreusch
  8. * @link fabio.kreusch.com.br
  9. * @license http://www.opensource.org/licenses/mit-license.php The MIT License
  10. */
  11. class SubscriptionsController extends NewsletterAppController {
  12. var $name = 'Subscriptions';
  13. var $uses = array('Newsletter.Group', 'Newsletter.Subscription');
  14. var $helpers = array('Time');
  15. var $paginate = array(
  16. 'Subscription' => array(
  17. 'limit' => 40,
  18. 'order' => array('Subscription.email' => 'asc')
  19. )
  20. );
  21. function beforeFilter() {
  22. parent::beforeFilter();
  23. $this->Auth->allow('unsubscribe', 'subscribe', 'confirm_subscription');
  24. }
  25. #Public
  26. function unsubscribe() {
  27. if($this->isNotEmpty('Subscription.email')) {
  28. $subscribed = $this->Subscription->find('first', array('conditions' => array('email' => $this->data['Subscription']['email'], 'opt_out_date' => null)));
  29. if($subscribed) {
  30. $this->Subscription->id = $subscribed['Subscription']['id'];
  31. $this->Subscription->saveField('opt_out_date', date('Y-m-d H:i:s'));
  32. #send email
  33. $subject = Configure::read('Newsletter.unsubscribe_subject');
  34. if(!$subject) { $subject = 'Unsubscribe Confirmation'; }
  35. $subscription = $this->Subscription->read();
  36. $this->set('url', Configure::read('Newsletter.subscribe_url'));
  37. $this->sendEmail($subject, 'unsubscribe', $subscription['Subscription']['email']);
  38. $message = Configure::read('Newsletter.unsubscribe_site_message');
  39. if(!$message) {$message = __('The requested email was withdrawn from the mail list', true);}
  40. $this->Session->setFlash($message);
  41. } else {
  42. $message = Configure::read('Newsletter.unsubscribe_not_found_site_message');
  43. if(!$message) {$message = __('Email not in subscription list', true);}
  44. $this->Session->setFlash($message);
  45. }
  46. }
  47. }
  48. function subscribe() {
  49. if(!empty($this->data) && $this->isNotEmpty('Subscription.email')) {
  50. $subscribed = $this->Subscription->findByEmail($this->data['Subscription']['email']);
  51. #if the email isn't yet registered or if it already exists but is into opt_out or it's waiting for confirmation,
  52. #save and set the user confirmation code and send email, otherwise tell the user he already is opt_in
  53. if(empty($subscribed) ||
  54. !empty($subscribed['Subscription']['opt_out_date']) ||
  55. !empty($subscribed['Subscription']['confirmation_code'])
  56. ) {
  57. $confirmation_code = md5(date('Y-m-d H:i:s').$this->data['Subscription']['name'].$this->data['Subscription']['email']);
  58. if(!empty($subscribed)) {
  59. $this->data['Subscription']['id'] = $subscribed['Subscription']['id'];
  60. }
  61. $this->data['Subscription']['confirmation_code'] = $confirmation_code;
  62. $this->Subscription->set($this->data);
  63. $this->Subscription->save();
  64. #adds subscription to default site_group
  65. $site_group = Configure::read('Newsletter.siteGroup');
  66. if(!$site_group) {$site_group = '1';}
  67. $this->Subscription->habtmAdd('Group', $this->Subscription->id, $site_group);
  68. #send email
  69. $subject = Configure::read('Newsletter.subscribe_subject');
  70. if(!$subject) { $subject = 'Subscription Confirmation'; }
  71. $subscription = $this->Subscription->read(null, $this->Subscription->id);
  72. $this->set('confirmation_code', $subscription['Subscription']['confirmation_code']);
  73. $this->set('url', Configure::read('Newsletter.confirm_url'));
  74. $this->sendEmail($subject, 'subscribe', $subscription['Subscription']['email']);
  75. $message = Configure::read('Newsletter.subscribe_site_message');
  76. if(!$message) {$message = __('A confirmation message was sent to your email', true);}
  77. $this->Session->setFlash($message);
  78. } else {
  79. $message = Configure::read('Newsletter.subscribe_already_in_list');
  80. if(!$message) {$message = __('The requested email is already into the list', true);}
  81. $this->Session->setFlash($message);
  82. }
  83. }
  84. }
  85. function confirm_subscription($id) {
  86. $subscribed = $this->Subscription->findByConfirmationCode($id);
  87. if(!empty($id) && !empty($subscribed)) {
  88. $this->Subscription->set($subscribed);
  89. $this->Subscription->saveField('opt_out_date', null);
  90. $this->Subscription->saveField('confirmation_code', null);
  91. $this->set('subscribed', $subscribed);
  92. $message = Configure::read('Newsletter.subscribe_confirmation');
  93. if(!$message) {$message = __('Subscription confirmed', true);}
  94. $this->Session->setFlash($message);
  95. } else {
  96. $message = Configure::read('Newsletter.subscribe_confirmation_invalid');
  97. if(!$message) {$message = __('Invalid confirmation code', true);}
  98. $this->Session->setFlash($message);
  99. }
  100. }
  101. #Admin
  102. function admin_index() {
  103. $conditions = null;
  104. if($this->isNotEmpty('Filter.value')) {
  105. $filter = $this->data['Filter']['value'];
  106. $conditions = array('OR' => array(
  107. 'Subscription.name LIKE' => '%'.$filter.'%',
  108. 'Subscription.email LIKE' => '%'.$filter.'%',
  109. )
  110. );
  111. }
  112. $this->set('subscriptions', $this -> paginate('Subscription', $conditions));
  113. $this->set('groups', $this->Group->find('list'));
  114. $this->set('siteGroup', Configure::read('Newsletter.siteGroup'));
  115. }
  116. function admin_add() {
  117. if(!empty($this->data)) {
  118. $this->Subscription->set($this->data);
  119. if($this->Subscription->save()) {
  120. $this->Session->setFlash(__('Subscription successfully added', true));
  121. $this->redirect(array('action' => 'index'));
  122. }
  123. }
  124. $this->set('siteGroup', Configure::read('Newsletter.siteGroup'));
  125. $this->set('groups', $this->Group->find('list'));
  126. }
  127. function admin_edit($id = null) {
  128. if(!$id) {
  129. $this->Session->setFlash(__('Invalid subscription id', true));
  130. $this->redirect(array('action' => 'index'));
  131. }
  132. if( empty($this->data) ) {
  133. $this->data = $this->Subscription->read(null, $id);
  134. } else {
  135. $this->Subscription->set($this->data);
  136. if( $this->Subscription->save() ) {
  137. $this->Session->setFlash(__('Subscription successfully saved', true));
  138. }
  139. }
  140. $this->set('groups', $this->Group->find('list'));
  141. }
  142. function admin_delete($id) {
  143. $this->autoRender = false;
  144. if($this->Subscription->delete($id)) {
  145. $this->Session->setFlash(__('Subscription deleted', true));
  146. } else {
  147. $this->Session->setFlash(__('Deleting failed', true));
  148. }
  149. $this->redirect(array('action' => 'index'));
  150. }
  151. # TODO tratement for if the admin is in a paginate specific page
  152. function admin_invert_opt_out($id) {
  153. $this->Subscription->id = $id;
  154. $subscribed = $this->Subscription->read();
  155. if($subscribed['Subscription']['opt_out_date']) {
  156. $this->Subscription->saveField('opt_out_date', null);
  157. } else {
  158. $this->Subscription->saveField('opt_out_date', date('Y-m-d H:i:s'));
  159. }
  160. $subscribed = $this->Subscription->read();
  161. $this->layout = 'clean';
  162. $this->set('subscription', $subscribed);
  163. }
  164. function admin_import_csv() {
  165. if (!empty($this->data) && is_uploaded_file($this->data['Subscription']['csv']['tmp_name'])) {
  166. set_time_limit(0);
  167. $lines = $this->readUploadedCSV($this->data['Subscription']['csv']['tmp_name']);
  168. $errors = array();
  169. $data = array();
  170. foreach($lines as $number => $line) {
  171. $error = $this->validateCSVLine($line, ($number+1));
  172. if(count($error)>0) {
  173. $errors = array_merge($errors, $error);
  174. } else {
  175. if(!array_key_exists(1, $line)) {
  176. $line[1] = '';
  177. }
  178. array_push($data, $line);
  179. }
  180. }
  181. $this->Subscription->importCsv($data, $this->data['Group']['Group']);
  182. $this->set('errors', $errors);
  183. if(!empty($errors)) {
  184. $message = "<ul>";
  185. foreach ($errors as $error) {
  186. $message .= "<li>$error</li>";
  187. }
  188. $message .= "</ul>";
  189. $message = __('Data imported, but there where the following errors: ', true).$message;
  190. } else {
  191. $message = __('Data imported', true);
  192. }
  193. $this->Session->setFlash($message);
  194. $this->redirect(array('action' => 'index'));
  195. } else {
  196. $this->Session->setFlash(__('No data to import', true));
  197. $this->redirect(array('action' => 'index'));
  198. }
  199. }
  200. /**
  201. * Reads a CSV file and returns a list with each line.
  202. * @param $tmp_name The CSV path.
  203. * @return An array with each line.
  204. * @access private
  205. **/
  206. function readUploadedCSV($tmp_name) {
  207. $lines = array();
  208. ini_set('auto_detect_line_endings',1);
  209. $handle = fopen($tmp_name, "r");
  210. while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  211. array_push($lines,$data);
  212. }
  213. return $lines;
  214. }
  215. /**
  216. * Validates a csv line, verifying if it has a valid email.
  217. * @param $list A csv array as returned by _read_uploaded_csv().
  218. * @return Array with errors, if any. False otherwise.
  219. * @access true
  220. **/
  221. function validateCSVLine($line, $line_number) {
  222. $errors = array();
  223. if(!is_array($line)) {
  224. array_push($errors,'Invalid line');
  225. }
  226. if($line[0] == null || $line[0] == '') {
  227. array_push($errors, "Error in line $line_number: blank email");
  228. }
  229. return $errors;
  230. }
  231. }