newsletter.module 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419
  1. <?php
  2. /**
  3. * @file
  4. * Defines menu items for newsletter administration,
  5. * permissions and basic drupal hooks.
  6. */
  7. /**
  8. * Implements hook_menu().
  9. */
  10. function newsletter_menu() {
  11. $items = array();
  12. $items['admin/config/media/newsletter'] = array(
  13. 'title' => 'Newsletters',
  14. 'description' => 'Manage newsletters, subscribers, and settings.',
  15. 'access arguments' => array('administer newsletters'),
  16. 'page callback' => 'drupal_get_form',
  17. 'page arguments' => array('newsletter_stats'),
  18. 'file' => 'includes/newsletter.admin.inc',
  19. );
  20. $items['admin/config/media/newsletter/stats'] = array(
  21. 'title' => 'Statistics',
  22. 'access arguments' => array('access newsletter statistics'),
  23. 'type' => MENU_DEFAULT_LOCAL_TASK,
  24. );
  25. $items['admin/config/media/newsletter/stats/general'] = array(
  26. 'title' => 'General',
  27. 'description' => 'Watch general statistics.',
  28. 'access arguments' => array('access newsletter statistics'),
  29. 'type' => MENU_DEFAULT_LOCAL_TASK,
  30. );
  31. $items['admin/config/media/newsletter/stats/graphic'] = array(
  32. 'title' => 'Graphic',
  33. 'description' => 'Watch advanced JQuery statistics.',
  34. 'access arguments' => array('access newsletter statistics'),
  35. 'type' => MENU_LOCAL_TASK,
  36. 'page callback' => 'newsletter_stats_graphic',
  37. 'file' => 'includes/newsletter.admin.inc',
  38. 'weight' => 1,
  39. );
  40. $items['admin/config/media/newsletter/create-send'] = array(
  41. 'title' => 'Create/Send',
  42. 'description' => 'Create custom static newsletters and send non-automated ones',
  43. 'access arguments' => array('administer newsletters'),
  44. 'type' => MENU_LOCAL_TASK,
  45. 'page callback' => 'newsletter_draft_manual_list',
  46. 'file' => 'includes/newsletter.admin.inc',
  47. 'weight' => 1,
  48. );
  49. $items['admin/config/media/newsletter/create-send/draft/%newsletter_newsletter'] = array(
  50. 'title' => 'Send a newsletter draft',
  51. 'access arguments' => array('administer newsletters'),
  52. 'type' => MENU_CALLBACK,
  53. 'page callback' => 'drupal_get_form',
  54. 'page arguments' => array('newsletter_form_send_draft', 6),
  55. 'file' => 'includes/newsletter.admin.inc',
  56. );
  57. $items['admin/config/media/newsletter/create-send/draft/delete/%newsletter_newsletter'] = array(
  58. 'title' => 'Delete a newsletter draft',
  59. 'access arguments' => array('administer newsletters'),
  60. 'type' => MENU_CALLBACK,
  61. 'page callback' => 'drupal_get_form',
  62. 'page arguments' => array('newsletter_form_delete_draft', 7),
  63. 'file' => 'includes/newsletter.admin.inc',
  64. );
  65. $items['admin/config/media/newsletter/create-send/newsletter/delete/%newsletter_newsletter'] = array(
  66. 'title' => 'Delete a newsletter draft',
  67. 'access arguments' => array('administer newsletters'),
  68. 'type' => MENU_CALLBACK,
  69. 'page callback' => 'drupal_get_form',
  70. 'page arguments' => array('newsletter_form_delete_newsletter', 7),
  71. 'file' => 'includes/newsletter.admin.inc',
  72. );
  73. $items['admin/config/media/newsletter/create-send/new'] = array(
  74. 'title' => 'Create and send a custom newsletter',
  75. 'description' => 'Create a custom static newsletter',
  76. 'access arguments' => array('administer newsletters'),
  77. 'page callback' => 'drupal_get_form',
  78. 'page arguments' => array('newsletter_create_send'),
  79. 'file' => 'includes/newsletter.admin.inc',
  80. 'type' => MENU_LOCAL_ACTION,
  81. );
  82. $items['admin/config/media/newsletter/create-send/send/%newsletter_list'] = array(
  83. 'title' => 'Send a manual newsletter',
  84. 'access arguments' => array('administer newsletters'),
  85. 'page callback' => 'newsletter_manual_send',
  86. 'page arguments' => array(6),
  87. 'file' => 'includes/newsletter.admin.inc',
  88. 'type' => MENU_CALLBACK,
  89. );
  90. $items['admin/config/media/newsletter/lists'] = array(
  91. 'title' => 'Lists',
  92. 'description' => 'Find and manage newsletter lists.',
  93. 'access arguments' => array('administer newsletters'),
  94. 'page callback' => 'drupal_get_form',
  95. 'page arguments' => array('newsletter_list'),
  96. 'file' => 'includes/newsletter.admin.inc',
  97. 'type' => MENU_LOCAL_TASK,
  98. 'weight' => 2,
  99. );
  100. $items['admin/config/media/newsletter/subscribers'] = array(
  101. 'title' => 'Subscribers',
  102. 'page callback' => 'drupal_get_form',
  103. 'page arguments' => array('newsletter_subscriber_list'),
  104. 'description' => 'List subscribers.',
  105. 'access arguments' => array('administer newsletters'),
  106. 'type' => MENU_LOCAL_TASK,
  107. 'file' => 'includes/newsletter.admin.inc',
  108. 'weight' => 3,
  109. );
  110. $items['admin/config/media/newsletter/lists/add'] = array(
  111. 'title' => 'Add new list',
  112. 'page callback' => 'newsletter_list_add',
  113. 'description' => 'Add new newsletter list.',
  114. 'access arguments' => array('administer newsletters'),
  115. 'type' => MENU_LOCAL_ACTION,
  116. 'file' => 'includes/newsletter.admin.inc',
  117. );
  118. $items['admin/config/media/newsletter/subscribers/add'] = array(
  119. 'title' => 'Add new subscriber',
  120. 'page callback' => 'newsletter_subscriber_add',
  121. 'description' => 'Add new list subscriber.',
  122. 'access arguments' => array('administer newsletters'),
  123. 'type' => MENU_LOCAL_ACTION,
  124. 'file' => 'includes/newsletter.admin.inc',
  125. );
  126. $items['admin/config/media/newsletter/subscribers/add-mass'] = array(
  127. 'title' => 'Add subscribers (Mass)',
  128. 'page callback' => 'drupal_get_form',
  129. 'page arguments' => array('newsletter_subscriber_add_mass'),
  130. 'description' => 'Add subscribers.',
  131. 'access arguments' => array('administer newsletters'),
  132. 'type' => MENU_LOCAL_ACTION,
  133. 'file' => 'includes/newsletter.admin.inc',
  134. );
  135. $items['admin/config/media/newsletter/lists/delete/%newsletter_list'] = array(
  136. 'title' => 'Delete newsletter list',
  137. 'page callback' => 'drupal_get_form',
  138. 'page arguments' => array('newsletter_list_delete', 6),
  139. 'access arguments' => array('administer newsletters'),
  140. 'type' => MENU_CALLBACK,
  141. 'file' => 'includes/newsletter.admin.inc',
  142. );
  143. $items['admin/config/media/newsletter/lists/edit/%newsletter_list'] = array(
  144. 'title' => 'Edit newsletter list',
  145. 'page callback' => 'drupal_get_form',
  146. 'page arguments' => array('newsletter_list_edit', 6),
  147. 'access arguments' => array('administer newsletters'),
  148. 'file' => 'includes/newsletter.admin.inc',
  149. 'type' => MENU_CALLBACK,
  150. );
  151. $items['admin/config/media/newsletter/subscribers/edit/%newsletter_subscriber'] = array(
  152. 'title' => 'Edit newsletter subscriber',
  153. 'page callback' => 'drupal_get_form',
  154. 'page arguments' => array('newsletter_subscriber_edit', 6),
  155. 'access arguments' => array('administer newsletters'),
  156. 'file' => 'includes/newsletter.admin.inc',
  157. 'type' => MENU_CALLBACK,
  158. );
  159. $items['admin/config/media/newsletter/subscribers/delete/%newsletter_subscriber'] = array(
  160. 'title' => 'Delete subscriber',
  161. 'page callback' => 'drupal_get_form',
  162. 'page arguments' => array('newsletter_subscriber_delete', 6),
  163. 'access arguments' => array('administer newsletters'),
  164. 'file' => 'includes/newsletter.admin.inc',
  165. 'type' => MENU_CALLBACK,
  166. );
  167. $items['admin/config/media/newsletter/templates'] = array(
  168. 'title' => 'Templates',
  169. 'description' => 'Administer newsletter templates.',
  170. 'access arguments' => array('administer newsletters'),
  171. 'type' => MENU_LOCAL_TASK,
  172. 'page callback' => 'drupal_get_form',
  173. 'page arguments' => array('newsletter_template_list'),
  174. 'file' => 'includes/newsletter.admin.inc',
  175. 'weight' => 4,
  176. );
  177. $items['admin/config/media/newsletter/templates/mail'] = array(
  178. 'title' => 'Mail templates',
  179. 'description' => 'Administer mail templates.',
  180. 'access arguments' => array('administer newsletters'),
  181. 'type' => MENU_DEFAULT_LOCAL_TASK,
  182. 'weight' => -10,
  183. );
  184. $items['admin/config/media/newsletter/templates/mail/add'] = array(
  185. 'title' => 'Add new mail template',
  186. 'description' => 'Administer mail templates.',
  187. 'access arguments' => array('administer newsletters'),
  188. 'type' => MENU_LOCAL_ACTION,
  189. 'page callback' => 'newsletter_template_add',
  190. 'file' => 'includes/newsletter.admin.inc',
  191. );
  192. $items['admin/config/media/newsletter/templates/delete/%newsletter_template'] = array(
  193. 'title' => 'Delete newsletter templates',
  194. 'page callback' => 'drupal_get_form',
  195. 'page arguments' => array('newsletter_template_delete', 6),
  196. 'access arguments' => array('administer newsletters'),
  197. 'file' => 'includes/newsletter.admin.inc',
  198. 'type' => MENU_CALLBACK,
  199. );
  200. $items['admin/config/media/newsletter/templates/edit/%newsletter_template'] = array(
  201. 'title' => 'Edit newsletter templates',
  202. 'page callback' => 'drupal_get_form',
  203. 'page arguments' => array('newsletter_template_edit', 6),
  204. 'access arguments' => array('administer newsletters'),
  205. 'file' => 'includes/newsletter.admin.inc',
  206. 'type' => MENU_CALLBACK,
  207. );
  208. $items['admin/config/media/newsletter/templates/confirmation'] = array(
  209. 'title' => 'Confirmation',
  210. 'description' => 'Edit confirmation template.',
  211. 'page callback' => 'newsletter_basic_template_edit',
  212. 'page arguments' => array('1'),
  213. 'access arguments' => array('administer newsletters'),
  214. 'file' => 'includes/newsletter.admin.inc',
  215. 'type' => MENU_LOCAL_TASK,
  216. 'weight' => -9,
  217. );
  218. $items['admin/config/media/newsletter/templates/welcome'] = array(
  219. 'title' => 'Welcome',
  220. 'description' => 'Edit welcome template.',
  221. 'page callback' => 'newsletter_basic_template_edit',
  222. 'page arguments' => array('2'),
  223. 'access arguments' => array('administer newsletters'),
  224. 'file' => 'includes/newsletter.admin.inc',
  225. 'type' => MENU_LOCAL_TASK,
  226. 'weight' => -8,
  227. );
  228. $items['admin/config/media/newsletter/templates/unsubscribe'] = array(
  229. 'title' => 'Unsubscribe',
  230. 'description' => 'Edit unsubscribe template.',
  231. 'page callback' => 'newsletter_basic_template_edit',
  232. 'page arguments' => array('3'),
  233. 'access arguments' => array('administer newsletters'),
  234. 'file' => 'includes/newsletter.admin.inc',
  235. 'type' => MENU_LOCAL_TASK,
  236. 'weight' => -7,
  237. );
  238. $items['admin/config/media/newsletter/configure'] = array(
  239. 'title' => 'Settings',
  240. 'description' => 'Configure newsletter lists.',
  241. 'access arguments' => array('administer newsletters'),
  242. 'type' => MENU_LOCAL_TASK,
  243. 'page callback' => 'drupal_get_form',
  244. 'page arguments' => array('newsletter_configure'),
  245. 'file' => 'includes/newsletter.admin.inc',
  246. 'weight' => 5,
  247. );
  248. $items['newsletter/subscribe'] = array(
  249. 'title' => 'Subscribe',
  250. 'description' => 'Subscribe to our newsletters.',
  251. 'access arguments' => array('subscribe newsletters'),
  252. 'page arguments' => array('newsletter_manage_subscriptions_form'),
  253. 'type' => MENU_CALLBACK,
  254. 'page callback' => 'drupal_get_form',
  255. 'file' => 'includes/newsletter.pages.inc',
  256. );
  257. $items['newsletter/confirm/%newsletter_subscriber_by_hash'] = array(
  258. 'title' => 'Confirm subscription',
  259. 'description' => 'Confirm your subscription to our newsletters.',
  260. 'access arguments' => array('subscribe newsletters'),
  261. 'type' => MENU_CALLBACK,
  262. 'page callback' => 'newsletter_confirm',
  263. 'page arguments' => array(2),
  264. 'file' => 'includes/newsletter.pages.inc',
  265. );
  266. $items['newsletter/unsubscribe/%newsletter_subscriber_by_hash'] = array(
  267. 'title' => 'Unsubscribe',
  268. 'description' => 'Confirm that you want to unsubscribe from our newsletters.',
  269. 'access arguments' => array('subscribe newsletters'),
  270. 'type' => MENU_CALLBACK,
  271. 'page callback' => 'drupal_get_form',
  272. 'page arguments' => array('newsletter_unsubscribe', 2),
  273. 'file' => 'includes/newsletter.pages.inc',
  274. );
  275. $items['newsletter/statistics/%newsletter_subscriber_by_hash'] = array(
  276. 'access arguments' => array('access content'),
  277. 'type' => MENU_CALLBACK,
  278. 'page callback' => 'newsletter_statistics_open',
  279. 'page arguments' => array(2),
  280. 'file' => 'includes/newsletter.pages.inc',
  281. );
  282. $items['newsletter/edit/%newsletter_subscriber_by_hash'] = array(
  283. 'title' => 'Edit newsletter subscriptions',
  284. 'page callback' => 'drupal_get_form',
  285. 'page arguments' => array('newsletter_manage_subscriptions_form', 2),
  286. 'access callback' => TRUE,
  287. 'type' => MENU_LOCAL_TASK,
  288. 'file' => 'includes/newsletter.pages.inc',
  289. );
  290. $items['user/%user/newsletter'] = array(
  291. 'title' => 'Newsletter subscriptions',
  292. 'page callback' => 'drupal_get_form',
  293. 'page arguments' => array('newsletter_manage_subscriptions_form', 1),
  294. 'access callback' => 'newsletter_edit_subsdcriber_access',
  295. 'access arguments' => array(1),
  296. 'type' => MENU_LOCAL_TASK,
  297. 'file' => 'includes/newsletter.pages.inc',
  298. );
  299. return $items;
  300. }
  301. /**
  302. * Implements hook_permission().
  303. */
  304. function newsletter_permission() {
  305. $permissions = array();
  306. $permissions['administer newsletters'] = array(
  307. 'title' => t('Administer newsletters'),
  308. 'description' => t('Access the newsletter administration pages.'),
  309. );
  310. $permissions['subscribe newsletters'] = array(
  311. 'title' => t('Subscribe newsletters'),
  312. 'description' => t('Can subscribe to various newsletter lists.'),
  313. );
  314. $permissions['access newsletter statistics'] = array(
  315. 'title' => t('Access newsletter statistics'),
  316. 'description' => t('Access the newsletter statistics pages.'),
  317. );
  318. return $permissions;
  319. }
  320. /**
  321. * Implements hook_cron().
  322. */
  323. function newsletter_cron() {
  324. $status = array();
  325. $nlids_sent = array();
  326. // Custom Newsletters
  327. $custom_queues = variable_get('newsletter_custom_for_next_cron', array());
  328. if (!empty($custom_queues)) {
  329. foreach ($custom_queues as $num => $custom_queue) {
  330. $data = newsletter_create($custom_queue['subscribers'], $custom_queue['ntid'], $custom_queue['nnid'])
  331. ->send();
  332. $status = array_merge($status, $data['status']);
  333. $subscribers_left = $data['subscribers_left'];
  334. if (!empty($subscribers_left)) {
  335. $custom_queues[$num]['subscribers'] = $subscribers_left;
  336. }
  337. else {
  338. unset($custom_queues[$num]);
  339. }
  340. }
  341. variable_set('newsletter_custom_for_next_cron', $custom_queues);
  342. }
  343. // Nesletters with remaining subscribers or Manual queued
  344. $remaining = variable_get('newsletter_for_next_cron', array());
  345. if (!empty($remaining)) {
  346. foreach ($remaining as $nlid => $data) {
  347. if ($data === TRUE) {
  348. // There is a new Manual newsletter in the queue
  349. $remaining[$nlid] = array();
  350. variable_set('newsletter_for_next_cron', $remaining);
  351. $result = newsletter_create($nlid)->send();
  352. $status = array_merge($status, $result);
  353. $nlids_sent[] = $nlid;
  354. }
  355. elseif (!empty($data)) {
  356. // There are remaining subscribers in one already sent newsletter
  357. $result = newsletter_create($nlid)->send();
  358. $status = array_merge($status, $result);
  359. $nlids_sent[] = $nlid;
  360. }
  361. }
  362. }
  363. // Automated Newsletter lists that didn't have remaining for this cron run
  364. $cron_lists = db_query("SELECT nlid FROM {newsletter_list}
  365. WHERE (send_again = CURDATE() OR send_again IS NULL)
  366. AND (send_rate = 'Daily' OR send_rate = 'Weekly' OR send_rate = 'Monthly')")
  367. ->fetchAll();
  368. if (is_array($cron_lists)) {
  369. foreach ($cron_lists as $cron_list) {
  370. if (!in_array($cron_list->nlid, $nlids_sent, TRUE)) {
  371. $result = newsletter_create($cron_list->nlid)->send();
  372. $status = array_merge($status, $result);
  373. }
  374. }
  375. }
  376. newsletter_feedback($status);
  377. }
  378. /**
  379. * Implements hook_node_insert().
  380. */
  381. function newsletter_node_insert($node) {
  382. $status = array();
  383. $custom_send_rate_lists = newsletter_custom_send_rate_lists();
  384. foreach ($custom_send_rate_lists as $list) {
  385. $newsletter = newsletter_create($list->nlid);
  386. if ($newsletter->checkCustom()) {
  387. $status = array_merge($status, $newsletter->send());
  388. }
  389. }
  390. newsletter_feedback($status);
  391. }
  392. /**
  393. * Implements hook_user_insert().
  394. */
  395. function newsletter_user_insert(&$edit, $account, $category) {
  396. if ($lists = variable_get('newsletter_auto_subscribe_new_users', array())) {
  397. $subscriber = new stdClass();
  398. $subscriber->email = $account->mail;
  399. $subscriber->uid = $account->uid;
  400. foreach ($lists as $list) {
  401. $subscriber->field_newsletter_list[LANGUAGE_NONE][]['target_id'] = $list;
  402. }
  403. entity_get_controller('newsletter_subscriber')->save($subscriber, variable_get('newsletter_send_confirm'));
  404. }
  405. }
  406. /**
  407. * Implements hook_taxonomy_vocabulary_insert().
  408. */
  409. function newsletter_taxonomy_vocabulary_insert($vocabulary) {
  410. // Avoid conflict with standard installation profile.
  411. // Also don't create field for the Newsletter Categories vocabulary.
  412. if (($vocabulary->machine_name == 'tags' && $vocabulary->vid == 2) || $vocabulary->machine_name == 'newsletter_categories') {
  413. return;
  414. }
  415. // Field names have 32 char limit.
  416. $field_name = 'field_' . substr($vocabulary->machine_name, 0, 26);
  417. $field = array(
  418. 'field_name' => 'field_' . $field_name,
  419. 'type' => 'taxonomy_term_reference',
  420. 'cardinality' => FIELD_CARDINALITY_UNLIMITED,
  421. 'settings' => array(
  422. 'allowed_values' => array(
  423. array(
  424. 'vocabulary' => $vocabulary->machine_name,
  425. 'parent' => 0,
  426. ),
  427. ),
  428. ),
  429. );
  430. field_create_field($field);
  431. $instance = array(
  432. 'field_name' => 'field_' . $vocabulary->machine_name,
  433. 'entity_type' => 'newsletter_template',
  434. 'bundle' => 'newsletter_template',
  435. 'label' => $vocabulary->name,
  436. 'widget' => array(
  437. 'weight' => 0,
  438. 'type' => 'options_select',
  439. ),
  440. );
  441. field_create_instance($instance);
  442. }
  443. /**
  444. * Implements hook_block_info().
  445. */
  446. function newsletter_block_info() {
  447. $blocks['newsletter_subscribe'] = array(
  448. 'info' => t('Newsletter: Subscribe'),
  449. );
  450. return $blocks;
  451. }
  452. /**
  453. * Implements hook_block_view().
  454. */
  455. function newsletter_block_view($delta = '') {
  456. switch ($delta) {
  457. case 'newsletter_subscribe':
  458. if (
  459. user_access('subscribe newsletters')
  460. && (!newsletter_is_subscribed() || variable_get('newsletter_always_show_subscribe_block', FALSE))
  461. ) {
  462. newsletter_add_js();
  463. module_load_include('inc', 'newsletter', 'includes/newsletter.pages');
  464. $block['subject'] = t('Subscribe to our Newsletters');
  465. $block['content'][] = array(
  466. '#prefix' => '<div class="prefix">',
  467. '#markup' => check_plain(variable_get('newsletter_block_prefix')),
  468. '#suffix' => '</div>',
  469. );
  470. $block['content'][] = drupal_get_form('newsletter_subscribe_form');
  471. $block['content'][] = array(
  472. '#prefix' => '<div class="suffix">',
  473. '#markup' => check_plain(variable_get('newsletter_block_suffix')),
  474. '#suffix' => '</div>',
  475. );
  476. }
  477. else {
  478. $block = array();
  479. }
  480. break;
  481. }
  482. return $block;
  483. }
  484. /**
  485. * Implements hook_variable_info().
  486. */
  487. function newsletter_variable_info($options) {
  488. $variable['newsletter_block_prefix'] = array(
  489. 'title' => t('Newsletter subscribe block prefix'),
  490. 'description' => t('This text will appear above the email address in the subscribe block.'),
  491. 'type' => 'string',
  492. 'access' => 'administer newsletters',
  493. );
  494. $variable['newsletter_block_suffix'] = array(
  495. 'title' => t('Newsletter subscribe block suffix'),
  496. 'description' => t('This text will appear below the email address in the subscribe block.'),
  497. 'type' => 'string',
  498. 'access' => 'administer newsletters',
  499. );
  500. return $variable;
  501. }
  502. /**
  503. * Implements hook_block_configure().
  504. */
  505. function newsletter_block_configure($delta = '') {
  506. $form = array();
  507. if ($delta == 'newsletter_subscribe') {
  508. $form['newsletter_block_prefix'] = array(
  509. '#type' => 'textarea',
  510. '#title' => t('Text before email address'),
  511. '#description' => t('This text will appear above the email address in the subscribe block.'),
  512. '#default_value' => variable_get('newsletter_block_prefix'),
  513. );
  514. $form['newsletter_block_suffix'] = array(
  515. '#type' => 'textarea',
  516. '#title' => t('Text after email address'),
  517. '#description' => t('This text will appear below the email address in the subscribe block.'),
  518. '#default_value' => variable_get('newsletter_block_suffix'),
  519. );
  520. }
  521. return $form;
  522. }
  523. /**
  524. * Implements hook_block_save().
  525. */
  526. function newsletter_block_save($delta = '', $edit = array()) {
  527. if ($delta == 'newsletter_subscribe') {
  528. // Save the configuration to the database.
  529. variable_set('newsletter_block_prefix', $edit['newsletter_block_prefix']);
  530. variable_set('newsletter_block_suffix', $edit['newsletter_block_suffix']);
  531. }
  532. return;
  533. }
  534. /**
  535. * Implements hook_node_view().
  536. */
  537. function newsletter_node_view($node, $view_mode, $langcode) {
  538. // Only add once, since this hook may run many times in a request
  539. static $i;
  540. if (isset($_GET['source']) && $_GET['source'] == 'newsletter' && !$i) {
  541. db_query("UPDATE {newsletter_newsletter}
  542. SET clicks = clicks + 1
  543. WHERE nnid = :id",
  544. array(':id' => $_GET['nnid']));
  545. $i++;
  546. }
  547. }
  548. /**
  549. * Implements hook_token_info().
  550. */
  551. function newsletter_token_info() {
  552. $type = array(
  553. 'name' => t('Newsletter'),
  554. 'description' => t('Tokens related to newsletters.'),
  555. 'needs-data' => 'newsletter',
  556. );
  557. $newsletter['confirmation_url'] = array(
  558. 'name' => t('Confirmation URL'),
  559. 'description' => t('The url with the generated hash where the subscriber confirms subscription'),
  560. );
  561. $newsletter['subscription_ip'] = array(
  562. 'name' => t('Subscription IP'),
  563. 'description' => t('The url with the generated hash where the subscriber confirms subscription'),
  564. );
  565. $newsletter['unsubscribe_url'] = array(
  566. 'name' => t('Unsubscribe URL'),
  567. 'description' => t('The URL that unsubscribes the current user from subscribed newsletters'),
  568. );
  569. $newsletter['edit_subscription_url'] = array(
  570. 'name' => t('Edit subscription URL'),
  571. 'description' => t('The URL that allows even anonymous users to edit their newlsetter subscription'),
  572. );
  573. $newsletter['subscriber_firstname'] = array(
  574. 'name' => t("Subscriber's First Name"),
  575. 'description' => t('You need to have this required in the personal info form, in order to use it efficiently'),
  576. );
  577. $newsletter['subscriber_lastname'] = array(
  578. 'name' => t("Subscriber's Last Name"),
  579. 'description' => t('You need to have this required in the personal info form, in order to use it efficiently'),
  580. );
  581. $newsletter['subscriber_email'] = array(
  582. 'name' => t("Subscriber's e-mail"),
  583. 'description' => t("Subscriber's e-mail"),
  584. );
  585. $newsletter['subscription_time'] = array(
  586. 'name' => t('Subscription Time'),
  587. 'description' => t('The date this subscriber subscribed to your list'),
  588. );
  589. $newsletter['list_name'] = array(
  590. 'name' => t('List name'),
  591. 'description' => t('The newsletter list name'),
  592. );
  593. $newsletter['list_description'] = array(
  594. 'name' => t("List's description"),
  595. 'description' => t('The newsletter list description'),
  596. );
  597. $newsletter['list_category'] = array(
  598. 'name' => t("List's category"),
  599. 'description' => t('The newsletter list category'),
  600. );
  601. return array(
  602. 'types' => array('newsletter' => $type),
  603. 'tokens' => array('newsletter' => $newsletter),
  604. );
  605. }
  606. /**
  607. * Implements hook_tokens().
  608. */
  609. function newsletter_tokens($type, $tokens, array $data = array(), array $options = array()) {
  610. $sanitize = !empty($options['sanitize']);
  611. $replacements = array();
  612. if ($type == 'newsletter' && isset($data['newsletter_list'])) {
  613. foreach ($tokens as $name => $original) {
  614. switch ($name) {
  615. case 'list_name':
  616. $replacements[$original] = $sanitize ? filter_xss($data['newsletter_list']->title) : $data['newsletter_list']->title;
  617. break;
  618. case 'list_description':
  619. $replacements[$original] = $sanitize ? filter_xss($data['newsletter_list']->description) : $data['newsletter_list']->description;
  620. break;
  621. case 'list_category':
  622. $replacements[$original] = $sanitize ? filter_xss($data['newsletter_list']->category) : $data['newsletter_list']->category;
  623. break;
  624. }
  625. }
  626. }
  627. if ($type == 'newsletter' && isset($data['newsletter_subscriber'])) {
  628. foreach ($tokens as $name => $original) {
  629. switch ($name) {
  630. case 'confirmation_url':
  631. $replacements[$original] = url('newsletter/confirm/' . $data['newsletter_subscriber']->hash, array('absolute' => TRUE));
  632. break;
  633. case 'subscription_ip':
  634. $replacements[$original] = $sanitize ? filter_xss($data['newsletter_subscriber']->ip) : $data['newsletter_subscriber']->ip;
  635. break;
  636. case 'unsubscribe_url':
  637. $replacements[$original] = url('newsletter/unsubscribe/' . $data['newsletter_subscriber']->hash, array('absolute' => TRUE));
  638. break;
  639. case 'edit_subscription_url':
  640. $replacements[$original] = url('newsletter/edit/' . $data['newsletter_subscriber']->hash, array('absolute' => TRUE));
  641. break;
  642. case 'subscriber_firstname':
  643. $replacements[$original] = $sanitize ? filter_xss($data['newsletter_subscriber']->firstname) : $data['newsletter_subscriber']->firstname;
  644. break;
  645. case 'subscriber_lastname':
  646. $replacements[$original] = $sanitize ? filter_xss($data['newsletter_subscriber']->lastname) : $data['newsletter_subscriber']->lastname;
  647. break;
  648. case 'subscriber_email':
  649. $replacements[$original] = $sanitize ? filter_xss($data['newsletter_subscriber']->email) : $data['newsletter_subscriber']->email;
  650. break;
  651. case 'subscription_time':
  652. $replacements[$original] = format_date($data['newsletter_subscriber']->created, 'long');
  653. break;
  654. }
  655. }
  656. }
  657. return $replacements;
  658. }
  659. /**
  660. * Implements hook_mail().
  661. */
  662. function newsletter_mail($key, &$message, $params) {
  663. $template = isset($params['template']) ? $params['template'] : array();
  664. $subscriber = isset($params['subscriber']) ? $params['subscriber'] : array();
  665. $nodes = isset($params['nodes']) ? $params['nodes'] : array();
  666. $list = isset($params['list']) ? $params['list'] : array();
  667. $format = isset($params['format']) ? $params['format'] : '';
  668. $newsletter = isset($params['newsletter']) ? $params['newsletter'] : array();
  669. $template_body = field_get_items('newsletter_template', $template, 'field_newsletter_body');
  670. if ($template_body) {
  671. $template_body = $template_body[0];
  672. }
  673. switch ($key) {
  674. case 'test':
  675. $message['subject'] = t('Newsletter test e-mail');
  676. $message['body'][] = t('This is a test e-mail generated by the Drupal Newsletter module.
  677. If you succesfully received this e-mail,
  678. it means that your server is capable of sending e-mails.
  679. Congratulations!
  680. You can now create lists, templates and subscribe users to them!');
  681. $message['format'] = $params['format'];
  682. $message['body_format'] = 'plain_text';
  683. break;
  684. case 'basic':
  685. $body = token_replace($template_body['value'], array('newsletter_subscriber' => $subscriber));
  686. $message['subject'] = token_replace($template->subject, array());
  687. $message['body'][] = $body;
  688. $message['body_format'] = $template_body['format'];
  689. $message['format'] = (isset($subscriber->receive_format) && $subscriber->receive_format)
  690. ? $subscriber->receive_format
  691. : $format;
  692. break;
  693. case 'automated':
  694. if (strpos($template_body['value'], '[repeat]') && strpos($template_body['value'], '[/repeat]')) {
  695. $body = explode('[repeat]', $template_body['value']);
  696. $head = $body[0];
  697. $body = explode('[/repeat]', $body[1]);
  698. $foot = $body[1];
  699. $items = array();
  700. foreach ($nodes as $node) {
  701. $token_params = array('node' => $node);
  702. // Allow other modules to add token params for token_replace().
  703. foreach (module_implements('newsletter_automated_token_params') as $module) {
  704. $function = $module . '_newsletter_automated_token_params';
  705. $function($token_params);
  706. }
  707. $items[] = token_replace($body[0], $token_params);
  708. }
  709. $body = implode("\n", $items);
  710. $body = $head . $body . $foot;
  711. }
  712. else {
  713. $body = $template_body['value'];
  714. }
  715. $body = token_replace($body, array('newsletter_subscriber' => $subscriber, 'newsletter_list' => $list));
  716. $message['subject'] = token_replace($template->subject, array());
  717. $message['body'][] = $body;
  718. $message['format'] = (isset($subscriber->receive_format) && $subscriber->receive_format)
  719. ? $subscriber->receive_format
  720. : $format;
  721. $message['body_format'] = $template_body['format'];
  722. if (variable_get('newsletter_track_open_rate')) {
  723. $message['body'][] = newsletter_add_open_rate_image($subscriber->hash, $newsletter);
  724. }
  725. break;
  726. case 'custom':
  727. $body = token_replace($template_body['value'], array('newsletter_subscriber' => $subscriber));
  728. $message['subject'] = token_replace($template->subject, array());
  729. $message['body'][] = $body;
  730. $message['format'] = (isset($subscriber->receive_format) && $subscriber->receive_format)
  731. ? $subscriber->receive_format
  732. : $format;
  733. $message['body_format'] = $template_body['format'];
  734. if (variable_get('newsletter_track_open_rate')) {
  735. $message['body'][] = newsletter_add_open_rate_image($subscriber->hash, $newsletter);
  736. }
  737. break;
  738. }
  739. }
  740. /**
  741. * Implements hook_entity_info().
  742. */
  743. function newsletter_entity_info() {
  744. $return = array(
  745. 'newsletter_subscriber' => array(
  746. 'label' => t('Newsletter subscriber'),
  747. 'controller class' => 'NewsletterSubscriberController',
  748. 'access callback' => 'newsletter_entity_access',
  749. 'base table' => 'newsletter_subscriber',
  750. 'fieldable' => TRUE,
  751. 'entity keys' => array(
  752. 'id' => 'nsid',
  753. 'label' => 'email',
  754. ),
  755. 'bundles' => array(
  756. 'newsletter_subscriber' => array(
  757. 'label' => t('Newsletter subscriber'),
  758. 'admin' => array(
  759. 'path' => 'admin/config/media/newsletter/subscribers',
  760. 'access arguments' => array('administer newsletters'),
  761. ),
  762. ),
  763. ),
  764. ),
  765. 'newsletter_list' => array(
  766. 'label' => t('Newsletter list'),
  767. 'controller class' => 'NewsletterListController',
  768. 'access callback' => 'newsletter_entity_access',
  769. 'base table' => 'newsletter_list',
  770. 'fieldable' => TRUE,
  771. 'entity keys' => array(
  772. 'id' => 'nlid',
  773. 'label' => 'title',
  774. ),
  775. 'bundles' => array(
  776. 'newsletter_list' => array(
  777. 'label' => t('Newsletter list'),
  778. ),
  779. ),
  780. ),
  781. 'newsletter_template' => array(
  782. 'label' => t('Newsletter template'),
  783. 'controller class' => 'NewsletterTemplateController',
  784. 'access callback' => 'newsletter_entity_access',
  785. 'base table' => 'newsletter_template',
  786. 'fieldable' => TRUE,
  787. 'entity keys' => array(
  788. 'id' => 'ntid',
  789. 'label' => 'subject',
  790. ),
  791. 'bundles' => array(
  792. 'newsletter_template' => array(
  793. 'label' => t('Newsletter template'),
  794. 'admin' => array(
  795. 'path' => 'admin/config/media/newsletter/templates',
  796. 'access arguments' => array('administer newsletters'),
  797. ),
  798. ),
  799. ),
  800. ),
  801. 'newsletter_newsletter' => array(
  802. 'label' => t('Newsletter'),
  803. 'controller class' => 'NewsletterNewsletterController',
  804. 'access callback' => 'newsletter_entity_access',
  805. 'base table' => 'newsletter_newsletter',
  806. 'fieldable' => TRUE,
  807. 'entity keys' => array(
  808. 'id' => 'nnid',
  809. 'label' => 'title',
  810. ),
  811. 'bundles' => array(
  812. 'newsletter_newsletter' => array(
  813. 'label' => t('Newsletter'),
  814. ),
  815. ),
  816. ),
  817. );
  818. return $return;
  819. }
  820. /**
  821. * Implements hook_field_attach_form().
  822. */
  823. function newsletter_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {
  824. if ($entity_type == 'newsletter_subscriber') {
  825. $lang = $form['field_newsletter_list']['#language'];
  826. $list_ids = array_keys($form['field_newsletter_list'][$lang]['#options']);
  827. $lists = newsletter_list_load($list_ids);
  828. $exposed_lists = newsletter_exposed_lists();
  829. foreach ($lists as $list) {
  830. if (in_array($list->nlid, $exposed_lists)) {
  831. $form['exposed']['exposed_' . $list->nlid] = array(
  832. '#type' => 'checkboxes',
  833. '#options' => newsletter_get_template_terms($list->field_newsletter_template[$lang][0]['target_id']),
  834. '#title' => t("@list's Configuration", array('@list' => $list->title)),
  835. '#default_value' => newsletter_get_default_exposed($entity, $list),
  836. );
  837. }
  838. }
  839. }
  840. }
  841. /**
  842. * Implements hook_field_attach_presave().
  843. */
  844. function newsletter_field_attach_presave($entity_type, $entity) {
  845. if ($entity_type == 'newsletter_subscriber') {
  846. $exposed_lists = newsletter_exposed_lists();
  847. foreach ($exposed_lists as $exposed_list) {
  848. $terms = isset($entity->{'exposed_' . $exposed_list}) ? $entity->{'exposed_' . $exposed_list} : array();
  849. $tids = array();
  850. foreach ($terms as $tid => $value) {
  851. if (!empty($value)) {
  852. $tids[] = $tid;
  853. }
  854. }
  855. $tids = !empty($tids) ? serialize($tids) : NULL;
  856. $lang = field_language($entity_type, $entity, 'field_newsletter_list');
  857. foreach ($entity->field_newsletter_list[$lang] as $key => $list) {
  858. if ($list['target_id'] == $exposed_list) {
  859. $entity->field_newsletter_list[$lang][$key]['target_id_tids'] = $tids;
  860. }
  861. }
  862. }
  863. }
  864. }
  865. /**
  866. * Implements hook_entity_insert().
  867. */
  868. function newsletter_entity_insert($entity, $type) {
  869. newsletter_update_exposed_tids($entity, $type);
  870. }
  871. /**
  872. * Implements hook_entity_update().
  873. */
  874. function newsletter_entity_update($entity, $type) {
  875. newsletter_update_exposed_tids($entity, $type);
  876. }
  877. /**
  878. * Implementation of hook_views_api().
  879. */
  880. function newsletter_views_api() {
  881. return array(
  882. 'api' => 3,
  883. 'path' => drupal_get_path('module', 'newsletter') . '/includes/views'
  884. );
  885. }
  886. /**
  887. * Implements hook_newsletter_list_sent().
  888. */
  889. function newsletter_newsletter_list_sent($message) {
  890. $newsletter = $message['params']['newsletter'];
  891. $newsletter->field_newsletter_body[LANGUAGE_NONE][0] = array(
  892. 'format' => $message['body_format'],
  893. 'summary' => text_summary($message['body'], $message['body_format']),
  894. 'value' => $message['body'],
  895. );
  896. entity_get_controller('newsletter_newsletter')->save($newsletter);
  897. }
  898. /**
  899. * Since there is no hook_field_schema_alter()
  900. * we will have to update the exposed lists tid manually.
  901. * See #691932.
  902. */
  903. function newsletter_update_exposed_tids($entity, $type) {
  904. if ($type == 'newsletter_subscriber') {
  905. $lists = field_get_items($type, $entity, 'field_newsletter_list');
  906. foreach ($lists as $list) {
  907. if (isset($list['target_id_tids'])) {
  908. db_update('field_data_field_newsletter_list')
  909. ->fields(array('target_id_tids' => $list['target_id_tids']))
  910. ->condition('entity_id', $entity->nsid)
  911. ->condition('field_newsletter_list_target_id', $list['target_id'])
  912. ->execute();
  913. }
  914. }
  915. }
  916. }
  917. /**
  918. * Determines whether the given user has access to a subscriber/list/template.
  919. *
  920. * @see entity_access()
  921. */
  922. function newsletter_entity_access($op, $entity = NULL, $account = NULL) {
  923. if (isset($entity->nlid) && $op == 'view') {
  924. // The entity is a newsletter list and we are in the subscribe form.
  925. return user_access('subscribe newsletters', $account);
  926. }
  927. return user_access('administer newsletters', $account);
  928. }
  929. /**
  930. * Access callback for user newsletter subscriptions editing.
  931. */
  932. function newsletter_edit_subsdcriber_access($account) {
  933. return (($GLOBALS['user']->uid == $account->uid && user_access('subscribe newsletters')) || user_access('administer users')) && $account->uid > 0;
  934. }
  935. /**
  936. * Loads up the requested list.
  937. */
  938. function newsletter_list_load($nlids = FALSE, $conditions = array(), $reset = FALSE) {
  939. if (is_numeric($nlids)) {
  940. $id = $nlids;
  941. $nlids = !empty($nlids) ? array($nlids) : array();
  942. }
  943. $lists = entity_load('newsletter_list', $nlids, $conditions, $reset);
  944. return isset($id) ? $lists[$id] : $lists;
  945. }
  946. /**
  947. * Loads up the requested subscriber.
  948. */
  949. function newsletter_subscriber_load($nsids = FALSE, $conditions = array(), $reset = FALSE) {
  950. if (is_numeric($nsids)) {
  951. $id = $nsids;
  952. $nsids = !empty($nsids) ? array($nsids) : array();
  953. }
  954. $subscribers = entity_load('newsletter_subscriber', $nsids, $conditions, $reset);
  955. return isset($id) ? $subscribers[$id] : $subscribers;
  956. }
  957. /**
  958. * Loads up the requested template.
  959. */
  960. function newsletter_template_load($ntids = FALSE, $conditions = array(), $reset = FALSE) {
  961. if (is_numeric($ntids)) {
  962. $id = $ntids;
  963. $ntids = !empty($ntids) ? array($ntids) : array();
  964. }
  965. $templates = entity_load('newsletter_template', $ntids, $conditions, $reset);
  966. return isset($id) ? $templates[$id] : $templates;
  967. }
  968. /**
  969. * Loads up the requested newsletter.
  970. */
  971. function newsletter_newsletter_load($nnids = FALSE, $conditions = array(), $reset = FALSE) {
  972. if (is_numeric($nnids)) {
  973. $id = $nnids;
  974. $nnids = !empty($nnids) ? array($nnids) : array();
  975. }
  976. $newsletters = entity_load('newsletter_newsletter', $nnids, $conditions, $reset);
  977. return isset($id) ? $newsletters[$id] : $newsletters;
  978. }
  979. /**
  980. * Loads up the requested subscriber by its hash.
  981. */
  982. function newsletter_subscriber_by_hash_load($hash) {
  983. $query = new EntityFieldQuery();
  984. $entities = $query->entityCondition('entity_type', 'newsletter_subscriber')
  985. ->propertyCondition('hash', $hash)
  986. ->execute();
  987. $keys = isset($entities['newsletter_subscriber'])
  988. ? array_keys($entities['newsletter_subscriber'])
  989. : array();
  990. // Since we always expect to have one subscriber:
  991. return newsletter_subscriber_load(array_pop($keys));
  992. }
  993. /**
  994. * Get the subscribers of a newsletter list.
  995. *
  996. * @param $nlid
  997. * The id of the newsletter list.
  998. * @param $filter
  999. * (boolean) Whether to filter out unconfirmed subscribers.
  1000. *
  1001. * @return
  1002. * Array containg the subscriber full objects.Else empty array.
  1003. */
  1004. function newsletter_subscribers_by_list($nlid, $filter = TRUE) {
  1005. $query = new EntityFieldQuery();
  1006. $query->entityCondition('entity_type', 'newsletter_subscriber')
  1007. ->fieldCondition('field_newsletter_list', 'target_id', $nlid);
  1008. if ($filter) {
  1009. $query->propertyCondition('confirmed', 1);
  1010. }
  1011. $entities = $query->execute();
  1012. return isset($entities['newsletter_subscriber'])
  1013. ? newsletter_subscriber_load(array_keys($entities['newsletter_subscriber']))
  1014. : array();
  1015. }
  1016. /**
  1017. * Checks whether an email is registered to newsletter list or not.
  1018. *
  1019. * @return
  1020. * boolean TRUE or FALSE.
  1021. */
  1022. function newsletter_is_subscribed($mail = NULL) {
  1023. if (!isset($mail)) {
  1024. global $user;
  1025. $mail = isset($user->mail) ? $user->mail : FALSE;
  1026. }
  1027. if ($mail) {
  1028. $is_subscribed = db_query('SELECT email FROM {newsletter_subscriber} WHERE email = :mail', array(':mail' => $mail))->fetchField();
  1029. return (bool) $is_subscribed;
  1030. }
  1031. else {
  1032. return FALSE;
  1033. }
  1034. }
  1035. /**
  1036. * Instantiates a new Newsletter class
  1037. * according to http://drupal.org/node/608152.
  1038. *
  1039. * @return
  1040. * A newsletter object.
  1041. */
  1042. function newsletter_create($nlid = NULL, $ntid = NULL, $nnid = NULL) {
  1043. if (isset($ntid)) {
  1044. $newsletter = new NewsletterCustom($nlid, $ntid, $nnid);
  1045. }
  1046. elseif (isset($nlid) && !isset($ntid)) {
  1047. $newsletter = new NewsletterAutomated($nlid);
  1048. }
  1049. else {
  1050. $newsletter = new NewsletterBasic();
  1051. }
  1052. return (object) $newsletter;
  1053. }
  1054. /*
  1055. * Returns an image to be added to newsletter body
  1056. * so we can calculate the open rate.
  1057. *
  1058. * @param $hash
  1059. * Subscriber's personal hash.
  1060. * @param $newsletter
  1061. * The newsletter object.
  1062. *
  1063. * @return
  1064. * An html image string.
  1065. */
  1066. function newsletter_add_open_rate_image($hash, $newsletter) {
  1067. $params = array(
  1068. 'absolute' => TRUE,
  1069. 'query' => array(
  1070. 'source' => 'newsletter',
  1071. 'nnid' => $newsletter->nnid,
  1072. ),
  1073. );
  1074. $url = url('newsletter/statistics/' . $hash, $params);
  1075. $image = "<img src='$url' width = '1' height = '1' />";
  1076. return $image;
  1077. }
  1078. /**
  1079. * Sets a watchdog message for the just sent newsletter.
  1080. *
  1081. * @param $id
  1082. * The newsletter id.
  1083. * @param $title
  1084. * The subscriber's list title.
  1085. * @param $mail
  1086. * The subscriber's e-mail.
  1087. * @param $result
  1088. * The result from drupal_mail_system.
  1089. */
  1090. function newsletter_set_watchdog($id, $title, $mail, $result) {
  1091. watchdog('newsletter', 'Newsletter list with newsletter id @news_id and list name @list_name sent to @sub with status code @status.',
  1092. array(
  1093. '@news_id' => $id,
  1094. '@list_name' => $title,
  1095. '@sub' => $mail,
  1096. '@status' => $result,
  1097. ), WATCHDOG_ERROR);
  1098. }
  1099. /**
  1100. * @return
  1101. * An array of newsletter list ids with exposed templates.
  1102. */
  1103. function newsletter_exposed_lists() {
  1104. $query = new EntityFieldQuery();
  1105. $exposed_ntids = newsletter_exposed_templates();
  1106. if (empty($exposed_ntids)) {
  1107. return array();
  1108. }
  1109. $query->entityCondition('entity_type', 'newsletter_list')
  1110. ->fieldCondition('field_newsletter_template', 'target_id', $exposed_ntids, 'IN');
  1111. $entities = $query->execute();
  1112. return isset($entities['newsletter_list']) ? array_keys($entities['newsletter_list']) : array();
  1113. }
  1114. /**
  1115. * @return
  1116. * An array of newsletter template ids with exposed status.
  1117. */
  1118. function newsletter_exposed_templates() {
  1119. $query = new EntityFieldQuery();
  1120. $query->entityCondition('entity_type', 'newsletter_template')
  1121. ->propertyCondition('exposed', 1);
  1122. $entities = $query->execute();
  1123. return isset($entities['newsletter_template'])
  1124. ? array_keys($entities['newsletter_template'])
  1125. : array();
  1126. }
  1127. /**
  1128. * Fetches the terms for a template.
  1129. *
  1130. * @param
  1131. * $ntid The template ntid.
  1132. *
  1133. * @return
  1134. * An array of term names keyed by their tids.
  1135. */
  1136. function newsletter_get_template_terms($ntid) {
  1137. $terms = array();
  1138. $template = newsletter_template_load($ntid);
  1139. $vocabularies = taxonomy_get_vocabularies();
  1140. foreach ($vocabularies as $vocabulary) {
  1141. if ($vocabulary->machine_name == 'newsletter_categories') {
  1142. continue;
  1143. }
  1144. $vocabulary_field = field_get_items('newsletter_template', $template, 'field_' . $vocabulary->machine_name);
  1145. if ($vocabulary_field) {
  1146. foreach ($vocabulary_field as $values) {
  1147. $term = taxonomy_term_load($values['tid']);
  1148. if ($term) {
  1149. $terms[$term->tid] = $term->name;
  1150. }
  1151. }
  1152. }
  1153. }
  1154. return $terms;
  1155. }
  1156. /**
  1157. * Get a subscriber's exposed terms.
  1158. */
  1159. function newsletter_get_default_exposed($subscriber, $list) {
  1160. if (!isset($subscriber->nsid)) {
  1161. return array();
  1162. }
  1163. $tids = db_query('SELECT target_id_tids
  1164. FROM {field_data_field_newsletter_list}
  1165. WHERE entity_id = :nsid
  1166. AND field_newsletter_list_target_id = :nlid',
  1167. array(':nsid' => $subscriber->nsid, ':nlid' => $list->nlid))->fetchField();
  1168. if ($tids) {
  1169. $tids = @unserialize($tids);
  1170. if (is_array($tids)) {
  1171. foreach ($tids as $tid) {
  1172. $defaults[$tid] = $tid;
  1173. }
  1174. }
  1175. }
  1176. return isset($defaults) ? $defaults : array();
  1177. }
  1178. /**
  1179. * @return
  1180. * An array of newsletter lists that are set to send with custom schedule.
  1181. */
  1182. function newsletter_custom_send_rate_lists() {
  1183. $lists = db_query('SELECT nlid, send_rate FROM {newsletter_list}')->fetchAll();
  1184. foreach ($lists as $list) {
  1185. if (is_numeric($list->send_rate)) {
  1186. $custom_lists[] = $list;
  1187. }
  1188. }
  1189. return isset($custom_lists) ? $custom_lists : array();
  1190. }
  1191. /**
  1192. * Feedback to site administrator depending on newsletter send status.
  1193. *
  1194. * @param $statuses
  1195. * An array containing status values set when a newsletter mail was sent.
  1196. */
  1197. function newsletter_feedback($statuses) {
  1198. if (is_array($statuses) && !empty($statuses)) {
  1199. $success = 0;
  1200. $error = 0;
  1201. $no_items = 0;
  1202. $no_subs = 0;
  1203. foreach ($statuses as $status) {
  1204. $status = ($status === 1 || $status === TRUE) ? 'success' : $status;
  1205. switch ($status) {
  1206. case 'No subscribers':
  1207. $no_subs++;
  1208. break;
  1209. case 'No items':
  1210. $no_items++;
  1211. break;
  1212. case 'success':
  1213. $success++;
  1214. break;
  1215. default:
  1216. $error++;
  1217. }
  1218. }
  1219. if ($no_subs) {
  1220. watchdog('newsletter', '%no_subs Newsletter Lists failed to send because no subscribers found subscribed to them',
  1221. array('%no_subs' => $no_subs));
  1222. }
  1223. if ($no_items) {
  1224. watchdog('newsletter', '%no_items Newsletter Lists failed to send because no published nodes found for their terms',
  1225. array('%no_items' => $no_items));
  1226. }
  1227. if ($success) {
  1228. watchdog('newsletter', '%success Newsletter Lists sent',
  1229. array('%success' => $success));
  1230. }
  1231. if ($error) {
  1232. watchdog('newsletter', '%error Newsletter Lists failed to send.Check previous watchdog notices for more info',
  1233. array('%error' => $error), WATCHDOG_ERROR);
  1234. }
  1235. }
  1236. return;
  1237. }
  1238. /**
  1239. * Add newsletter js file and settings.
  1240. */
  1241. function newsletter_add_js() {
  1242. static $added;
  1243. if ($added) {
  1244. return;
  1245. }
  1246. drupal_add_js(drupal_get_path('module', 'newsletter') . '/js/newsletter.js');
  1247. $lists = newsletter_exposed_lists();
  1248. if (!field_is_translatable('newsletter_subscriber', field_info_field('field_newsletter_list'))) {
  1249. $lang = LANGUAGE_NONE;
  1250. }
  1251. else {
  1252. $lang = language_default()->language;
  1253. }
  1254. drupal_add_js(array( 'exposed' => $lists, 'lang' => $lang), 'setting');
  1255. drupal_add_js('(function ($) {$(document).ready(function () {
  1256. Drupal.behaviors.newsletter.subscribeForm();
  1257. });})(jQuery);', 'inline');
  1258. $added++;
  1259. }
  1260. /**
  1261. * Loads up the form that is displayed to the newsletter block.
  1262. */
  1263. function newsletter_subscribe_form($form, &$form_state) {
  1264. global $user;
  1265. $ajax = array(
  1266. 'callback' => 'newsletter_subscribe_form_submit',
  1267. 'wrapper' => 'newsletter-error',
  1268. 'effect' => 'fade',
  1269. 'progress' => array(
  1270. 'type' => 'throbber',
  1271. 'message' => NULL,
  1272. ),
  1273. 'event' => 'click',
  1274. );
  1275. if (!isset($user->mail) || variable_get('newsletter_show_email_in_block', FALSE)) {
  1276. $form['email'] = array(
  1277. '#type' => 'textfield',
  1278. '#default_value' => t('user@example.com'),
  1279. '#size' => 20,
  1280. '#required' => TRUE,
  1281. );
  1282. }
  1283. else {
  1284. $form['logged-in'] = array(
  1285. '#type' => 'hidden',
  1286. '#value' => TRUE,
  1287. );
  1288. }
  1289. $form['newsletter-submit'] = array(
  1290. '#type' => 'submit',
  1291. '#value' => t('Subscribe'),
  1292. '#prefix' => '<div id="newsletter-error"></div><div id="subscribe">',
  1293. '#suffix' => '</div>',
  1294. '#ajax' => $ajax,
  1295. );
  1296. return $form;
  1297. }
  1298. /**
  1299. * Callback of newsletter subscription block.Degrades when js is off.
  1300. * Validates e-mail and sends user to next step.
  1301. */
  1302. function newsletter_subscribe_form_submit($form, &$form_state) {
  1303. $is_ajax = isset($form_state['input']['ajax_page_state']);
  1304. if (isset($form_state['values']['logged-in'])) {
  1305. global $user;
  1306. $mail = $user->mail;
  1307. }
  1308. elseif (!isset($form_state['values']['logged-in'])) {
  1309. $mail = ($form_state['values']['email'] != t('user@example.com'))
  1310. ? $form_state['values']['email']
  1311. : '';
  1312. }
  1313. if (!valid_email_address($mail) || newsletter_is_subscribed($mail)) {
  1314. $msg = t("This e-mail doesn't exist or you have already subscribed");
  1315. return $is_ajax ? '<div id="newsletter-error">' . $msg . '</div>' : drupal_set_message($msg, 'warning');;
  1316. }
  1317. $q = array(
  1318. 'destination' => '',
  1319. 'email' => $mail,
  1320. );
  1321. $url = url('newsletter/subscribe', array('query' => $q));
  1322. if ($is_ajax) {
  1323. return "<script type='text/javascript'>
  1324. location.href='$url'
  1325. </script>";
  1326. }
  1327. drupal_goto('newsletter/subscribe', array('query' => $q));
  1328. }