PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/php/lib/mail_manager/component/send_mail.class.php

https://bitbucket.org/chamilo/chamilo-app-survey/
PHP | 373 lines | 307 code | 64 blank | 2 comment | 33 complexity | b66c242f468924f116da40e857c3489d MD5 | raw file
  1. <?php
  2. namespace application\survey;
  3. use common\libraries\Translation;
  4. use common\libraries\Request;
  5. use common\libraries\Breadcrumb;
  6. use common\libraries\BreadcrumbTrail;
  7. use repository\RepositoryDataManager;
  8. use common\libraries\EqualityCondition;
  9. use tracking\Tracker;
  10. use tracking\Event;
  11. use common\libraries\Theme;
  12. use user\UserDataManager;
  13. use common\libraries\path;
  14. use common\libraries\Mail;
  15. use common\libraries\DynamicTabsRenderer;
  16. ini_set("memory_limit", "-1");
  17. ini_set("max_execution_time", "0");
  18. class SurveyMailManagerSendMailComponent extends SurveyMailManager
  19. {
  20. private $invitees;
  21. private $reporting_users;
  22. private $not_started;
  23. private $started;
  24. private $finished;
  25. private $mail_send = true;
  26. private $publication_id;
  27. private $survey_id;
  28. private $type;
  29. private $send_date;
  30. function run()
  31. {
  32. $this->publication_id = Request :: get(SurveyMailManager :: PARAM_PUBLICATION_ID);
  33. $this->type = Request :: get(SurveyMailManager :: PARAM_TYPE);
  34. if (! SurveyRights :: is_allowed_in_surveys_subtree(SurveyRights :: RIGHT_INVITE, $this->publication_id, SurveyRights :: TYPE_PUBLICATION, $this->get_user_id()))
  35. {
  36. $this->display_header();
  37. $this->display_error_message(Translation :: get('NotAllowed'));
  38. $this->display_footer();
  39. exit();
  40. }
  41. switch ($this->type)
  42. {
  43. case SurveyMailManager :: MAIL_PARTICIPANT_TYPE :
  44. $this->invitees = SurveyRights :: get_allowed_users(SurveyRights :: RIGHT_PARTICIPATE, $this->publication_id, SurveyRights :: TYPE_PUBLICATION);
  45. $this->not_started = array();
  46. $this->started = array();
  47. $this->finished = array();
  48. $condition = new EqualityCondition(SurveyParticipantTracker :: PROPERTY_SURVEY_PUBLICATION_ID, $this->publication_id);
  49. $trackers = Tracker :: get_data(SurveyParticipantTracker :: CLASS_NAME, SurveyManager :: APPLICATION_NAME, $condition);
  50. while ($tracker = $trackers->next_result())
  51. {
  52. if ($tracker->get_status() == SurveyParticipantTracker :: STATUS_FINISHED)
  53. {
  54. $this->finished[] = $tracker->get_user_id();
  55. }
  56. else
  57. if ($tracker->get_status() == SurveyParticipantTracker :: STATUS_STARTED)
  58. {
  59. $this->started[] = $tracker->get_user_id();
  60. }
  61. }
  62. $invitee_count = count(array_unique($this->invitees));
  63. $started_count = count(array_unique($this->started));
  64. $finished_count = count(array_unique($this->finished));
  65. $started_and_finished_users = array_merge($this->started, $this->finished);
  66. $this->not_started = array_diff($this->invitees, $started_and_finished_users);
  67. $not_started_count = $invitee_count-$started_count-$finished_count;
  68. $users = array();
  69. $users[SurveyRights :: PARTICIPATE_RIGHT_NAME] = $invitee_count;
  70. $users[SurveyParticipantTracker :: STATUS_STARTED] = $started_count;
  71. $users[SurveyParticipantTracker :: STATUS_NOTSTARTED] = $not_started_count;
  72. $users[SurveyParticipantTracker :: STATUS_FINISHED] = $finished_count;
  73. break;
  74. case SurveyMailManager :: MAIL_EXPORT_TYPE :
  75. $this->invitees = SurveyRights :: get_allowed_users(SurveyRights :: RIGHT_EXPORT_RESULT, $this->publication_id, SurveyRights :: TYPE_PUBLICATION);
  76. $invitee_count = count(array_unique($this->invitees));
  77. $users = array();
  78. $users[SurveyRights :: EXPORT_RESULT_RIGHT_NAME] = $invitee_count;
  79. //
  80. break;
  81. case SurveyMailManager :: MAIL_REPORTING_TYPE :
  82. $this->invitees = SurveyRights :: get_allowed_users(SurveyRights :: RIGHT_REPORTING, $this->publication_id, SurveyRights :: TYPE_PUBLICATION);
  83. $invitee_count = count(array_unique($this->invitees));
  84. $users = array();
  85. $users[SurveyRights :: REPORTING_RIGHT_NAME] = $invitee_count;
  86. break;
  87. }
  88. $survey_publication = SurveyDataManager :: get_instance()->retrieve_survey_publication($this->publication_id);
  89. $this->survey_id = $survey_publication->get_content_object_id();
  90. $survey = RepositoryDataManager :: get_instance()->retrieve_content_object($this->survey_id);
  91. $form = new SurveyPublicationMailerForm($this, $this->get_user(), $users, $this->type, $this->get_url(array(
  92. self :: PARAM_PUBLICATION_ID => $this->publication_id, SurveyMailManager :: PARAM_TYPE => $this->type)));
  93. if ($form->validate())
  94. {
  95. $values = $form->exportValues();
  96. $user_ids = $form->get_seleted_group_user_ids();
  97. $this->parse_values($values, $user_ids);
  98. }
  99. else
  100. {
  101. $this->display_header();
  102. echo $this->get_survey_html($survey);
  103. echo $form->toHtml();
  104. $this->display_footer();
  105. }
  106. }
  107. function get_survey_html($survey)
  108. {
  109. $html = array();
  110. $html[] = '<div class="content_object" style="background-image: url(' . Theme :: get_image_path('survey') . 'survey_22.png);">';
  111. switch ($this->type)
  112. {
  113. case SurveyMailManager :: MAIL_PARTICIPANT_TYPE :
  114. $html[] = '<div class="title">' . Translation :: get('MailToParticipantsForSurvey') . ' ' . ' </div>';
  115. break;
  116. case SurveyMailManager :: MAIL_EXPORT_TYPE :
  117. $html[] = '<div class="title">' . Translation :: get('MailToExportersForSurvey') . ' ' . ' </div>';
  118. break;
  119. case SurveyMailManager :: MAIL_REPORTING_TYPE :
  120. $html[] = '<div class="title">' . Translation :: get('MailToReportersForSurvey') . ' ' . ' </div>';
  121. break;
  122. }
  123. $html[] = $survey->get_title() . '<br/>';
  124. $html[] = '</div>';
  125. return implode("\n", $html);
  126. }
  127. function parse_values($values, $user_ids)
  128. {
  129. $users = array();
  130. $mail_user_ids = array();
  131. $dm = UserDataManager :: get_instance();
  132. switch ($this->type)
  133. {
  134. case SurveyMailManager :: MAIL_PARTICIPANT_TYPE :
  135. if (isset($user_ids))
  136. {
  137. $this->invitees = array_intersect($this->invitees, $user_ids);
  138. }
  139. $not_started = $values[SurveyParticipantTracker :: STATUS_NOTSTARTED];
  140. if ($not_started == 1)
  141. {
  142. $mail_user_ids = array_merge($mail_user_ids, $this->not_started);
  143. }
  144. $started = $values[SurveyParticipantTracker :: STATUS_STARTED];
  145. if ($started == 1)
  146. {
  147. $mail_user_ids = array_merge($mail_user_ids, $this->started);
  148. }
  149. $finished = $values[SurveyParticipantTracker :: STATUS_FINISHED];
  150. if ($finished == 1)
  151. {
  152. $mail_user_ids = array_merge($mail_user_ids, $this->finished);
  153. }
  154. $invitees = $values[SurveyRights :: PARTICIPATE_RIGHT_NAME];
  155. if ($invitees == 1)
  156. {
  157. $mail_user_ids = array_merge($mail_user_ids, $this->invitees);
  158. }
  159. break;
  160. case SurveyMailManager :: MAIL_EXPORT_TYPE :
  161. if (isset($user_ids))
  162. {
  163. $this->invitees = array_intersect($this->invitees, $user_ids);
  164. }
  165. $invitees = $values[SurveyRights :: EXPORT_RESULT_RIGHT_NAME];
  166. if ($invitees == 1)
  167. {
  168. $mail_user_ids = array_merge($mail_user_ids, $this->invitees);
  169. }
  170. break;
  171. case SurveyMailManager :: MAIL_REPORTING_TYPE :
  172. if (isset($user_ids))
  173. {
  174. $this->invitees = array_intersect($this->invitees, $user_ids);
  175. }
  176. $invitees = $values[SurveyRights :: REPORTING_RIGHT_NAME];
  177. if ($invitees == 1)
  178. {
  179. $mail_user_ids = array_merge($mail_user_ids, $this->invitees);
  180. }
  181. break;
  182. }
  183. $mail_user_ids = array_unique($mail_user_ids);
  184. if (count($mail_user_ids) == 0)
  185. {
  186. $this->redirect(Translation :: get('NoSurveyMailsSend'), false, array(
  187. self :: PARAM_ACTION => self :: ACTION_BROWSE));
  188. }
  189. else
  190. {
  191. $email_content = $values[SurveyPublicationMailerForm :: EMAIL_CONTENT];
  192. $fullbody = array();
  193. $fullbody[] = $email_content;
  194. $fullbody[] = '<br/><br/>';
  195. $fullbody[] = '<p id="link">';
  196. $parameters = array();
  197. switch ($this->type)
  198. {
  199. case SurveyMailManager :: MAIL_PARTICIPANT_TYPE :
  200. $parameters[SurveyManager :: PARAM_ACTION] = SurveyManager :: ACTION_TAKE;
  201. $parameters[SurveyManager :: PARAM_SURVEY_ID] = $this->survey_id;
  202. $parameters[SurveyManager :: PARAM_PUBLICATION_ID] = $this->publication_id;
  203. $url = Path :: get(WEB_PATH) . $this->get_link($parameters);
  204. $fullbody[] = '<a href=' . $url . '>' . Translation :: get('ClickToTakeSurvey') . '</a>';
  205. $selected_tab = SurveyMailManagerBrowserComponent :: TAB_MAILS_TO_PARTICIPANTS;
  206. break;
  207. case SurveyMailManager :: MAIL_EXPORT_TYPE :
  208. $parameters[SurveyManager :: PARAM_ACTION] = SurveyManager :: ACTION_EXPORT;
  209. $parameters[SurveyManager :: PARAM_PUBLICATION_ID] = $this->publication_id;
  210. $url = Path :: get(WEB_PATH) . $this->get_link($parameters);
  211. $fullbody[] = '<a href=' . $url . '>' . Translation :: get('ClickToExportResults') . '</a>';
  212. $selected_tab = SurveyMailManagerBrowserComponent :: TAB_MAILS_TO_EXPORTERS;
  213. break;
  214. case SurveyMailManager :: MAIL_REPORTING_TYPE :
  215. $parameters[SurveyManager :: PARAM_ACTION] = SurveyManager :: ACTION_REPORTING;
  216. $parameters[SurveyManager :: PARAM_PUBLICATION_ID] = $this->publication_id;
  217. $url = Path :: get(WEB_PATH) . $this->get_link($parameters);
  218. $fullbody[] = '<a href=' . $url . '>' . Translation :: get('ClickToViewReports') . '</a>';
  219. $selected_tab = SurveyMailManagerBrowserComponent :: TAB_MAILS_TO_REPORTERS;
  220. break;
  221. }
  222. $fullbody[] = '<br/><br/>' . Translation :: get('OrCopyAndPasteThisText') . ':';
  223. $fullbody[] = '<br/><a href=' . $url . '>' . $url . '</a>';
  224. $fullbody[] = '</p>';
  225. $body = implode("\n", $fullbody);
  226. $email_header = $values[SurveyPublicationMailerForm :: EMAIL_HEADER];
  227. $email_from_address = $values[SurveyPublicationMailerForm :: FROM_ADDRESS];
  228. $email_reply_address = $values[SurveyPublicationMailerForm :: REPLY_ADDRESS];
  229. $email_from_address_name = $values[SurveyPublicationMailerForm :: FROM_ADDRESS_NAME];
  230. $email_reply_address_name = $values[SurveyPublicationMailerForm :: REPLY_ADDRESS_NAME];
  231. $email = new SurveyPublicationMail();
  232. $email->set_mail_header($email_header);
  233. $email->set_mail_content($body);
  234. $email->set_sender_user_id($this->get_user_id());
  235. $email->set_from_address($email_from_address);
  236. $email->set_from_address_name($email_from_address_name);
  237. $email->set_reply_address($email_reply_address);
  238. $email->set_reply_address_name($email_reply_address_name);
  239. $email->set_publication_id($this->publication_id);
  240. $email->set_send_date(time());
  241. $email->set_type($this->type);
  242. $succes = $email->create();
  243. if ($succes)
  244. {
  245. foreach ($mail_user_ids as $user_id)
  246. {
  247. $user = $dm->retrieve_user($user_id);
  248. $to_email = $user->get_email();
  249. $this->send_mail($user_id, $to_email, $email);
  250. }
  251. if ($this->mail_send == false)
  252. {
  253. $this->redirect(Translation :: get('NotAllMailsSend'), true, array(
  254. self :: PARAM_ACTION => self :: ACTION_BROWSE,
  255. DynamicTabsRenderer :: PARAM_SELECTED_TAB => $selected_tab));
  256. }
  257. else
  258. {
  259. $this->redirect(Translation :: get('AllMailsSend'), false, array(
  260. self :: PARAM_ACTION => self :: ACTION_BROWSE,
  261. DynamicTabsRenderer :: PARAM_SELECTED_TAB => $selected_tab));
  262. }
  263. }
  264. else
  265. {
  266. $this->redirect(Translation :: get('NoMailsSend'), true, array(
  267. self :: PARAM_ACTION => self :: ACTION_BROWSE,
  268. DynamicTabsRenderer :: PARAM_SELECTED_TAB => $selected_tab));
  269. }
  270. }
  271. }
  272. function send_mail($user_id, $to_email, $email)
  273. {
  274. $arg = array();
  275. $args[SurveyPublicationMailTracker :: PROPERTY_USER_ID] = $user_id;
  276. $args[SurveyPublicationMailTracker :: PROPERTY_SURVEY_PUBLICATION_MAIL_ID] = $email->get_id();
  277. $from = array();
  278. $from[Mail :: NAME] = $email->get_from_address_name();
  279. $from[Mail :: EMAIL] = $email->get_from_address();
  280. $mail = Mail :: factory($email->get_mail_header(), $email->get_mail_content(), $to_email, $from);
  281. $reply = array();
  282. $reply[Mail :: NAME] = $email->get_reply_address_name();
  283. $reply[Mail :: EMAIL] = $email->get_reply_address();
  284. $mail->set_reply($reply);
  285. // Check whether it was sent successfully
  286. if ($mail->send() === FALSE)
  287. {
  288. $this->mail_send = false;
  289. $args[SurveyPublicationMailTracker :: PROPERTY_STATUS] = SurveyPublicationMailTracker :: STATUS_MAIL_NOT_SEND;
  290. }
  291. else
  292. {
  293. $args[SurveyPublicationMailTracker :: PROPERTY_STATUS] = SurveyPublicationMailTracker :: STATUS_MAIL_SEND;
  294. }
  295. $args[SurveyPublicationMailTracker :: PROPERTY_SURVEY_PUBLICATION_ID] = $this->publication_id;
  296. $tracker = Event :: trigger(SurveyPublicationMailTracker :: REGISTER_PUBLICATION_MAIL_EVENT, SurveyManager :: APPLICATION_NAME, $args);
  297. }
  298. function add_additional_breadcrumbs(BreadcrumbTrail $breadcrumbtrail)
  299. {
  300. $breadcrumbtrail->add(new Breadcrumb($this->get_url(array(self :: PARAM_ACTION => self :: ACTION_BROWSE)), Translation :: get('BrowseSurveys')));
  301. $breadcrumbtrail->add(new Breadcrumb($this->get_url(array(
  302. SurveyMailManager :: PARAM_ACTION => SurveyMailManager :: ACTION_BROWSE)), Translation :: get('BrowseSurveyPublicationMails')));
  303. }
  304. function get_additional_parameters()
  305. {
  306. return array(self :: PARAM_PUBLICATION_ID);
  307. }
  308. }
  309. ?>