/**
  * 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());
 }
Esempio n. 4
0
 /**
  * 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"]);
 }