PageRenderTime 50ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/plugins/serendipity_event_mailer/serendipity_event_mailer.php

http://github.com/s9y/Serendipity
PHP | 347 lines | 346 code | 1 blank | 0 comment | 1 complexity | 1d6c6e12e31c673a4111b235d2e0e184 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-3.0, LGPL-2.1, MPL-2.0-no-copyleft-exception, Apache-2.0
  1. <?php
  2. if (IN_serendipity !== true) {
  3. die ("Don't hack!");
  4. }
  5. @serendipity_plugin_api::load_language(dirname(__FILE__));
  6. class serendipity_event_mailer extends serendipity_event
  7. {
  8. var $title = PLUGIN_EVENT_MAILER_NAME;
  9. var $data = array();
  10. function introspect(&$propbag)
  11. {
  12. global $serendipity;
  13. $propbag->add('name', PLUGIN_EVENT_MAILER_NAME);
  14. $propbag->add('description', PLUGIN_EVENT_MAILER_DESC);
  15. $propbag->add('stackable', false);
  16. $propbag->add('author', 'Sebastian Nohn, Kristian Koehntopp, Garvin Hicking');
  17. $propbag->add('version', '1.60');
  18. $propbag->add('requirements', array(
  19. 'serendipity' => '1.6',
  20. 'smarty' => '2.6.7',
  21. 'php' => '4.1.0'
  22. ));
  23. $propbag->add('event_hooks', array(
  24. 'backend_publish' => true,
  25. 'backend_display' => true,
  26. 'backend_save' => true,
  27. ));
  28. $propbag->add('groups', array('FRONTEND_ENTRY_RELATED'));
  29. $config = array('what', 'mailto', 'sendtoall', 'includelink', 'striptags', 'keepstriptags', 'convertp', 'mailerbody');
  30. $propbag->add('configuration', $config);
  31. }
  32. function performConfig(&$bag) {
  33. if (is_object($bag)) {
  34. $conf = $bag->get('configuration');
  35. }
  36. $this->data['categories'] = serendipity_fetchCategories('all');
  37. if (!is_array($this->data['categories'])) {
  38. return false;
  39. }
  40. foreach($this->data['categories'] AS $cat) {
  41. $conf[] = 'category_' . $cat['categoryid'];
  42. $this->data['cat'][$cat['categoryid']] = $cat;
  43. }
  44. if (is_object($bag)) {
  45. $bag->add('configuration', $conf);
  46. }
  47. }
  48. function introspect_config_item($name, &$propbag)
  49. {
  50. if (preg_match('@^category_([0-9]+)$@imsU', $name, $catid)) {
  51. $parent = '';
  52. if ($this->data['cat'][$catid[1]]['parentid'] > 0) {
  53. $parent = " '" . $this->data['cat'][$this->data['cat'][$catid[1]]['parentid']]['category_name'] . "' -";
  54. }
  55. $propbag->add('type', 'string');
  56. $propbag->add('name', CATEGORY . $parent . " '" . $this->data['cat'][$catid[1]]['category_name'] . "'");
  57. $propbag->add('description', PLUGIN_EVENT_MAILER_RECIPIENTDESC);
  58. $propbag->add('default', '');
  59. return true;
  60. }
  61. switch($name) {
  62. case 'what':
  63. $propbag->add('type', 'select');
  64. $propbag->add('name', CONTENT);
  65. $propbag->add('description', '');
  66. $propbag->add('select_values',
  67. array(
  68. 'all' => ENTRY_BODY . ' + ' . EXTENDED_BODY,
  69. 'body' => ENTRY_BODY,
  70. 'extended' => EXTENDED_BODY,
  71. 'none' => NONE
  72. )
  73. );
  74. $propbag->add('default', 'all');
  75. break;
  76. case 'mailto':
  77. $propbag->add('type', 'string');
  78. $propbag->add('name', PLUGIN_EVENT_MAILER_RECIPIENT);
  79. $propbag->add('description', PLUGIN_EVENT_MAILER_RECIPIENTDESC);
  80. $propbag->add('default', '');
  81. break;
  82. case 'sendtoall':
  83. $propbag->add('type', 'boolean');
  84. $propbag->add('name', PLUGIN_EVENT_MAILER_SENDTOALL);
  85. $propbag->add('description', '');
  86. $propbag->add('default', 'false');
  87. break;
  88. case 'includelink':
  89. $propbag->add('type', 'boolean');
  90. $propbag->add('name', PLUGIN_EVENT_MAILER_LINK);
  91. $propbag->add('description', PLUGIN_EVENT_MAILER_LINKDESC);
  92. $propbag->add('default', 'false');
  93. break;
  94. case 'striptags':
  95. $propbag->add('type', 'boolean');
  96. $propbag->add('name', PLUGIN_EVENT_MAILER_STRIPTAGS);
  97. $propbag->add('description', PLUGIN_EVENT_MAILER_STRIPTAGSDESC);
  98. $propbag->add('default', 'false');
  99. break;
  100. case 'keepstriptags':
  101. $propbag->add('type', 'boolean');
  102. $propbag->add('name', PLUGIN_EVENT_MAILER_KEEPSTRIPTAGS);
  103. $propbag->add('description', PLUGIN_EVENT_MAILER_KEEPSTRIPTAGSDESC);
  104. $propbag->add('default', 'true');
  105. break;
  106. case 'convertp':
  107. $propbag->add('type', 'boolean');
  108. $propbag->add('name', PLUGIN_EVENT_MAILER_CONVERTP);
  109. $propbag->add('description', PLUGIN_EVENT_MAILER_CONVERTPDESC);
  110. $propbag->add('default', 'false');
  111. break;
  112. case 'mailerbody':
  113. $propbag->add('type', 'text');
  114. $propbag->add('name', PLUGIN_EVENT_MAILER_MAILTEXT);
  115. $propbag->add('description', '');
  116. $propbag->add('default', '');
  117. break;
  118. default:
  119. return false;
  120. }
  121. return true;
  122. }
  123. function generate_content(&$title)
  124. {
  125. $title = $this->title;
  126. }
  127. function sendMail($eventData)
  128. {
  129. global $serendipity;
  130. $mails = explode(' ', str_replace(',', '', $this->get_config('mailto')));
  131. $to = array();
  132. foreach($mails AS $mailto) {
  133. $mailto = trim($mailto);
  134. if (!empty($mailto)) {
  135. $to[] = $mailto;
  136. }
  137. }
  138. $this->performConfig($to);
  139. if (is_array($this->data['cat'])) {
  140. $selected = array();
  141. if (is_array($eventData['categories'])) {
  142. foreach($eventData['categories'] AS $idx => $cid) {
  143. $selected[$cid] = true;
  144. }
  145. }
  146. foreach($this->data['cat'] AS $cid => $cat) {
  147. $mailto = trim($this->get_config('category_' . $cid));
  148. if (!empty($mailto) && isset($selected[$cid])) {
  149. $tos = explode(' ', str_replace(',', '', $mailto));
  150. foreach($tos AS $mailtopart) {
  151. $to[] = trim($mailtopart);
  152. }
  153. }
  154. }
  155. }
  156. if ($serendipity['POST']['properties']['sendentry_all']) {
  157. $mails = serendipity_db_query("SELECT DISTINCT email FROM {$serendipity['dbPrefix']}authors");
  158. foreach($mails AS $mail) {
  159. $to[] = trim($mail['email']);
  160. }
  161. }
  162. $mail = array(
  163. 'subject' => $eventData['title'],
  164. 'body' => $eventData['body'] . $eventData['extended'],
  165. // 'from' => $serendipity['blogTitle'] . ' - ' . $eventData['author'] . ' <' . $serendipity['serendipityEmail'] . '>'
  166. 'from' => $serendipity['serendipityEmail']
  167. );
  168. switch($this->get_config('what')) {
  169. case 'all':
  170. $mail['body'] = $eventData['body'] . $eventData['extended'];
  171. break;
  172. case 'body':
  173. $mail['body'] = $eventData['body'];
  174. break;
  175. case 'extended':
  176. $mail['body'] = $eventData['extended'];
  177. break;
  178. case 'none':
  179. $mail['body'] = '';
  180. break;
  181. }
  182. if (!empty($serendipity['POST']['properties']['mailerbody'])) {
  183. $mail['body'] = $serendipity['POST']['properties']['mailerbody'] . "\n" . $mail['body'];
  184. }
  185. if (isset($serendipity['POST']['properties']['mailto'])) {
  186. $mails = explode(' ', str_replace(',', '', $serendipity['POST']['properties']['mailto']));
  187. foreach($mails as $mailto) {
  188. $mailto = trim($mailto);
  189. if (!in_array($mailto, $to)) {
  190. $to[] = $mailto;
  191. }
  192. }
  193. }
  194. if (serendipity_db_bool($this->get_config('convertp', 'false'))) {
  195. $mail['body'] = str_replace('</p>', "</p>\n", $mail['body']);
  196. }
  197. if (serendipity_db_bool($this->get_config('striptags', 'false'))) {
  198. if (serendipity_db_bool($this->get_config('keepstriptags', 'true'))) {
  199. $mail['body'] = preg_replace('@<a[^>]+href=["\']([^"\']*)["\'][^>]*>([^<]*)</a>@i', "$2 [$1]", $mail['body']);
  200. $mail['body'] = preg_replace('@<img[^>]+src=["\']([^"\']*)["\'][^>]*>@i', "[" . IMAGE . ": $1]", $mail['body']);
  201. } else {
  202. $mail['body'] = preg_replace('@<a[^>]+href=["\']([^"\']*)["\'][^>]*>([^<]*)</a>@i', "", $mail['body']);
  203. $mail['body'] = preg_replace('@<img[^>]+src=["\']([^"\']*)["\'][^>]*>@i', "", $mail['body']);
  204. }
  205. $mail['body'] = strip_tags($mail['body']);
  206. }
  207. if (serendipity_db_bool($this->get_config('includelink', 'false'))) {
  208. $mail['body'] = serendipity_archiveURL($eventData['id'], $eventData['title'], 'baseURL', true, array('timestamp' => $eventData['timestamp'])) . "\n\n" . $mail['body'];
  209. }
  210. foreach($to AS $mailto) {
  211. if (!empty($mailto)) {
  212. echo serendipity_specialchars($mailto) . '...<br />';
  213. serendipity_sendMail($mailto, $mail['subject'], $mail['body'], $mail['from']);
  214. }
  215. }
  216. }
  217. function event_hook($event, &$bag, &$eventData, $addData = null)
  218. {
  219. global $serendipity;
  220. $hooks = &$bag->get('event_hooks');
  221. if (isset($hooks[$event])) {
  222. switch($event) {
  223. case 'backend_display':
  224. if (isset($serendipity['POST']['properties']['mailto'])) {
  225. $mailto = $serendipity['POST']['properties']['mailto'];
  226. } else {
  227. $mailto = $this->get_config('mailto');
  228. }
  229. if (isset($serendipity['POST']['properties']['sendentry_all'])) {
  230. $sendtoall = $serendipity['POST']['properties']['sendentry_all'];
  231. } else {
  232. $sendtoall = serendipity_db_bool($this->get_config('sendtoall'));
  233. }
  234. if (isset($serendipity['POST']['properties']['mailerbody'])) {
  235. $mailerbody = $serendipity['POST']['properties']['mailerbody'];
  236. } else {
  237. $mailerbody = $this->get_config('mailerbody');
  238. }
  239. ?>
  240. <fieldset class="entryproperties">
  241. <span class="wrap_legend"><legend><?php echo PLUGIN_EVENT_MAILER_NAME; ?></legend></span>
  242. <div class="form_check">
  243. <input id="properties_sendentry" type="checkbox" name="serendipity[properties][sendentry]" value="true" checked="checked">
  244. <label title="<?php echo PLUGIN_EVENT_MAILER_SENDING; ?>" for="properties_sendentry"><?php echo PLUGIN_EVENT_MAILER_ISTOSENDIT; ?></label>
  245. </div>
  246. <div class="form_field">
  247. <label title="<?php echo PLUGIN_EVENT_MAILER_RECIPIENT; ?>" for="properties_mailto"><?php echo PLUGIN_EVENT_MAILER_RECIPIENTS; ?></label>
  248. <input id="properties_mailto" type="text" name="serendipity[properties][mailto]" value="<?php echo serendipity_specialchars($mailto); ?>">
  249. </div>
  250. <div class="form_check">
  251. <input id="sendall" type="checkbox" value="true" name="serendipity[properties][sendentry_all]" <?php echo ($sendtoall ? 'checked="checked"': ''); ?>>
  252. <label title="<?php echo PLUGIN_EVENT_MAILER_SENDTOALL; ?>" for="sendall"><?php echo PLUGIN_EVENT_MAILER_SENDTOALL; ?></label>
  253. </div>
  254. <?php if (!serendipity_db_bool($eventData['isdraft'])) { // Only show this for entries that are published ?>
  255. <div class="form_check">
  256. <input id="forcesend" type="checkbox" value="true" name="serendipity[properties][forcesend]">
  257. <label title="<?php echo PLUGIN_EVENT_MAILER_FORCESEND; ?>" for="forcesend"><?php echo PLUGIN_EVENT_MAILER_FORCESEND; ?></label>
  258. <br />
  259. <em><?php echo PLUGIN_EVENT_MAILER_FORCESEND_DESC; ?></em>
  260. </div>
  261. <?php } ?>
  262. <div class="form_check">
  263. <label for="mailerbody"><?= PLUGIN_EVENT_MAILER_MAILTEXT; ?></label>
  264. <textarea id="mailerbody" rows="5" name="serendipity[properties][mailerbody]" ><?php echo serendipity_specialchars($mailerbody); ?></textarea>
  265. </div>
  266. </fieldset>
  267. <?php
  268. break;
  269. case 'backend_save':
  270. if (serendipity_db_bool($eventData['isdraft'])) {
  271. // Never send e-mails for drafts.
  272. return true;
  273. }
  274. if (isset($serendipity['POST']['properties']['forcesend']) && $serendipity['POST']['properties']['forcesend']) {
  275. $this->sendMail($eventData);
  276. } else {
  277. echo PLUGIN_EVENT_MAILER_NOTSENDDECISION . '<br />';
  278. }
  279. break;
  280. case 'backend_publish':
  281. if (isset($serendipity['POST']['properties']) && !isset($serendipity['POST']['properties']['sendentry'])) {
  282. echo PLUGIN_EVENT_MAILER_NOTSENDDECISION . '<br />';
  283. } else {
  284. $this->sendMail($eventData);
  285. }
  286. break;
  287. default:
  288. return false;
  289. }
  290. return true;
  291. } else {
  292. return false;
  293. }
  294. }
  295. }
  296. /* vim: set sts=4 ts=4 expandtab : */