Documentation is available at regevent.php
- <?php
- /* Global Array for the currently active choices for additional questions */
- $GLOBALS["net_nemein_registrations__aq_choices"] = Array ("undef" => "AQ-Array uninitialized");
- function net_nemein_registration_get_aq_choices() {
- return $GLOBALS["net_nemein_registrations__aq_choices"];
- }
- class net_nemein_registrations_regevent {
- var $_debug_prefix;
- var $_config;
- var $_topic;
- var $_auth;
- var $_root_event;
- var $_l10n;
- var $_l10n_midcom;
- var $event;
- var $dm;
- function net_nemein_registrations_regevent($event, $topic, $config, $auth, $root_event) {
- $this->_debug_prefix = "net.nemein.registrations regevent::";
- debug_push($this->_debug_prefix . "constructor");
- $this->_config = $config;
- $this->_topic = $topic;
- $this->_root_event = $root_event;
- $this->_auth = $auth;
- $i18n =& $GLOBALS["midcom"]->get_service("i18n");
- $this->_l10n = $i18n->get_l10n("net.nemein.registrations");
- $this->_l10n_midcom = $i18n->get_l10n("midcom");
- $this->dm = new midcom_helper_datamanager($this->_config->get("schemadb"));
- /* Populate the global array with all schemas available for additional questions
- * that is used by the default dm schema. Skips all schemas already in use.
- */
- debug_print_r("GLOBAL AQ CHOICES before: ", $GLOBALS["net_nemein_registrations__aq_choices"]);
- $GLOBALS["net_nemein_registrations__aq_choices"] = Array("" => $this->_l10n->get("Not configured, please select one.") );
- $db = $this->dm->get_layout_database();
- foreach ($db as $name => $schema) {
- /* Skip schemas already used elsewhere */
- if ( $name == $this->_config->get("registrar_schema")
- || $name == $this->_config->get("event_schema")
- )
- continue;
- $GLOBALS["net_nemein_registrations__aq_choices"][$name] = $schema["description"];
- }
- debug_print_r("GLOBAL AQ CHOICES after: ", $GLOBALS["net_nemein_registrations__aq_choices"]);
- /* Reread the datamanager schema after the global varibale
- * has been set correctly by rebuilding the object.
- * NOTE: This is a hack as the widget_select does only read
- * the available choices once on startup.
- */
- $this->dm = new midcom_helper_datamanager($this->_config->get("schemadb"));
- if (is_numeric($event)) {
- debug_add("\$event is an integer, trying to load event from Midgard Database.");
- $this->event = mgd_get_event ($event);
- } else {
- $this->event = $event;
- }
- if ($this->event === false) {
- debug_add("Event could not be loaded, last midgard error was: " . mgd_errstr());
- debug_pop();
- $this = false;
- return false;
- }
- if ($this->event->parameter("midcom.helper.datamanager", "layout") != $this->_config->get("event_schema")) {
- /* It seems, that this event does not match the schema that was configured,
- * we correct this implicitly or everything else will break.
- */
- debug_print_r("The schema for the following event was set incorrectly, setting it to the schema "
- . $this->_config->get("event_schema"), $this->event);
- $this->_su();
- $this->event->parameter("midcom.helper.datamanager", "layout", $this->_config->get("event_schema"));
- $this->_su(false);
- }
- if (!$this->dm->init($this->event)) {
- debug_add("Could not initialize datamanager, see above for errors.");
- debug_pop();
- $this = false;
- return false;
- }
- debug_pop();
- }
- function get_notification_email () {
- $local = $this->dm->data["notification_email"];
- if ($local == "")
- return $this->_config->get("mail_registration_ccs");
- else
- return $local;
- }
- function get_additional_questions_schema () {
- return $this->dm->data["additional_questions"];
- }
- function is_open () {
- $now = time();
- $open = $this->dm->data["open_registration"]["timestamp"];
- $close = $this->dm->data["close_registration"]["timestamp"];
- if ($open == 0 && $close == 0)
- return false;
- if ($open <= $now && ( $close >= $now || $close == 0))
- return true;
- else
- return false;
- }
- function get_registrars () {
- debug_push ($this->_debug_prefix . "get_registrars");
- $result = Array();
- /* First, we query all event members, then we load the person records in question. */
- $emembers = mgd_list_event_members($this->event->id);
- if (!$emembers) {
- if (mgd_errstr() == "MGD_ERR_OK") {
- return Array();
- } else {
- debug_add("Failed querying event members: " . mgd_errstr());
- debug_pop();
- return false;
- }
- }
- $persons = Array();
- while($emembers->fetch()) {
- $persons[] = $emembers->uid;
- $eidmap[$emembers->uid] = $emembers->id;
- }
- /* Now, lets sort these persons after their name. */
- mgd_sort_id_array($persons, "rname", "MidgardPerson", SORT_STRING);
- /* Translate the IDs into Person Records */
- $datamanager = new midcom_helper_datamanager($this->_config->get("schemadb"));
- if (!$datamanager) {
- debug_add("Datamanager could not be created, aborting. Error was: " . $GLOBALS['midcom_errstr']);
- debug_pop();
- return false;
- }
- foreach ($persons as $id) {
- $person = mgd_get_person ($id);
- if (!$person) {
- debug_add("Data inconsistency, Event Member Person ID $id could not be loaded: " . mgd_errstr());
- debug_pop();
- return false;
- }
- $eventmember = mgd_get_event_member($eidmap[$id]);
- if (! $eventmember) {
- debug_add("Data inconsistency, Event Member " . $eidmpa[$id] . " could not be löoaded: " . mgd_errstr());
- debug_pop();
- return false;
- }
- if ($datamanager->init($person)) {
- $approved = $eventmember->parameter("net.nemein.registrations","approved");
- $approver = $eventmember->parameter("net.nemein.registrations","approver");
- $result[$id] = $datamanager->get_array();
- $result[$id]["_eventmember_id"] = $eidmap[$id];
- $result[$id]["_person_id"] = $id;
- $result[$id]["_person"] = $person;
- if ($approved !== false && $approved > 0) {
- $approver_person = mgd_get_person($approver);
- if (! $approver_person) {
- debug_add("Data inconsistency, could not load approver person record for person ID $approver while processing eventmember "
- . $eidmap[$id] . ": " . mgd_errstr());
- debug_pop();
- return false;
- }
- $result[$id]["_approved"] = $approved;
- $result[$id]["_approver"] = $approver_person;
- } else {
- $result[$id]["_approved"] = false;
- $result[$id]["_approver"] = null;
- }
- } else {
- debug_add("Warning, datamanager could not be initialized, skipping object. Error was: " . $GLOBALS['midcom_errstr']);
- }
- }
- debug_pop();
- return $result;
- }
- function get_datamanager_for_registration ($registrar_record) {
- debug_push($this->_debug_prefix . "get_datamanager_for_registration");
- /* Requires an record retrieved by get_registrars or directly an eventmember id */
- if (! ( ( is_array($registrar_record)
- && array_key_exists("_eventmember_id", $registrar_record)
- )
- || is_numeric($registrar_record)
- )
- )
- {
- debug_print_r("Wrong argument, either no number or no array or the event member id is missing:", $registrar_record);
- debug_pop();
- return null;
- }
- if (is_numeric($registrar_record)) {
- $emember = mgd_get_event_member($registrar_record);
- } else {
- $emember = mgd_get_event_member($registrar_record['_eventmember_id']);
- }
- if (! $emember) {
- debug_add("Could not load eventmember record: " . mgd_errstr());
- debug_pop();
- return null;
- }
- $datamanager = new midcom_helper_datamanager($this->_config->get("schemadb"));
- if (!$datamanager) {
- debug_add("Datamanager could not be created, aborting. Error was: " . $GLOBALS['midcom_errstr']);
- debug_pop();
- return null;
- }
- if (! $datamanager->init($emember)) {
- debug_add("Warning, datamanager could not be initialized, aborting. Error was: " . $GLOBALS['midcom_errstr']);
- debug_pop();
- return null;
- }
- debug_pop();
- return $datamanager;
- }
- function get_datamanager_for_registrar ($registrar_record) {
- debug_push($this->_debug_prefix . "get_datamanager_for_registrar");
- /* Requires an record retrieved by get_registrars or directly a person id */
- if (! ( ( is_array($registrar_record)
- && array_key_exists("_person_id", $registrar_record)
- )
- || is_numeric($registrar_record)
- )
- )
- {
- debug_print_r("Wrong argument, either no number or no array or the person id is missing:", $registrar_record);
- debug_pop();
- return null;
- }
- if (is_numeric($registrar_record)) {
- $person = mgd_get_person($registrar_record);
- } else {
- $person = $registrar_record['_person'];
- }
- if (! $person) {
- debug_add("Could not load person record: " . mgd_errstr());
- debug_pop();
- return null;
- }
- $datamanager = new midcom_helper_datamanager($this->_config->get("schemadb"));
- if (!$datamanager) {
- debug_add("Datamanager could not be created, aborting. Error was: " . $GLOBALS['midcom_errstr']);
- debug_pop();
- return null;
- }
- if (! $datamanager->init($person)) {
- debug_add("Warning, datamanager could not be initialized, aborting. Error was: " . $GLOBALS['midcom_errstr']);
- debug_pop();
- return null;
- }
- debug_pop();
- return $datamanager;
- }
- function _su ($on = true) {
- if ($on) {
- if (! mgd_auth_midgard ($this->_config->get("admin_user"), $this->_config->get("admin_password"), false)) {
- $this->errstr("mgd_auth_midgard to admin level user failed.");
- return false;
- } else {
- /* Call mgd_get_midgard, seems to be required according to emile/piotras */
- $midgard = mgd_get_midgard();
- debug_print_r("New midgard object is: ", $midgard);
- return true;
- }
- } else {
- $result = mgd_unsetuid();
- /* Call mgd_get_midgard, seems to be required according to emile/piotras */
- $unused = mgd_get_midgard();
- return $result;
- }
- }
- function refresh () {
- // Skip error-checking, we just did this a copule of milliseconds ago in the constructor
- $this->event = mgd_get_event($this->event->id);
- $this->dm->init($this->event);
- }
- function approve_registration($registrar_record) {
- debug_push($this->_debug_prefix . "approve_registration");
- /* Requires an record retrieved by get_registrars or directly an eventmember id */
- if (! ( ( is_array($registrar_record)
- && array_key_exists("_eventmember_id", $registrar_record)
- )
- || is_numeric($registrar_record)
- )
- )
- {
- debug_print_r("Wrong argument, either no number or no array or the event member id is missing:", $registrar_record);
- debug_pop();
- return false;
- }
- if (is_numeric($registrar_record)) {
- $emember = mgd_get_event_member($registrar_record);
- } else {
- $emember = mgd_get_event_member($registrar_record['_eventmember_id']);
- }
- if (! $emember) {
- debug_add("Could not load eventmember record: " . mgd_errstr());
- debug_pop();
- return false;
- }
- $midgard = mgd_get_midgard();
- // Set the approval parameters
- $emember->parameter("net.nemein.registrations","approved", time());
- $emember->parameter("net.nemein.registrations","approver", $midgard->user);
- // Send out the E-Mails
- /* Send E-Mails */
- $subject = $this->_config->get("mail_registration_subject");
- $sender = $this->_config->get("mail_registration_sender");
- $cc = explode(",", $this->get_notification_email());
- $body = midcom_get_snippet_content($this->_config->get("mail_registration_body"));
- $registrar_dm = $this->get_datamanager_for_registrar($emember->uid);
- $registrar_object = mgd_get_person($emember->uid);
- $registrar = $registrar_dm->get_array();
- $registration_dm = $this->get_datamanager_for_registration($emember->id);
- $registration = $registration_dm->get_array();
- $regevent = $this->event;
- //syntax: _REGISTRAR_arraykey_ bzw. REGISTRATION
- $search = Array (
- '/__REGEVENT_([^ \.>"-]*?)__/e',
- '/__REGISTRAR__/', /* Order important here ! */
- '/__REGISTRAR_([^"]*?)__/e',
- '/__REGISTRATION__/', /* Order important here ! */
- '/__REGISTRATION_([^_"]*?)__/e',
- '/__URL__/',
- );
- $registrar_all = $this->_dm_array_to_string($registrar_dm);
- $registration_all = $this->_dm_array_to_string($registration_dm);
- $replace = Array (
- '$regevent->\1',
- $registrar_all,
- '$registrar["\1"]',
- $registration_all,
- '$registration["\1"]',
- (array_key_exists("SSL_PROTOCOL", $_SERVER) ? "https" : "http")
- . "://"
- . $_SERVER["HTTP_HOST"]
- . $GLOBALS["midcom"]->get_context_data(MIDCOM_CONTEXT_ANCHORPREFIX),
- );
- $subject = $this->_encode_subject(preg_replace($search, $replace, $subject));
- $body = preg_replace($search, $replace, $body);
- $headers = "From: $sender\r\nReply-To: $sender\r\nX-Mailer: PHP/" . phpversion();
- $cc[] = $registrar_object->email;
- debug_print_r("All recipients: ", $cc);
- foreach ($cc as $email) {
- $email = trim ($email);
- if ($email == "") {
- debug_add("Skipping an empty cc line, perhaps a comma too much");
- continue;
- }
- if (! mail ($email, $subject, $body, $headers)) {
- debug_add("Could not send E-Mail to '" . $email . "' with subject '$subject'.", MIDCOM_LOG_ERROR);
- debug_print_r("Extra Headers:", $headers);
- debug_print_r("Body:", $body);
- } else {
- debug_add("Sent E-Mail to '" . $email . "' with subject '$subject'.", MIDCOM_LOG_ERROR);
- debug_print_r("Extra Headers:", $headers);
- debug_print_r("Body:", $body);
- }
- }
- /* Set OpenPSA Parameters */
- $registrar_object->parameter("campaign", $this->event->guid(), "on");
- debug_pop();
- return true;
- }
- function _dm_array_to_string($dm) {
- // TODO: This is a littlebit a hack, as it is currently difficult to
- // get a plaint-text representation of a given datatype explicitly,
- // so this interface is used for a start (avoids arrays). Same is
- // true for the datamanager-completed field-definitions.
- //
- // We don't use the official get_csv_line interface btw., as this would
- // require us to un-csv-quote that string.
- $result = "";
- foreach ($dm->_fields as $name => $desc) {
- debug_print_r("Processing field $name: ", $desc);
- /* Skip fields with aisonly and hidden flags */
- if ($desc["hidden"] == true || $desc["aisonly"] == true)
- continue;
- $result .= $desc["description"] . ":\n";
- $data = $dm->_datatypes[$name]->get_csv_data();
- $result .= " " . wordwrap ($data, 70, "\n ");
- $result .= "\n\n";
- }
- return trim($result);
- }
- function reject_registration($registrar_record) {
- debug_push($this->_debug_prefix . "reject_registration");
- /* Requires an record retrieved by get_registrars or directly an eventmember id */
- if (! ( ( is_array($registrar_record)
- && array_key_exists("_eventmember_id", $registrar_record)
- )
- || is_numeric($registrar_record)
- )
- )
- {
- debug_print_r("Wrong argument, either no number or no array or the event member id is missing:", $registrar_record);
- debug_pop();
- return false;
- }
- if (is_numeric($registrar_record)) {
- $emember = mgd_get_event_member($registrar_record);
- } else {
- $emember = mgd_get_event_member($registrar_record['_eventmember_id']);
- }
- if (! $emember) {
- debug_add("Could not load eventmember record: " . mgd_errstr());
- debug_pop();
- return false;
- }
- // Drop all dependants
- if (! mgd_delete_extensions($emember)) {
- debug_add("Unable to delete all extensions of the event member, last Midgard error was: " . mgd_errstr());
- debug_pop();
- return false;
- }
- // Drop the EventMember
- if (! $emember->delete()) {
- debug_add("Unable to delete the event member, last Midgard error was: " . mgd_errstr());
- debug_pop();
- return false;
- }
- debug_pop();
- return true;
- }
- function rejectdelete_registration($registrar_record) {
- debug_push($this->_debug_prefix . "rejectdelete_registration");
- /* Requires an record retrieved by get_registrars or directly an eventmember id */
- if (! ( ( is_array($registrar_record)
- && array_key_exists("_eventmember_id", $registrar_record)
- )
- || is_numeric($registrar_record)
- )
- )
- {
- debug_print_r("Wrong argument, either no number or no array or the event member id is missing:", $registrar_record);
- debug_pop();
- return false;
- }
- if (is_numeric($registrar_record)) {
- $emember = mgd_get_event_member($registrar_record);
- } else {
- $emember = mgd_get_event_member($registrar_record['_eventmember_id']);
- }
- if (! $emember) {
- debug_add("Could not load eventmember record: " . mgd_errstr());
- debug_pop();
- return false;
- }
- $person = mgd_get_person($emember->uid);
- if (! $person) {
- debug_add("Data inconsistency: Person record $emember->uid was not found, last Midgard error was: " . mgd_errstr());
- debug_pop();
- return false;
- }
- // Drop all dependants of the EventMember
- if (! mgd_delete_extensions($emember)) {
- debug_add("Unable to delete all extensions of the event member, last Midgard error was: " . mgd_errstr());
- debug_pop();
- return false;
- }
- // Drop the EventMember
- if (! $emember->delete()) {
- debug_add("Unable to delete the event member, last Midgard error was: " . mgd_errstr());
- debug_pop();
- return false;
- }
- $this->_su();
- // Drop all Group assignements of the Person, note, that this requires superuser privileges
- $memberships = mgd_list_memberships($person->id);
- if ($memberships)
- while ($memberships->fetch()) {
- $tmp = mgd_get_member($memberships->id);
- if (! $tmp->delete()) {
- debug_add("Unable to delete the group membership $tmp->id, last Midgard error was: " . mgd_errstr());
- debug_pop();
- $this->_su(false);
- return false;
- }
- }
- // Drop all dependants of the Person, note, that this requires superuser privileges
- if (! mgd_delete_extensions($person)) {
- debug_add("Unable to delete all extensions of the person, last Midgard error was: " . mgd_errstr());
- debug_pop();
- $this->_su(false);
- return false;
- }
- // Drop the Person, note, that this requires superuser privileges
- if (! $person->delete()) {
- debug_add("Unable to delete the person, last Midgard error was: " . mgd_errstr());
- debug_pop();
- $this->_su(false);
- return false;
- }
- $this->_su(false);
- debug_pop();
- return true;
- }
- function _encode_subject ($subject) {
- //TODO: change to allow any character set
- preg_match_all("/[^\x20-\x7e]/", $subject, $matches);
- if (count ($matches[0])>0) {
- $newSubj=$subject;
- while (list ($k, $char) = each ($matches[0])) {
- $code="=".dechex(ord($char));
- $newSubj=str_replace($char, $code, $newSubj);
- }
- return "=?ISO-8859-1?Q?".$newSubj."?=";
- } else {
- return $subject;
- }
- }
- }
- ?>
Documentation generated on Mon, 21 Nov 2005 18:21:09 +0100 by phpDocumentor 1.3.0RC3