/** * @param string $field: name of the field of target table (not the imported table!) * @param array $line : all other data from that line. * @return mixed: if no mapping should apply map to false. null maps * to database NULL. Any other value will map to a string value. */ public function mapField($field, $line) { if ($field === "fleximport_studyarea") { $studienbereiche = array("0" => "Webinare / eLearning", "1" => "Studiengebiet 1", "2" => "Studiengebiet 2", "3" => "Studiengebiet 3", "4" => "Studiengebiet 4", "5" => "Studiengebiet 5", "6" => "Trainingszentrum", "8" => "BKA / DHPOL / externe Fobi", "9" => "Sonstiges"); $studyareas = array(); foreach (StudipStudyArea::findBySQL("name = ?", array($studienbereiche[$line['studienbereich']])) as $study_area) { $studyareas[] = $study_area->getId(); } return $studyareas; } return false; }
public function getMappedData($line) { $plugin = $this->getPlugin(); $fields = $this->getTargetFields(); //dynamic additional fields: switch ($this['import_type']) { case "Course": foreach (Datafield::findBySQL("object_type = 'sem'") as $datafield) { $fields[] = $datafield['name']; } $fields[] = "fleximport_dozenten"; $fields[] = "fleximport_related_institutes"; $fields[] = "fleximport_studyarea"; $fields[] = "fleximport_locked"; $fields[] = "fleximport_course_userdomains"; break; case "User": foreach (Datafield::findBySQL("object_type = 'user'") as $datafield) { $fields[] = $datafield['name']; } $fields[] = "fleximport_username_prefix"; $fields[] = "fleximport_userdomains"; $fields[] = "fleximport_user_inst"; $fields[] = "fleximport_expiration_date"; $fields[] = "fleximport_welcome_message"; break; } $data = array(); foreach ($fields as $field) { $mapping = false; //important: false means no mapping, null means mapping to database null if ($plugin && in_array($field, $plugin->fieldsToBeMapped())) { $mapping = $plugin->mapField($field, $line); } if ($mapping !== false) { $data[$field] = $mapping; } else { if ($this['tabledata']['simplematching'][$field]['column']) { if ($this['tabledata']['simplematching'][$field]['column'] === "static value") { //use a static value $data[$field] = $this['tabledata']['simplematching'][$field]['static']; } else { if (strpos($this['tabledata']['simplematching'][$field]['column'], "fleximportconfig_") === 0) { $config = substr($this['tabledata']['simplematching'][$field]['column'], strlen("fleximportconfig_")); $template = FleximportConfig::get($config); foreach ($data as $index => $value) { $template = str_replace("{{" . $index . "}}", $value, $template); } foreach ($line as $index => $value) { if (!in_array($index, $data)) { $template = str_replace("{{" . $index . "}}", $value, $template); } } $data[$field] = $template; } else { //use a matched column $data[$field] = $line[$this['tabledata']['simplematching'][$field]['column']]; } } } else { //else no mapping, don't even overwrite old value. } } } foreach ($fields as $field) { //mapper: if (strpos($this['tabledata']['simplematching'][$field]['column'], "fleximport_mapper__") === 0) { list($prefix, $mapperclass, $format) = explode("__", $this['tabledata']['simplematching'][$field]['column']); if (class_exists($mapperclass)) { $mapper = new $mapperclass(); if (is_a($mapper, "FleximportMapper")) { $mapfrom = $this['tabledata']['simplematching'][$field]['mapfrom']; $data[$field] = $mapper->map($format, $data[$mapfrom] ?: $line[$mapfrom]); } } } } //special mapping if ($this['import_type'] === "Course") { //Map seminar_id : if (!$data['seminar_id'] && $this['tabledata']['simplematching']["seminar_id"]['column'] === "fleximport_map_from_veranstaltungsnummer_and_semester") { $course = Course::findOneBySQL("name = ? AND start_time = ?", array($data['name'], $data['start_time'])); if ($course) { $data['seminar_id'] = $course->getId(); } } //Map dozenten: if ($this['tabledata']['simplematching']["fleximport_dozenten"]['column'] && !in_array("fleximport_dozenten", $this->fieldsToBeDynamicallyMapped())) { $data['fleximport_dozenten'] = (array) preg_split($this['tabledata']['simplematching']["fleximport_dozenten"]['format'] === "fullname" ? "/\\s*,\\s*/" : "/\\s+/", $data['fleximport_dozenten'], null, PREG_SPLIT_NO_EMPTY); switch ($this['tabledata']['simplematching']["fleximport_dozenten"]['format']) { case "user_id": $data['fleximport_dozenten'] = array_map(function ($user_id) { $user = User::find($user_id); if ($user) { return $user->getId(); } else { return null; } }, $data['fleximport_dozenten']); break; case "username": $data['fleximport_dozenten'] = array_map("get_userid", $data['fleximport_dozenten']); break; case "email": $data['fleximport_dozenten'] = array_map(function ($email) { $user = User::findOneByEmail($email); if ($user) { return $user->getId(); } else { return null; } }, $data['fleximport_dozenten']); break; case "fullname": $data['fleximport_dozenten'] = array_map(function ($fullname) { list($vorname, $nachname) = (array) preg_split("/\\s+/", $fullname, null, PREG_SPLIT_NO_EMPTY); $user = User::findOneBySQL("Vorname = ? AND Nachname = ? AND perms = 'dozent'", array($vorname, $nachname)); if ($user) { return $user->getId(); } else { return null; } }, $data['fleximport_dozenten']); break; default: //map by datafield $datafield_id = $this['tabledata']['simplematching']["fleximport_dozenten"]['format']; foreach ($data['fleximport_dozenten'] as $key => $value) { $entry = DatafieldEntryModel::findOneBySQL("datafield_id = ? AND content = ?", array($datafield_id, $value)); if ($entry) { $data['fleximport_dozenten'][$key] = $entry['range_id']; } else { unset($data['fleximport_dozenten'][$key]); } } break; } } //Map sem_type: if ($this['tabledata']['simplematching']["status"]['column'] && $this['tabledata']['simplematching']["status"]['format']) { if ($this['tabledata']['simplematching']["status"]['format'] === "name") { $sem_type_id = null; foreach ($GLOBALS['SEM_TYPE'] as $id => $sem_type) { if ($sem_type['name'] === $data['status']) { $sem_type_id = $id; } } $data['status'] = $sem_type_id; } } //Map Studienbereiche if ($this['tabledata']['simplematching']["fleximport_studyarea"]['column'] && !in_array("fleximport_studyarea", $this->fieldsToBeDynamicallyMapped())) { if ($this['tabledata']['simplematching']["fleximport_studyarea"]['column'] === "static value") { $data['fleximport_studyarea'] = (array) explode(";", $this['tabledata']['simplematching']["fleximport_studyarea"]['static']); } else { $data['fleximport_studyarea'] = (array) explode(";", $data['fleximport_studyarea']); $study_areas = array(); foreach ($data['fleximport_studyarea'] as $key => $name) { foreach (StudipStudyArea::findBySQL("name = ?", array($name)) as $study_area) { $study_areas[] = $study_area->getId(); } } $data['fleximport_studyarea'] = $study_areas; } } if ($this['tabledata']['simplematching']["fleximport_course_userdomains"]['column'] && !in_array("fleximport_course_userdomains", $this->fieldsToBeDynamicallyMapped())) { $data['fleximport_course_userdomains'] = (array) preg_split("/\\s*,\\s*/", $data['fleximport_course_userdomains'], null, PREG_SPLIT_NO_EMPTY); $statement = DBManager::get()->prepare("SELECT userdomain_id FROM userdomains WHERE name IN (:domains) OR userdomain_id IN (:domains)"); $statement->execute(array('domains' => $data['fleximport_course_userdomains'])); $data['fleximport_course_userdomains'] = $statement->fetchAll(PDO::FETCH_COLUMN, 0); } } if ($this['import_type'] === "User") { if ($this['tabledata']['simplematching']["username"]['column']) { if ($this['tabledata']['simplematching']["username"]['format'] === "email_first_part") { list($data['username']) = explode("@", $data['username']); } if ($this['tabledata']['simplematching']["fleximport_username_prefix"]['column']) { $data['username'] = $data['fleximport_username_prefix'] . $data['username']; } } if ($this['tabledata']['simplematching']["fleximport_user_inst"]['column']) { $data['fleximport_user_inst'] = (array) preg_split("/\\s*,\\s*/", $data['fleximport_user_inst'], null, PREG_SPLIT_NO_EMPTY); $institut_ids = array(); foreach ($data['fleximport_user_inst'] as $inst_name) { $statement = DBManager::get()->prepare("\n SELECT Institut_id\n FROM Institute\n WHERE Name = ?\n "); $statement->execute(array($inst_name)); $institut_id = $statement->fetch(PDO::FETCH_COLUMN, 0); if ($institut_id) { $institut_ids[] = $institut_id; } } $data['fleximport_user_inst'] = $institut_ids; } if ($this['tabledata']['simplematching']["fleximport_userdomains"]['column'] && !in_array("fleximport_userdomains", $this->fieldsToBeDynamicallyMapped())) { $data['fleximport_userdomains'] = (array) preg_split("/\\s*,\\s*/", $data['fleximport_userdomains'], null, PREG_SPLIT_NO_EMPTY); $statement = DBManager::get()->prepare("SELECT userdomain_id FROM userdomains WHERE name IN (:domains) OR userdomain_id IN (:domains)"); $statement->execute(array('domains' => $data['fleximport_userdomains'])); $data['fleximport_userdomains'] = $statement->fetchAll(PDO::FETCH_COLUMN, 0); } if ($this['tabledata']['simplematching']["fleximport_expiration_date"]['column'] && !in_array("fleximport_expiration_date", $this->fieldsToBeDynamicallyMapped())) { if (!is_numeric($data['fleximport_expiration_date'])) { $data['fleximport_expiration_date'] = strtotime($data['fleximport_expiration_date']); } } } if ($this['import_type'] === "User" && !$data['user_id']) { if (!$data['user_id'] && $data['auth_plugin'] === "standard" && !$data['password']) { $usermanager = new UserManagement(); $data['password'] = $usermanager->generate_password(6); } } return $data; }