Source for file regevent.php

Documentation is available at regevent.php

  1. <?php
  2.  
  3. /* Global Array for the currently active choices for additional questions */
  4. $GLOBALS["net_nemein_registrations__aq_choices"] = Array ("undef" => "AQ-Array uninitialized");
  5.  
  6. function net_nemein_registration_get_aq_choices() {
  7. return $GLOBALS["net_nemein_registrations__aq_choices"];
  8. }
  9.  
  10. class net_nemein_registrations_regevent {
  11. var $_debug_prefix;
  12.  
  13. var $_config;
  14. var $_topic;
  15. var $_auth;
  16. var $_root_event;
  17. var $_l10n;
  18. var $_l10n_midcom;
  19.  
  20. var $event;
  21. var $dm;
  22. function net_nemein_registrations_regevent($event, $topic, $config, $auth, $root_event) {
  23. $this->_debug_prefix = "net.nemein.registrations regevent::";
  24. debug_push($this->_debug_prefix . "constructor");
  25. $this->_config = $config;
  26. $this->_topic = $topic;
  27. $this->_root_event = $root_event;
  28. $this->_auth = $auth;
  29. $i18n =& $GLOBALS["midcom"]->get_service("i18n");
  30. $this->_l10n = $i18n->get_l10n("net.nemein.registrations");
  31. $this->_l10n_midcom = $i18n->get_l10n("midcom");
  32. $this->dm = new midcom_helper_datamanager($this->_config->get("schemadb"));
  33. /* Populate the global array with all schemas available for additional questions
  34. * that is used by the default dm schema. Skips all schemas already in use.
  35. */
  36. debug_print_r("GLOBAL AQ CHOICES before: ", $GLOBALS["net_nemein_registrations__aq_choices"]);
  37. $GLOBALS["net_nemein_registrations__aq_choices"] = Array("" => $this->_l10n->get("Not configured, please select one.") );
  38. $db = $this->dm->get_layout_database();
  39. foreach ($db as $name => $schema) {
  40. /* Skip schemas already used elsewhere */
  41. if ( $name == $this->_config->get("registrar_schema")
  42. || $name == $this->_config->get("event_schema")
  43. )
  44. continue;
  45. $GLOBALS["net_nemein_registrations__aq_choices"][$name] = $schema["description"];
  46. }
  47. debug_print_r("GLOBAL AQ CHOICES after: ", $GLOBALS["net_nemein_registrations__aq_choices"]);
  48. /* Reread the datamanager schema after the global varibale
  49. * has been set correctly by rebuilding the object.
  50. * NOTE: This is a hack as the widget_select does only read
  51. * the available choices once on startup.
  52. */
  53. $this->dm = new midcom_helper_datamanager($this->_config->get("schemadb"));
  54. if (is_numeric($event)) {
  55. debug_add("\$event is an integer, trying to load event from Midgard Database.");
  56. $this->event = mgd_get_event ($event);
  57. } else {
  58. $this->event = $event;
  59. }
  60. if ($this->event === false) {
  61. debug_add("Event could not be loaded, last midgard error was: " . mgd_errstr());
  62. debug_pop();
  63. $this = false;
  64. return false;
  65. }
  66. if ($this->event->parameter("midcom.helper.datamanager", "layout") != $this->_config->get("event_schema")) {
  67. /* It seems, that this event does not match the schema that was configured,
  68. * we correct this implicitly or everything else will break.
  69. */
  70. debug_print_r("The schema for the following event was set incorrectly, setting it to the schema "
  71. . $this->_config->get("event_schema"), $this->event);
  72. $this->_su();
  73. $this->event->parameter("midcom.helper.datamanager", "layout", $this->_config->get("event_schema"));
  74. $this->_su(false);
  75. }
  76. if (!$this->dm->init($this->event)) {
  77. debug_add("Could not initialize datamanager, see above for errors.");
  78. debug_pop();
  79. $this = false;
  80. return false;
  81. }
  82. debug_pop();
  83. }
  84. function get_notification_email () {
  85. $local = $this->dm->data["notification_email"];
  86. if ($local == "")
  87. return $this->_config->get("mail_registration_ccs");
  88. else
  89. return $local;
  90. }
  91. function get_additional_questions_schema () {
  92. return $this->dm->data["additional_questions"];
  93. }
  94. function is_open () {
  95. $now = time();
  96. $open = $this->dm->data["open_registration"]["timestamp"];
  97. $close = $this->dm->data["close_registration"]["timestamp"];
  98. if ($open == 0 && $close == 0)
  99. return false;
  100. if ($open <= $now && ( $close >= $now || $close == 0))
  101. return true;
  102. else
  103. return false;
  104. }
  105. function get_registrars () {
  106. debug_push ($this->_debug_prefix . "get_registrars");
  107. $result = Array();
  108. /* First, we query all event members, then we load the person records in question. */
  109. $emembers = mgd_list_event_members($this->event->id);
  110. if (!$emembers) {
  111. if (mgd_errstr() == "MGD_ERR_OK") {
  112. return Array();
  113. } else {
  114. debug_add("Failed querying event members: " . mgd_errstr());
  115. debug_pop();
  116. return false;
  117. }
  118. }
  119. $persons = Array();
  120. while($emembers->fetch()) {
  121. $persons[] = $emembers->uid;
  122. $eidmap[$emembers->uid] = $emembers->id;
  123. }
  124. /* Now, lets sort these persons after their name. */
  125. mgd_sort_id_array($persons, "rname", "MidgardPerson", SORT_STRING);
  126. /* Translate the IDs into Person Records */
  127. $datamanager = new midcom_helper_datamanager($this->_config->get("schemadb"));
  128. if (!$datamanager) {
  129. debug_add("Datamanager could not be created, aborting. Error was: " . $GLOBALS['midcom_errstr']);
  130. debug_pop();
  131. return false;
  132. }
  133. foreach ($persons as $id) {
  134. $person = mgd_get_person ($id);
  135. if (!$person) {
  136. debug_add("Data inconsistency, Event Member Person ID $id could not be loaded: " . mgd_errstr());
  137. debug_pop();
  138. return false;
  139. }
  140. $eventmember = mgd_get_event_member($eidmap[$id]);
  141. if (! $eventmember) {
  142. debug_add("Data inconsistency, Event Member " . $eidmpa[$id] . " could not be löoaded: " . mgd_errstr());
  143. debug_pop();
  144. return false;
  145. }
  146. if ($datamanager->init($person)) {
  147. $approved = $eventmember->parameter("net.nemein.registrations","approved");
  148. $approver = $eventmember->parameter("net.nemein.registrations","approver");
  149. $result[$id] = $datamanager->get_array();
  150. $result[$id]["_eventmember_id"] = $eidmap[$id];
  151. $result[$id]["_person_id"] = $id;
  152. $result[$id]["_person"] = $person;
  153. if ($approved !== false && $approved > 0) {
  154. $approver_person = mgd_get_person($approver);
  155. if (! $approver_person) {
  156. debug_add("Data inconsistency, could not load approver person record for person ID $approver while processing eventmember "
  157. . $eidmap[$id] . ": " . mgd_errstr());
  158. debug_pop();
  159. return false;
  160. }
  161. $result[$id]["_approved"] = $approved;
  162. $result[$id]["_approver"] = $approver_person;
  163. } else {
  164. $result[$id]["_approved"] = false;
  165. $result[$id]["_approver"] = null;
  166. }
  167. } else {
  168. debug_add("Warning, datamanager could not be initialized, skipping object. Error was: " . $GLOBALS['midcom_errstr']);
  169. }
  170. }
  171. debug_pop();
  172. return $result;
  173. }
  174. function get_datamanager_for_registration ($registrar_record) {
  175. debug_push($this->_debug_prefix . "get_datamanager_for_registration");
  176. /* Requires an record retrieved by get_registrars or directly an eventmember id */
  177. if (! ( ( is_array($registrar_record)
  178. && array_key_exists("_eventmember_id", $registrar_record)
  179. )
  180. || is_numeric($registrar_record)
  181. )
  182. )
  183. {
  184. debug_print_r("Wrong argument, either no number or no array or the event member id is missing:", $registrar_record);
  185. debug_pop();
  186. return null;
  187. }
  188. if (is_numeric($registrar_record)) {
  189. $emember = mgd_get_event_member($registrar_record);
  190. } else {
  191. $emember = mgd_get_event_member($registrar_record['_eventmember_id']);
  192. }
  193. if (! $emember) {
  194. debug_add("Could not load eventmember record: " . mgd_errstr());
  195. debug_pop();
  196. return null;
  197. }
  198. $datamanager = new midcom_helper_datamanager($this->_config->get("schemadb"));
  199. if (!$datamanager) {
  200. debug_add("Datamanager could not be created, aborting. Error was: " . $GLOBALS['midcom_errstr']);
  201. debug_pop();
  202. return null;
  203. }
  204.  
  205. if (! $datamanager->init($emember)) {
  206. debug_add("Warning, datamanager could not be initialized, aborting. Error was: " . $GLOBALS['midcom_errstr']);
  207. debug_pop();
  208. return null;
  209. }
  210. debug_pop();
  211. return $datamanager;
  212. }
  213. function get_datamanager_for_registrar ($registrar_record) {
  214. debug_push($this->_debug_prefix . "get_datamanager_for_registrar");
  215. /* Requires an record retrieved by get_registrars or directly a person id */
  216. if (! ( ( is_array($registrar_record)
  217. && array_key_exists("_person_id", $registrar_record)
  218. )
  219. || is_numeric($registrar_record)
  220. )
  221. )
  222. {
  223. debug_print_r("Wrong argument, either no number or no array or the person id is missing:", $registrar_record);
  224. debug_pop();
  225. return null;
  226. }
  227. if (is_numeric($registrar_record)) {
  228. $person = mgd_get_person($registrar_record);
  229. } else {
  230. $person = $registrar_record['_person'];
  231. }
  232. if (! $person) {
  233. debug_add("Could not load person record: " . mgd_errstr());
  234. debug_pop();
  235. return null;
  236. }
  237. $datamanager = new midcom_helper_datamanager($this->_config->get("schemadb"));
  238. if (!$datamanager) {
  239. debug_add("Datamanager could not be created, aborting. Error was: " . $GLOBALS['midcom_errstr']);
  240. debug_pop();
  241. return null;
  242. }
  243.  
  244. if (! $datamanager->init($person)) {
  245. debug_add("Warning, datamanager could not be initialized, aborting. Error was: " . $GLOBALS['midcom_errstr']);
  246. debug_pop();
  247. return null;
  248. }
  249. debug_pop();
  250. return $datamanager;
  251. }
  252. function _su ($on = true) {
  253. if ($on) {
  254. if (! mgd_auth_midgard ($this->_config->get("admin_user"), $this->_config->get("admin_password"), false)) {
  255. $this->errstr("mgd_auth_midgard to admin level user failed.");
  256. return false;
  257. } else {
  258. /* Call mgd_get_midgard, seems to be required according to emile/piotras */
  259. $midgard = mgd_get_midgard();
  260. debug_print_r("New midgard object is: ", $midgard);
  261. return true;
  262. }
  263. } else {
  264. $result = mgd_unsetuid();
  265. /* Call mgd_get_midgard, seems to be required according to emile/piotras */
  266. $unused = mgd_get_midgard();
  267. return $result;
  268. }
  269. }
  270. function refresh () {
  271. // Skip error-checking, we just did this a copule of milliseconds ago in the constructor
  272. $this->event = mgd_get_event($this->event->id);
  273. $this->dm->init($this->event);
  274. }
  275. function approve_registration($registrar_record) {
  276. debug_push($this->_debug_prefix . "approve_registration");
  277. /* Requires an record retrieved by get_registrars or directly an eventmember id */
  278. if (! ( ( is_array($registrar_record)
  279. && array_key_exists("_eventmember_id", $registrar_record)
  280. )
  281. || is_numeric($registrar_record)
  282. )
  283. )
  284. {
  285. debug_print_r("Wrong argument, either no number or no array or the event member id is missing:", $registrar_record);
  286. debug_pop();
  287. return false;
  288. }
  289. if (is_numeric($registrar_record)) {
  290. $emember = mgd_get_event_member($registrar_record);
  291. } else {
  292. $emember = mgd_get_event_member($registrar_record['_eventmember_id']);
  293. }
  294. if (! $emember) {
  295. debug_add("Could not load eventmember record: " . mgd_errstr());
  296. debug_pop();
  297. return false;
  298. }
  299. $midgard = mgd_get_midgard();
  300. // Set the approval parameters
  301. $emember->parameter("net.nemein.registrations","approved", time());
  302. $emember->parameter("net.nemein.registrations","approver", $midgard->user);
  303. // Send out the E-Mails
  304. /* Send E-Mails */
  305. $subject = $this->_config->get("mail_registration_subject");
  306. $sender = $this->_config->get("mail_registration_sender");
  307. $cc = explode(",", $this->get_notification_email());
  308. $body = midcom_get_snippet_content($this->_config->get("mail_registration_body"));
  309. $registrar_dm = $this->get_datamanager_for_registrar($emember->uid);
  310. $registrar_object = mgd_get_person($emember->uid);
  311. $registrar = $registrar_dm->get_array();
  312. $registration_dm = $this->get_datamanager_for_registration($emember->id);
  313. $registration = $registration_dm->get_array();
  314. $regevent = $this->event;
  315. //syntax: _REGISTRAR_arraykey_ bzw. REGISTRATION
  316. $search = Array (
  317. '/__REGEVENT_([^ \.>"-]*?)__/e',
  318. '/__REGISTRAR__/', /* Order important here ! */
  319. '/__REGISTRAR_([^"]*?)__/e',
  320. '/__REGISTRATION__/', /* Order important here ! */
  321. '/__REGISTRATION_([^_"]*?)__/e',
  322. '/__URL__/',
  323. );
  324. $registrar_all = $this->_dm_array_to_string($registrar_dm);
  325. $registration_all = $this->_dm_array_to_string($registration_dm);
  326. $replace = Array (
  327. '$regevent->\1',
  328. $registrar_all,
  329. '$registrar["\1"]',
  330. $registration_all,
  331. '$registration["\1"]',
  332. (array_key_exists("SSL_PROTOCOL", $_SERVER) ? "https" : "http")
  333. . "://"
  334. . $_SERVER["HTTP_HOST"]
  335. . $GLOBALS["midcom"]->get_context_data(MIDCOM_CONTEXT_ANCHORPREFIX),
  336. );
  337. $subject = $this->_encode_subject(preg_replace($search, $replace, $subject));
  338. $body = preg_replace($search, $replace, $body);
  339. $headers = "From: $sender\r\nReply-To: $sender\r\nX-Mailer: PHP/" . phpversion();
  340. $cc[] = $registrar_object->email;
  341. debug_print_r("All recipients: ", $cc);
  342. foreach ($cc as $email) {
  343. $email = trim ($email);
  344. if ($email == "") {
  345. debug_add("Skipping an empty cc line, perhaps a comma too much");
  346. continue;
  347. }
  348. if (! mail ($email, $subject, $body, $headers)) {
  349. debug_add("Could not send E-Mail to '" . $email . "' with subject '$subject'.", MIDCOM_LOG_ERROR);
  350. debug_print_r("Extra Headers:", $headers);
  351. debug_print_r("Body:", $body);
  352. } else {
  353. debug_add("Sent E-Mail to '" . $email . "' with subject '$subject'.", MIDCOM_LOG_ERROR);
  354. debug_print_r("Extra Headers:", $headers);
  355. debug_print_r("Body:", $body);
  356. }
  357. }
  358. /* Set OpenPSA Parameters */
  359. $registrar_object->parameter("campaign", $this->event->guid(), "on");
  360. debug_pop();
  361. return true;
  362. }
  363. function _dm_array_to_string($dm) {
  364. // TODO: This is a littlebit a hack, as it is currently difficult to
  365. // get a plaint-text representation of a given datatype explicitly,
  366. // so this interface is used for a start (avoids arrays). Same is
  367. // true for the datamanager-completed field-definitions.
  368. //
  369. // We don't use the official get_csv_line interface btw., as this would
  370. // require us to un-csv-quote that string.
  371. $result = "";
  372. foreach ($dm->_fields as $name => $desc) {
  373. debug_print_r("Processing field $name: ", $desc);
  374. /* Skip fields with aisonly and hidden flags */
  375. if ($desc["hidden"] == true || $desc["aisonly"] == true)
  376. continue;
  377. $result .= $desc["description"] . ":\n";
  378. $data = $dm->_datatypes[$name]->get_csv_data();
  379. $result .= " " . wordwrap ($data, 70, "\n ");
  380. $result .= "\n\n";
  381. }
  382. return trim($result);
  383. }
  384. function reject_registration($registrar_record) {
  385. debug_push($this->_debug_prefix . "reject_registration");
  386. /* Requires an record retrieved by get_registrars or directly an eventmember id */
  387. if (! ( ( is_array($registrar_record)
  388. && array_key_exists("_eventmember_id", $registrar_record)
  389. )
  390. || is_numeric($registrar_record)
  391. )
  392. )
  393. {
  394. debug_print_r("Wrong argument, either no number or no array or the event member id is missing:", $registrar_record);
  395. debug_pop();
  396. return false;
  397. }
  398. if (is_numeric($registrar_record)) {
  399. $emember = mgd_get_event_member($registrar_record);
  400. } else {
  401. $emember = mgd_get_event_member($registrar_record['_eventmember_id']);
  402. }
  403. if (! $emember) {
  404. debug_add("Could not load eventmember record: " . mgd_errstr());
  405. debug_pop();
  406. return false;
  407. }
  408. // Drop all dependants
  409. if (! mgd_delete_extensions($emember)) {
  410. debug_add("Unable to delete all extensions of the event member, last Midgard error was: " . mgd_errstr());
  411. debug_pop();
  412. return false;
  413. }
  414. // Drop the EventMember
  415. if (! $emember->delete()) {
  416. debug_add("Unable to delete the event member, last Midgard error was: " . mgd_errstr());
  417. debug_pop();
  418. return false;
  419. }
  420. debug_pop();
  421. return true;
  422. }
  423. function rejectdelete_registration($registrar_record) {
  424. debug_push($this->_debug_prefix . "rejectdelete_registration");
  425. /* Requires an record retrieved by get_registrars or directly an eventmember id */
  426. if (! ( ( is_array($registrar_record)
  427. && array_key_exists("_eventmember_id", $registrar_record)
  428. )
  429. || is_numeric($registrar_record)
  430. )
  431. )
  432. {
  433. debug_print_r("Wrong argument, either no number or no array or the event member id is missing:", $registrar_record);
  434. debug_pop();
  435. return false;
  436. }
  437. if (is_numeric($registrar_record)) {
  438. $emember = mgd_get_event_member($registrar_record);
  439. } else {
  440. $emember = mgd_get_event_member($registrar_record['_eventmember_id']);
  441. }
  442. if (! $emember) {
  443. debug_add("Could not load eventmember record: " . mgd_errstr());
  444. debug_pop();
  445. return false;
  446. }
  447. $person = mgd_get_person($emember->uid);
  448. if (! $person) {
  449. debug_add("Data inconsistency: Person record $emember->uid was not found, last Midgard error was: " . mgd_errstr());
  450. debug_pop();
  451. return false;
  452. }
  453. // Drop all dependants of the EventMember
  454. if (! mgd_delete_extensions($emember)) {
  455. debug_add("Unable to delete all extensions of the event member, last Midgard error was: " . mgd_errstr());
  456. debug_pop();
  457. return false;
  458. }
  459. // Drop the EventMember
  460. if (! $emember->delete()) {
  461. debug_add("Unable to delete the event member, last Midgard error was: " . mgd_errstr());
  462. debug_pop();
  463. return false;
  464. }
  465. $this->_su();
  466. // Drop all Group assignements of the Person, note, that this requires superuser privileges
  467. $memberships = mgd_list_memberships($person->id);
  468. if ($memberships)
  469. while ($memberships->fetch()) {
  470. $tmp = mgd_get_member($memberships->id);
  471. if (! $tmp->delete()) {
  472. debug_add("Unable to delete the group membership $tmp->id, last Midgard error was: " . mgd_errstr());
  473. debug_pop();
  474. $this->_su(false);
  475. return false;
  476. }
  477. }
  478. // Drop all dependants of the Person, note, that this requires superuser privileges
  479. if (! mgd_delete_extensions($person)) {
  480. debug_add("Unable to delete all extensions of the person, last Midgard error was: " . mgd_errstr());
  481. debug_pop();
  482. $this->_su(false);
  483. return false;
  484. }
  485. // Drop the Person, note, that this requires superuser privileges
  486. if (! $person->delete()) {
  487. debug_add("Unable to delete the person, last Midgard error was: " . mgd_errstr());
  488. debug_pop();
  489. $this->_su(false);
  490. return false;
  491. }
  492. $this->_su(false);
  493. debug_pop();
  494. return true;
  495. }
  496. function _encode_subject ($subject) {
  497. //TODO: change to allow any character set
  498. preg_match_all("/[^\x20-\x7e]/", $subject, $matches);
  499. if (count ($matches[0])>0) {
  500. $newSubj=$subject;
  501. while (list ($k, $char) = each ($matches[0])) {
  502. $code="=".dechex(ord($char));
  503. $newSubj=str_replace($char, $code, $newSubj);
  504. }
  505. return "=?ISO-8859-1?Q?".$newSubj."?=";
  506. } else {
  507. return $subject;
  508. }
  509. }
  510. }
  511. ?>

Documentation generated on Mon, 21 Nov 2005 18:21:09 +0100 by phpDocumentor 1.3.0RC3