/** * Init acceptance * @return */ protected function initSettings() { if (self::$accepted_ids !== NULL) { return true; } self::$export_allowed = ilPrivacySettings::_getInstance()->checkExportAccess($this->getParentObject()->object->getRefId()); self::$confirmation_required = ilPrivacySettings::_getInstance()->groupConfirmationRequired(); include_once 'Services/Membership/classes/class.ilMemberAgreement.php'; self::$accepted_ids = ilMemberAgreement::lookupAcceptedAgreements($this->getParentObject()->object->getId()); include_once 'Modules/Course/classes/Export/class.ilCourseDefinedFieldDefinition.php'; self::$has_odf_definitions = ilCourseDefinedFieldDefinition::_hasFields($this->getParentObject()->object->getId()); }
/** * Get all user-based tracking data for object * * @param int $a_ref_id * @param string $a_order_field * @param string $a_order_dir * @param int $a_offset * @param int $a_limit * @param array $a_filters * @param array $a_additional_fields * @param int $check_agreement (obj id of parent course) * @param arry $privacy_fields * @return array cnt, set */ static function getUserDataForObject($a_ref_id, $a_order_field = "", $a_order_dir = "", $a_offset = 0, $a_limit = 9999, array $a_filters = NULL, array $a_additional_fields = NULL, $check_agreement = false, $privacy_fields = NULL) { global $ilDB; $fields = array("usr_data.usr_id", "login", "active"); $udf = self::buildColumns($fields, $a_additional_fields); $where = array(); $where[] = "usr_data.usr_id <> " . $ilDB->quote(ANONYMOUS_USER_ID, "integer"); // users $left = ""; $a_users = self::getParticipantsForObject($a_ref_id); $obj_id = ilObject::_lookupObjectId($a_ref_id); self::refreshObjectsStatus(array($obj_id), $a_users); if (is_array($a_users)) { $left = "LEFT"; $where[] = $ilDB->in("usr_data.usr_id", $a_users, false, "integer"); } $query = " FROM usr_data " . $left . " JOIN read_event ON (read_event.usr_id = usr_data.usr_id" . " AND read_event.obj_id = " . $ilDB->quote($obj_id, "integer") . ")" . " LEFT JOIN ut_lp_marks ON (ut_lp_marks.usr_id = usr_data.usr_id " . " AND ut_lp_marks.obj_id = " . $ilDB->quote($obj_id, "integer") . ")" . " LEFT JOIN usr_pref ON (usr_pref.usr_id = usr_data.usr_id AND keyword = " . $ilDB->quote("language", "text") . ")" . self::buildFilters($where, $a_filters); $queries = array(array("fields" => $fields, "query" => $query)); // #9598 - if language is not in fields alias is missing if ($a_order_field == "language") { $a_order_field = "usr_pref.value"; } // udf data is added later on, not in this query $udf_order = null; if (!$a_order_field) { $a_order_field = "login"; } else { if (substr($a_order_field, 0, 4) == "udf_") { $udf_order = $a_order_field; $a_order_field = null; } } $result = self::executeQueries($queries, $a_order_field, $a_order_dir, $a_offset, $a_limit); if ($result["cnt"]) { if (sizeof($udf)) { $query = "SELECT usr_id, field_id, value FROM udf_text WHERE " . $ilDB->in("field_id", $udf, false, "integer"); $set = $ilDB->query($query); $udf = array(); while ($row = $ilDB->fetchAssoc($set)) { $udf[$row["usr_id"]]["udf_" . $row["field_id"]] = $row["value"]; } } // (course) user agreement if ($check_agreement) { // admins/tutors (write-access) will never have agreement ?! include_once "Services/Membership/classes/class.ilMemberAgreement.php"; $agreements = ilMemberAgreement::lookupAcceptedAgreements($check_agreement); // public information for users $query = "SELECT usr_id FROM usr_pref WHERE keyword = " . $ilDB->quote("public_profile", "text") . " AND value = " . $ilDB->quote("y", "text") . " OR value = " . $ilDB->quote("g", "text"); $set = $ilDB->query($query); $all_public = array(); while ($row = $ilDB->fetchAssoc($set)) { $all_public[] = $row["usr_id"]; } $query = "SELECT usr_id,keyword FROM usr_pref WHERE " . $ilDB->like("keyword", "text", "public_%", false) . " AND value = " . $ilDB->quote("y", "text") . " AND " . $ilDB->in("usr_id", $all_public, "", "integer"); $set = $ilDB->query($query); $public = array(); while ($row = $ilDB->fetchAssoc($set)) { $public[$row["usr_id"]][] = substr($row["keyword"], 7); } unset($all_public); } foreach ($result["set"] as $idx => $row) { // add udf data if (isset($udf[$row["usr_id"]])) { $result["set"][$idx] = $row = array_merge($row, $udf[$row["usr_id"]]); } // remove all private data - if active agreement and agreement not given by user if (sizeof($privacy_fields) && $check_agreement && !in_array($row["usr_id"], $agreements)) { foreach ($privacy_fields as $field) { // check against public profile if (isset($row[$field]) && (!isset($public[$row["usr_id"]]) || !in_array($field, $public[$row["usr_id"]]))) { // remove complete entry - offending field was filtered if (isset($a_filters[$field])) { unset($result["set"][$idx]); break; } else { $result["set"][$idx][$field] = false; } } } } } // as we cannot do this in the query, sort by custom field here if ($udf_order) { include_once "Services/Utilities/classes/class.ilStr.php"; $result["set"] = ilUtil::stableSortArray($result["set"], $udf_order, $a_order_dir); } } return $result; }
/** * Init acceptance * @return */ public function initAcceptedAgreements() { if (self::$accepted_ids !== NULL) { return true; } self::$export_allowed = ilPrivacySettings::_getInstance()->checkExportAccess($this->getParentObject()->object->getRefId()); self::$confirmation_required = ilPrivacySettings::_getInstance()->courseConfirmationRequired(); include_once 'Services/Membership/classes/class.ilMemberAgreement.php'; self::$accepted_ids = ilMemberAgreement::lookupAcceptedAgreements($this->getParentObject()->object->getId()); }
/** * Handle privacy and add udf data to (user) result data * * @param array $a_result * @param array $a_udf * @param int $a_check_agreement * @param array $a_privacy_fields * @param array $a_filters */ protected static function getUDFAndHandlePrivacy(array &$a_result, array $a_udf = null, $a_check_agreement = null, array $a_privacy_fields = null, array $a_filters = null) { global $ilDB; if (!$a_result["cnt"]) { return; } if (sizeof($a_udf)) { $query = "SELECT usr_id, field_id, value FROM udf_text WHERE " . $ilDB->in("field_id", $a_udf, false, "integer"); $set = $ilDB->query($query); $udf = array(); while ($row = $ilDB->fetchAssoc($set)) { $udf[$row["usr_id"]]["udf_" . $row["field_id"]] = $row["value"]; } } // (course/group) user agreement if ($a_check_agreement) { // admins/tutors (write-access) will never have agreement ?! include_once "Services/Membership/classes/class.ilMemberAgreement.php"; $agreements = ilMemberAgreement::lookupAcceptedAgreements($a_check_agreement); // public information for users $query = "SELECT usr_id FROM usr_pref WHERE keyword = " . $ilDB->quote("public_profile", "text") . " AND value = " . $ilDB->quote("y", "text") . " OR value = " . $ilDB->quote("g", "text"); $set = $ilDB->query($query); $all_public = array(); while ($row = $ilDB->fetchAssoc($set)) { $all_public[] = $row["usr_id"]; } $query = "SELECT usr_id,keyword FROM usr_pref WHERE " . $ilDB->like("keyword", "text", "public_%", false) . " AND value = " . $ilDB->quote("y", "text") . " AND " . $ilDB->in("usr_id", $all_public, "", "integer"); $set = $ilDB->query($query); $public = array(); while ($row = $ilDB->fetchAssoc($set)) { $public[$row["usr_id"]][] = substr($row["keyword"], 7); } unset($all_public); } foreach ($a_result["set"] as $idx => $row) { // add udf data if (isset($udf[$row["usr_id"]])) { $a_result["set"][$idx] = $row = array_merge($row, $udf[$row["usr_id"]]); } // remove all private data - if active agreement and agreement not given by user if (sizeof($a_privacy_fields) && $a_check_agreement && !in_array($row["usr_id"], $agreements)) { foreach ($a_privacy_fields as $field) { // check against public profile if (isset($row[$field]) && (!isset($public[$row["usr_id"]]) || !in_array($field, $public[$row["usr_id"]]))) { // remove complete entry - offending field was filtered if (isset($a_filters[$field])) { unset($a_result["set"][$idx]); break; } else { $a_result["set"][$idx][$field] = false; } } } } } $a_result["cnt"] = sizeof($a_result["set"]); }