PageRenderTime 64ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/system/expressionengine/modules/mailinglist/mcp.mailinglist.php

https://bitbucket.org/tdevonshire/hoolux
PHP | 614 lines | 387 code | 143 blank | 84 comment | 46 complexity | 35bfe45e18716d06fe31378cefa5325e MD5 | raw file
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2. /**
  3. * ExpressionEngine - by EllisLab
  4. *
  5. * @package ExpressionEngine
  6. * @author EllisLab Dev Team
  7. * @copyright Copyright (c) 2003 - 2012, EllisLab, Inc.
  8. * @license http://ellislab.com/expressionengine/user-guide/license.html
  9. * @link http://ellislab.com
  10. * @since Version 2.0
  11. * @filesource
  12. */
  13. // ------------------------------------------------------------------------
  14. /**
  15. * ExpressionEngine Mailing List Module
  16. *
  17. * @package ExpressionEngine
  18. * @subpackage Modules
  19. * @category Modules
  20. * @author EllisLab Dev Team
  21. * @link http://ellislab.com
  22. */
  23. class Mailinglist_mcp {
  24. var $perpage = 100;
  25. /**
  26. * Constructor
  27. */
  28. function Mailinglist_mcp($switch = TRUE)
  29. {
  30. // Make a local reference to the ExpressionEngine super object
  31. $this->EE =& get_instance();
  32. $this->EE->cp->set_right_nav(array(
  33. 'ml_create_new' => BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist'.AMP.'method=edit_mailing_list',
  34. 'mailinglist_preferences' => BASE.AMP.'C=admin_system'.AMP.'M=mailing_list_preferences'
  35. ));
  36. }
  37. // --------------------------------------------------------------------
  38. /**
  39. * Mailinglist Home Page
  40. */
  41. function index()
  42. {
  43. $this->EE->load->library('table');
  44. $this->EE->load->library('javascript');
  45. $this->EE->load->helper('form');
  46. $this->EE->cp->add_js_script(array('fp_module' => 'mailinglist'));
  47. $vars['cp_page_title'] = $this->EE->lang->line('ml_mailinglist');
  48. $this->EE->load->model('mailinglist_model');
  49. $mailinglists = $this->EE->mailinglist_model->get_mailinglists();
  50. $vars['mailinglists'] = array();
  51. $vars['list_id_options'] = array();
  52. foreach ($mailinglists->result() as $list)
  53. {
  54. $vars['mailinglists'][$list->list_id]['id'] = $list->list_id;
  55. $this->EE->db->where('list_id', $list->list_id);
  56. $vars['mailinglists'][$list->list_id]['count'] = $this->EE->db->count_all_results('mailing_list');
  57. $vars['mailinglists'][$list->list_id]['shortname'] = $list->list_name;
  58. $vars['mailinglists'][$list->list_id]['name'] = $list->list_title;
  59. $vars['mailinglists'][$list->list_id]['toggle'] = array(
  60. 'name' => 'toggle[]',
  61. 'id' => 'delete_box_'.$list->list_id,
  62. 'value' => $list->list_id,
  63. 'class' =>'toggle'
  64. );
  65. $vars['list_id_options'][$list->list_id] = $list->list_title;
  66. }
  67. $this->EE->javascript->compile();
  68. return $this->EE->load->view('index', $vars, TRUE);
  69. }
  70. // --------------------------------------------------------------------
  71. /**
  72. * Mailing List Default Template Data
  73. */
  74. function default_template_data()
  75. {
  76. return <<<EOF
  77. {message_text}
  78. To remove your email from the "{mailing_list}" mailing list, click here:
  79. {if html_email}<a href="{unsubscribe_url}">{unsubscribe_url}</a>{/if}
  80. {if plain_email}{unsubscribe_url}{/if}
  81. EOF;
  82. }
  83. // --------------------------------------------------------------------
  84. /**
  85. * Create/Edit Mailing List
  86. */
  87. function edit_mailing_list()
  88. {
  89. $this->EE->load->library('javascript');
  90. $this->EE->load->library('form_validation');
  91. $this->EE->load->helper('form');
  92. $this->EE->load->model('mailinglist_model');
  93. $this->EE->form_validation->set_rules('list_name', 'lang:ml_mailinglist_short_name', 'required|alpha_dash|callback__unique_short_name');
  94. $this->EE->form_validation->set_rules('list_title', 'lang:ml_mailinglist_long_name', 'required');
  95. $this->EE->form_validation->set_message('alpha_dash', $this->EE->lang->line('ml_invalid_short_name'));
  96. $this->EE->form_validation->set_error_delimiters('<span class="notice">', '</span>');
  97. $list_id = 0;
  98. $vars['list_name'] = '';
  99. $vars['list_title'] = '';
  100. if ($this->EE->input->get_post('list_id') != 0)
  101. {
  102. $query = $this->EE->mailinglist_model->get_list_by_id(
  103. $this->EE->input->get_post('list_id'),
  104. 'list_title, list_template, list_id, list_name');
  105. if ($query->num_rows() == 1)
  106. {
  107. $list_id = $query->row('list_id');
  108. $vars['list_title'] = $query->row('list_title');
  109. $vars['list_name'] = $query->row('list_name');
  110. $this->EE->form_validation->set_old_value('list_id', $list_id);
  111. }
  112. }
  113. if ($this->EE->form_validation->run() === FALSE)
  114. {
  115. $this->EE->cp->set_breadcrumb(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist', $this->EE->lang->line('ml_mailinglist'));
  116. $vars['cp_page_title'] = ($list_id == 0) ? $this->EE->lang->line('ml_create_new') : $this->EE->lang->line('ml_edit_list');
  117. $vars['form_action'] = 'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist'.AMP.'method=edit_mailing_list';
  118. $vars['form_hidden']['list_id'] = $list_id;
  119. $vars['button_label'] = ($list_id == 0) ? $this->EE->lang->line('ml_create_new') : $this->EE->lang->line('update');
  120. $this->EE->javascript->compile();
  121. return $this->EE->load->view('update', $vars, TRUE);
  122. }
  123. else
  124. {
  125. $data = array(
  126. 'list_name' => $this->EE->input->post('list_name'),
  127. 'list_title' => $this->EE->input->post('list_title'),
  128. 'list_template' => addslashes($this->default_template_data())
  129. );
  130. $this->EE->mailinglist_model->update_mailinglist($list_id, $data);
  131. $message = ($list_id == FALSE) ? $this->EE->lang->line('ml_mailinglist_created') : $this->EE->lang->line('ml_mailinglist_updated');
  132. $this->EE->session->set_flashdata('message_success', $message);
  133. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  134. }
  135. }
  136. // --------------------------------------------------------------------
  137. /**
  138. * Mailing List Short Name Callback
  139. */
  140. function _unique_short_name($str)
  141. {
  142. $this->EE->load->model('mailinglist_model');
  143. if ( ! $this->EE->mailinglist_model->unique_shortname($this->EE->form_validation->old_value('list_id'), $str))
  144. {
  145. $this->EE->form_validation->set_message('_unique_short_name', $this->EE->lang->line('ml_short_name_taken'));
  146. return FALSE;
  147. }
  148. return TRUE;
  149. }
  150. // --------------------------------------------------------------------
  151. /**
  152. * Mailing List Template
  153. */
  154. function edit_template()
  155. {
  156. $this->EE->load->helper('form');
  157. if ( ! $list_id = $this->EE->input->get_post('list_id'))
  158. {
  159. show_error($this->lang->line('unauthorized_access'));
  160. }
  161. $this->EE->load->model('mailinglist_model');
  162. $list = $this->EE->mailinglist_model->get_list_by_id($list_id, 'list_title, list_template');
  163. if ($list->num_rows() == 0)
  164. {
  165. show_error($this->lang->line('unauthorized_access'));
  166. }
  167. $this->EE->cp->set_breadcrumb(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist', $this->EE->lang->line('ml_mailinglist'));
  168. $vars['cp_page_title'] = $this->EE->lang->line('mailinglist_template');
  169. $vars['form_hidden']['list_id'] = $list_id;
  170. $vars['list_title'] = $list->row('list_title');
  171. $vars['template_data'] = $list->row('list_template');
  172. return $this->EE->load->view('edit_template', $vars, TRUE);
  173. }
  174. // --------------------------------------------------------------------
  175. /**
  176. * Update Mailing List Template
  177. */
  178. function update_template()
  179. {
  180. if ( ! $list_id = $this->EE->input->get_post('list_id'))
  181. {
  182. show_error($this->EE->lang->line('ml_no_list_id'));
  183. }
  184. if ( ! isset($_POST['template_data']))
  185. {
  186. return FALSE;
  187. }
  188. $this->EE->load->model('mailinglist_model');
  189. $this->EE->mailinglist_model->update_template($list_id, $this->EE->input->post('template_data'));
  190. $this->EE->session->set_flashdata('message_success', $this->EE->lang->line('template_updated'));
  191. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  192. }
  193. // --------------------------------------------------------------------
  194. /**
  195. * Delete Mailing List Confirm
  196. */
  197. function delete_mailinglist_confirm()
  198. {
  199. if ( ! $this->EE->input->post('toggle'))
  200. {
  201. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  202. }
  203. $this->EE->cp->set_breadcrumb(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist', $this->EE->lang->line('ml_mailinglist'));
  204. $vars['cp_page_title'] = $this->EE->lang->line('ml_delete_mailinglist');
  205. $vars['question_key'] = 'ml_delete_list_question';
  206. $vars['message'] = $this->EE->lang->line('ml_all_data_nuked'); // an extra warning message
  207. $vars['form_action'] = 'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist'.AMP.'method=delete_mailinglists';
  208. $this->EE->load->helper('form');
  209. foreach ($_POST['toggle'] as $key => $val)
  210. {
  211. $vars['damned'][] = $val;
  212. }
  213. $this->EE->load->model('mailinglist_model');
  214. $query = $this->EE->mailinglist_model->get_list_by_id($_POST['toggle'], 'list_title');
  215. $vars['list_names'] = array();
  216. foreach ($query->result() as $row)
  217. {
  218. $vars['list_names'][] = $row->list_title;
  219. }
  220. $this->EE->javascript->compile();
  221. return $this->EE->load->view('delete_confirm', $vars, TRUE);
  222. }
  223. // --------------------------------------------------------------------
  224. /**
  225. * Delete Mailing List(s)
  226. */
  227. function delete_mailinglists()
  228. {
  229. if ($this->EE->input->post('delete') == '')
  230. {
  231. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  232. }
  233. $this->EE->load->model('mailinglist_model');
  234. $message = $this->EE->mailinglist_model->delete_mailinglist($_POST['delete']);
  235. $this->EE->session->set_flashdata('message_success', $message);
  236. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  237. }
  238. // --------------------------------------------------------------------
  239. /**
  240. * Subscribe
  241. */
  242. function subscribe()
  243. {
  244. if ($this->EE->input->post('addresses') == '')
  245. {
  246. $this->EE->session->set_flashdata('message_failure', $this->EE->lang->line('ml_missing_email'));
  247. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  248. }
  249. $this->EE->load->helper(array('email','string'));
  250. // Fetch existing addresses
  251. $subscribe = ($this->EE->input->get_post('sub_action') == 'unsubscribe') ? FALSE : TRUE;
  252. $list_id = $this->EE->input->get_post('list_id');
  253. $this->EE->load->model('mailinglist_model');
  254. $query = $this->EE->mailinglist_model->get_emails_by_list($list_id, 'email');
  255. $current = array();
  256. if ($query->num_rows() == 0)
  257. {
  258. if ($subscribe == FALSE)
  259. {
  260. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  261. }
  262. }
  263. else
  264. {
  265. foreach ($query->result() as $row)
  266. {
  267. $current[] = $row->email;
  268. }
  269. }
  270. // Clean up submitted addresses
  271. $email = trim($_POST['addresses']);
  272. $email = preg_replace("/[,|\|]/", "", $email);
  273. $email = str_replace(array("\r\n", "\r", "\n"), " ", $email);
  274. $email = preg_replace("/\t+/", " ", $email);
  275. $email = preg_replace("/\s+/", " ", $email);
  276. $emails = array_unique(explode(" ", $email));
  277. // Insert new addresses
  278. $vars['good_email'] = 0;
  279. $vars['dup_email'] = 0;
  280. $vars['bad_email'] = array();
  281. foreach($emails as $addr)
  282. {
  283. if (preg_match('/<(.*)>/', $addr, $match))
  284. {
  285. $addr = $match['1'];
  286. }
  287. if ($subscribe == TRUE)
  288. {
  289. if ( ! valid_email($addr))
  290. {
  291. $vars['bad_email'][] = $addr;
  292. continue;
  293. }
  294. if (in_array($addr, $current))
  295. {
  296. $vars['dup_email']++;
  297. continue;
  298. }
  299. $data = array(
  300. 'list_id' => $list_id,
  301. 'authcode' => random_string('alnum', 10),
  302. 'email' => $addr,
  303. 'ip_address' => $this->EE->input->ip_address()
  304. );
  305. $this->EE->mailinglist_model->insert_subscription($data);
  306. }
  307. else
  308. {
  309. $this->EE->mailinglist_model->delete_subscription($list_id, $addr);
  310. }
  311. $vars['good_email']++;
  312. }
  313. if (count($vars['bad_email']) == 0 AND $vars['dup_email'] == 0)
  314. {
  315. if ($subscribe == TRUE)
  316. {
  317. $this->EE->session->set_flashdata('message_success', $this->EE->lang->line('ml_emails_imported'));
  318. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  319. }
  320. else
  321. {
  322. $this->EE->session->set_flashdata('message_success', $this->EE->lang->line('ml_emails_deleted'));
  323. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  324. }
  325. }
  326. $vars['cp_page_title'] = $this->EE->lang->line('ml_batch_subscribe');
  327. $this->EE->cp->set_breadcrumb(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist', $this->EE->lang->line('ml_mailinglist'));
  328. $vars['notice'] = '';
  329. $vars['notice_import_del'] = ($subscribe == TRUE) ? 'ml_total_emails_imported' : 'ml_total_emails_deleted';
  330. if (count($vars['bad_email']) > 0)
  331. {
  332. sort($vars['bad_email']);
  333. $vars['notice_bad_email'] = ($subscribe == TRUE) ? 'ml_bad_email_heading' : 'ml_bad_email_del_heading';
  334. }
  335. return $this->EE->load->view('subscribe', $vars, TRUE);
  336. }
  337. // --------------------------------------------------------------------
  338. /**
  339. * View Mailinglist
  340. */
  341. function view()
  342. {
  343. $list_id = $this->EE->input->get_post('list_id');
  344. $this->EE->load->library('table');
  345. $this->EE->table->set_base_url('C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist'.AMP.'method=view'.AMP.'list_id='.$list_id);
  346. $this->EE->table->set_columns(array(
  347. 'email' => array(),
  348. 'ip_address' => array('html' => FALSE, 'header' => lang('ip_address')),
  349. 'list_id' => array('html' => FALSE, 'header' => lang('ml_mailinglist'), 'sort' => FALSE), // @todo sort by name, not id
  350. '_check' => array(
  351. 'sort' => FALSE,
  352. 'header' => form_checkbox('select_all', 'true', FALSE, 'class="toggle_all" id="select_all"')
  353. )
  354. ));
  355. $initial_state = array(
  356. 'sort' => array('email' => 'asc')
  357. );
  358. $params = array(
  359. 'perpage' => $this->perpage
  360. );
  361. $data = $this->EE->table->datasource('_mailinglist_filter', $initial_state, $params);
  362. $data['cp_page_title'] = $this->EE->lang->line('ml_view_mailinglist');
  363. $this->EE->cp->set_breadcrumb(
  364. BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist',
  365. $this->EE->lang->line('ml_mailinglist'
  366. ));
  367. $this->EE->cp->add_js_script(array(
  368. 'fp_module' => 'mailinglist'
  369. ));
  370. // some page defaults
  371. $data['form_hidden'] = '';
  372. if ($list_id != '')
  373. {
  374. $data['form_hidden']['list_id'] = $list_id;
  375. }
  376. $data['mailinglists'] = array('' => $this->EE->lang->line('all')) + $data['mailinglists'];
  377. $this->EE->javascript->compile();
  378. return $this->EE->load->view('view', $data, TRUE);
  379. }
  380. // ------------------------------------------------------------------------
  381. /**
  382. * View Ajax Filter
  383. */
  384. function _mailinglist_filter($state, $params)
  385. {
  386. $this->EE->load->model('mailinglist_model');
  387. $email = $this->EE->input->get_post('email');
  388. $list_id = $this->EE->input->get_post('list_id');
  389. $this->EE->db->select('list_id, list_title');
  390. $res = $this->EE->db->get('mailing_lists');
  391. $lists = array();
  392. foreach ($res->result_array() as $row)
  393. {
  394. $lists[$row['list_id']] = $row['list_title'];
  395. }
  396. if ($list_id != '')
  397. {
  398. $this->EE->db->where('list_id', $list_id);
  399. $total = $this->EE->db->count_all_results('mailing_list');
  400. }
  401. else
  402. {
  403. $total = $this->EE->db->count_all('mailing_list');
  404. }
  405. $mailing_q = $this->EE->mailinglist_model->mailinglist_search(
  406. $list_id, $email, $state['sort'], $state['offset'], $params['perpage']
  407. );
  408. $subscribers = $mailing_q->result_array();
  409. $rows = array();
  410. while ($subscriber = array_shift($subscribers))
  411. {
  412. $rows[] = array(
  413. 'email' => '<a href="mailto:'.$subscriber['email'].'">'.$subscriber['email'].'</a>',
  414. 'ip_address' => $subscriber['ip_address'],
  415. 'list_id' => isset($lists[$subscriber['list_id']]) ? $lists[$subscriber['list_id']] : '',
  416. '_check' => '<input class="toggle" type="checkbox" name="toggle[]" value="'.$subscriber['user_id'].'" />'
  417. );
  418. }
  419. return array(
  420. 'rows' => $rows,
  421. 'no_results' => '<p>'.lang('ml_no_results').'</p>',
  422. 'pagination' => array(
  423. 'per_page' => $params['perpage'],
  424. 'total_rows' => $total
  425. ),
  426. 'email' => $email,
  427. 'selected_list' => $list_id,
  428. 'mailinglists' => $lists
  429. );
  430. }
  431. // --------------------------------------------------------------------
  432. /**
  433. * Delete Emails - Confirm
  434. */
  435. function delete_confirm()
  436. {
  437. if ( ! $this->EE->input->post('toggle'))
  438. {
  439. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist'.AMP.'method=view');
  440. }
  441. $this->EE->cp->set_breadcrumb(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist', $this->EE->lang->line('ml_mailinglist'));
  442. $vars['cp_page_title'] = $this->EE->lang->line('ml_delete_confirm');
  443. $vars['question_key'] = 'ml_delete_question';
  444. $vars['form_action'] = 'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist'.AMP.'method=delete_email_addresses';
  445. $this->EE->load->helper('form');
  446. foreach ($_POST['toggle'] as $key => $val)
  447. {
  448. $vars['damned'][] = $val;
  449. }
  450. $this->EE->javascript->compile();
  451. return $this->EE->load->view('delete_confirm', $vars, TRUE);
  452. }
  453. // --------------------------------------------------------------------
  454. /**
  455. * Delete Email Addresses
  456. */
  457. function delete_email_addresses()
  458. {
  459. if ($this->EE->input->post('delete') == '')
  460. {
  461. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist'.AMP.'method=view');
  462. }
  463. $this->EE->load->model('mailinglist_model');
  464. $message = $this->EE->mailinglist_model->delete_email($_POST['delete']);
  465. $this->EE->session->set_flashdata('message_success', $message);
  466. $this->EE->functions->redirect(BASE.AMP.'C=addons_modules'.AMP.'M=show_module_cp'.AMP.'module=mailinglist');
  467. }
  468. }
  469. // END CLASS
  470. /* End of file mcp.mailinglist.php */
  471. /* Location: ./system/expressionengine/modules/mailinglist/mcp.mailinglist.php */