PageRenderTime 37ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/common/extensions/invitation_manager/php/invitation_form.class.php

https://bitbucket.org/chamilo/chamilo-dev/
PHP | 270 lines | 199 code | 46 blank | 25 comment | 17 complexity | f39eb92c462e69f2f2e97344a965855c MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, LGPL-3.0, GPL-3.0, MIT
  1. <?php
  2. namespace common\extensions\invitation_manager;
  3. use common\libraries\Mail;
  4. use common\libraries\FormValidator;
  5. use common\libraries\Translation;
  6. use common\libraries\Utilities;
  7. use common\libraries\EqualityCondition;
  8. use common\libraries\AndCondition;
  9. use user\User;
  10. use user\UserDataManager;
  11. use admin\AdminDataManager;
  12. use rights\RightsDataManager;
  13. use common\libraries\Path;
  14. use PHPExcel_Reader_Excel2007;
  15. require_once Path :: get_plugin_path() . 'phpexcel/PHPExcel.php';
  16. class InvitationForm extends FormValidator
  17. {
  18. const IMPORT_FILE_NAME = 'email_address_file';
  19. private $invitation_manager;
  20. private $valid_email_regex = '/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/';
  21. function __construct($invitation_manager, $action)
  22. {
  23. parent :: __construct('invitation_form', 'post', $action);
  24. $this->invitation_manager = $invitation_manager;
  25. $this->build_form();
  26. $this->setDefaults();
  27. }
  28. function build_form()
  29. {
  30. $this->addElement('category', Translation :: get('Invitation'));
  31. $this->add_information_message(null, null, Translation :: get('ExcelOfEmailAddresses'));
  32. $this->addElement('file', self :: IMPORT_FILE_NAME, Translation :: get('FileName'));
  33. // $this->addElement('textarea', Invitation :: PROPERTY_EMAIL, Translation :: get('EmailAddresses'), 'cols="70" rows="8"');
  34. // $this->addRule(Invitation :: PROPERTY_EMAIL, Translation :: get('ThisFieldIsRequired', null, Utilities :: COMMON_LIBRARIES), 'required');
  35. $this->add_forever_or_expiration_date_window(Invitation :: PROPERTY_EXPIRATION_DATE);
  36. $this->addElement('checkbox', Invitation :: PROPERTY_ANONYMOUS, Translation :: get('Anonymous'), null, 1);
  37. // $rights_templates = RightsDataManager :: get_instance()->retrieve_rights_templates();
  38. // while ($rights_template = $rights_templates->next_result())
  39. // {
  40. // $defaults[$rights_template->get_id()] = array('title' => $rights_template->get_name(), 'description', $rights_template->get_description(), 'class' => 'rights_template');
  41. // }
  42. //
  43. // $url = Path :: get(WEB_PATH) . 'rights/xml_feeds/xml_rights_template_feed.php';
  44. // $locale = array();
  45. // $locale['Display'] = Translation :: get('AddRightsTemplates');
  46. // $locale['Searching'] = Translation :: get('Searching', null, Utilities :: COMMON_LIBRARIES);
  47. // $locale['NoResults'] = Translation :: get('NoResults', null, Utilities :: COMMON_LIBRARIES);
  48. // $locale['Error'] = Translation :: get('Error', null, Utilities :: COMMON_LIBRARIES);
  49. // $hidden = true;
  50. //
  51. // $element_finder = $this->addElement('element_finder', 'rights_templates', null, $url, $locale, array());
  52. // $element_finder->setDefaultCollapsed(true);
  53. $this->addElement('category');
  54. $this->addElement('category', Translation :: get('InvitationMessage'));
  55. $this->add_textfield(Invitation :: PROPERTY_TITLE, Translation :: get('InvitationSubject'), true);
  56. //$this->addElement('text', Invitation :: PROPERTY_TITLE, Translation :: get('InvitationSubject'));
  57. $this->addRule(Invitation :: PROPERTY_TITLE, Translation :: get('ThisFieldIsRequired', null, Utilities :: COMMON_LIBRARIES), 'required');
  58. $this->add_html_editor(Invitation :: PROPERTY_MESSAGE, Translation :: get('InvitationBody'), true);
  59. $this->addElement('category');
  60. $checkboxes = array();
  61. $checkboxes[] = '<script type="text/javascript">';
  62. $checkboxes[] = '$(document).ready(function() {';
  63. $checkboxes[] = '$("input:checkbox[name=\'' . Invitation :: PROPERTY_ANONYMOUS . '\']").iphoneStyle({ checkedLabel: \'' . Translation :: get('ConfirmYes', null, Utilities :: COMMON_LIBRARIES) . '\', uncheckedLabel: \'' . Translation :: get('ConfirmNo', null, Utilities :: COMMON_LIBRARIES) . '\'});';
  64. $checkboxes[] = '});';
  65. $checkboxes[] = '</script>';
  66. $this->addElement('html', implode("\n", $checkboxes));
  67. $buttons[] = $this->createElement('style_submit_button', 'submit', Translation :: get('Invite'), array(
  68. 'class' => 'positive update'));
  69. $buttons[] = $this->createElement('style_reset_button', 'reset', Translation :: get('Reset', null, Utilities :: COMMON_LIBRARIES), array(
  70. 'class' => 'normal empty'));
  71. $this->addGroup($buttons, 'buttons', null, '&nbsp;', false);
  72. }
  73. /**
  74. * Sets default values.
  75. * @param array $defaults Default values for this form's parameters.
  76. */
  77. function setDefaults($defaults = array ())
  78. {
  79. $expiration_date = $this->invitation_manager->get_parent()->get_expiration_date();
  80. $defaults[Invitation :: PROPERTY_ANONYMOUS] = 0;
  81. if ($expiration_date == 0)
  82. {
  83. $defaults['forever'] = 1;
  84. }
  85. else
  86. {
  87. $defaults['forever'] = 0;
  88. $defaults[Invitation :: PROPERTY_EXPIRATION_DATE] = $expiration_date;
  89. }
  90. parent :: setDefaults($defaults);
  91. }
  92. function process()
  93. {
  94. $values = $this->exportValues();
  95. $array = explode('.', $_FILES[self :: IMPORT_FILE_NAME]['name']);
  96. $type = $array[count($array) - 1];
  97. if ($type != 'xlsx')
  98. {
  99. return false;
  100. }
  101. $PhpReader = new PHPExcel_Reader_Excel2007();
  102. $excel = $PhpReader->load($_FILES[self :: IMPORT_FILE_NAME]['tmp_name']);
  103. $worksheet = $excel->getActiveSheet();
  104. $excel_array = $worksheet->toArray();
  105. $emails = array();
  106. //each row in excel except row 1 = headers !
  107. for($i = 1; $i < count($excel_array); $i ++)
  108. {
  109. $emails[] = $excel_array[$i][0];
  110. }
  111. $invitation_parameters = new InvitationParameters();
  112. $invitation_parameters->set_emails_from_array($emails);
  113. $emails = $values[Invitation :: PROPERTY_EMAIL];
  114. if ($emails)
  115. {
  116. $invitation_parameters->set_emails_from_string($emails);
  117. }
  118. $emails = $invitation_parameters->get_emails();
  119. $properties = $invitation_parameters->get_properties();
  120. $existing_users = array();
  121. $parameters = $this->invitation_manager->get_parent()->get_url_parameters();
  122. $location_rights_ids = $this->invitation_manager->get_parent()->get_location_rights_ids();
  123. $rights_class_method = $this->invitation_manager->get_parent()->get_set_right_class_and_method();
  124. $anonymous = $values[Invitation :: PROPERTY_ANONYMOUS];
  125. if (! $anonymous)
  126. {
  127. $anonymous = 0;
  128. }
  129. $invitation_user = $this->invitation_manager->get_parent()->get_invitation_user();
  130. $invitation_user_email = $invitation_user->get_email();
  131. $invitation_user_name = $invitation_user->get_fullname();
  132. foreach ($emails as $email)
  133. {
  134. $email_condition = new EqualityCondition(User :: PROPERTY_EMAIL, $email);
  135. $users = UserDataManager :: get_instance()->retrieve_users($email_condition);
  136. $failures = 0;
  137. $succes = false;
  138. if ($users->size() > 0)
  139. {
  140. while ($user = $users->next_result())
  141. {
  142. $existing_users[] = $user->get_id();
  143. }
  144. }
  145. else
  146. {
  147. $invitation = null;
  148. $invitation_conditions = array();
  149. $invitation_conditions[] = new EqualityCondition(Invitation :: PROPERTY_EMAIL, $email);
  150. $invitation_conditions[] = new EqualityCondition(Invitation :: PROPERTY_PARAMETERS, $parameters);
  151. $invitation_condition = new AndCondition($invitation_conditions);
  152. $count = AdminDataManager :: get_instance()->count_invitations($invitation_condition);
  153. if ($count > 0)
  154. {
  155. $invitations = AdminDataManager :: get_instance()->retrieve_invitations($invitation_condition);
  156. $invitation = $invitations->next_result();
  157. if ($invitation)
  158. {
  159. $invitation->set_expiration_date($values[Invitation :: PROPERTY_EXPIRATION_DATE]);
  160. $invitation->set_anonymous($anonymous);
  161. $invitation->set_title($values[Invitation :: PROPERTY_TITLE]);
  162. $invitation->set_message($values[Invitation :: PROPERTY_MESSAGE]);
  163. $invitation->set_rights_templates($location_rights_ids);
  164. $invitation->set_rights_class_method($rights_class_method);
  165. $succes = $invitation->update();
  166. if (! $succes)
  167. {
  168. $failures ++;
  169. }
  170. }
  171. }
  172. else
  173. {
  174. $invitation = new Invitation();
  175. $invitation->set_email($email);
  176. $invitation->set_parameters($parameters);
  177. $invitation->set_rights_templates($location_rights_ids);
  178. $invitation->set_rights_class_method($rights_class_method);
  179. $invitation->set_expiration_date($values[Invitation :: PROPERTY_EXPIRATION_DATE]);
  180. $invitation->set_anonymous($anonymous);
  181. $invitation->set_title($values[Invitation :: PROPERTY_TITLE]);
  182. $invitation->set_message($values[Invitation :: PROPERTY_MESSAGE]);
  183. $succes = $invitation->create();
  184. if (! $succes)
  185. {
  186. $failures ++;
  187. }
  188. }
  189. if ($succes)
  190. {
  191. $from = array();
  192. $from[Mail :: NAME] = $invitation_user_name;
  193. $from[Mail :: EMAIL] = $invitation_user_email;
  194. $message = array();
  195. $message[] = $invitation->get_message();
  196. $message[] = '<br/>';
  197. $message[] = $this->invitation_manager->get_invitation_url($invitation);
  198. $message = implode('\n', $message);
  199. $mail = Mail :: factory($invitation->get_title(), $message, $email, $from);
  200. $reply = array();
  201. $reply[Mail :: NAME] = $invitation_user_name;
  202. $reply[Mail :: EMAIL] = $invitation_user_email;
  203. $mail->set_reply($reply);
  204. // Check whether it was sent successfully
  205. if ($mail->send() === FALSE)
  206. {
  207. $failures ++;
  208. }
  209. }
  210. }
  211. }
  212. $succes = $this->invitation_manager->get_parent()->process_existing_users($existing_users);
  213. if (! $succes)
  214. {
  215. $failures ++;
  216. }
  217. if ($failures > 0)
  218. {
  219. $succes = false;
  220. }
  221. return $succes;
  222. }
  223. }
  224. ?>