/** * handler for end of element * * @param resource $a_xml_parser xml parser * @param string $a_name element name */ public function handlerEndTag($a_xml_parser, $a_name) { global $ilDB, $ilUser; $this->cdata = trim($this->cdata); $arrayname = strtolower($this->entity) . 'Array'; $x =& $this->{$arrayname}; switch ($a_name) { case 'Forum': $query_num_posts = "SELECT COUNT(pos_pk) cnt\n\t\t\t\t\t\t\t\t\t\tFROM frm_posts\n\t\t\t\t\t\t\t\t\tWHERE pos_top_fk = " . $ilDB->quote($this->lastHandledForumId, 'integer'); $res_pos = $ilDB->query($query_num_posts); $data_pos = $ilDB->fetchAssoc($res_pos); $num_posts = $data_pos['cnt']; $query_num_threads = "SELECT COUNT(thr_pk) cnt\n\t\t\t\t\t\t\t\t\t\tFROM frm_threads\n\t\t\t\t\t\t\t\t\t WHERE thr_top_fk = " . $ilDB->quote($this->lastHandledForumId, 'integer'); $res_thr = $ilDB->query($query_num_threads); $data_thr = $ilDB->fetchAssoc($res_thr); $num_threads = $data_thr['cnt']; $update_str = "{$this->lastHandledForumId}#{$this->lastHandledThreadId}#{$this->lastHandledPostId}"; $ilDB->manipulateF("UPDATE frm_data \n\t\t\t\t\t\tSET top_last_post = %s,\n\t\t\t\t\t\t\ttop_num_posts = %s,\n\t\t\t\t\t\t\ttop_num_threads = %s\n\t\t\t\t\tWHERE top_frm_fk = %s", array('text', 'integer', 'integer', 'integer'), array($update_str, $num_posts, $num_threads, $this->forum_obj_id)); break; case 'Id': $x['Id'] = $this->cdata; break; case 'ObjId': $x['ObjId'] = $this->cdata; break; case 'Title': $x['Title'] = $this->cdata; break; case 'Description': $x['Description'] = $this->cdata; break; case 'DefaultView': $x['DefaultView'] = $this->cdata; break; case 'Pseudonyms': $x['Pseudonyms'] = $this->cdata; break; case 'Statistics': $x['Statistics'] = $this->cdata; break; case 'PostingActivation': $x['PostingActivation'] = $this->cdata; break; case 'PresetSubject': $x['PresetSubject'] = $this->cdata; break; case 'PresetRe': $x['PresetRe'] = $this->cdata; break; case 'NotificationType': $x['NotificationType'] = $this->cdata; break; case 'ForceNotification': $x['ForceNotification'] = $this->cdata; break; case 'ToggleNotification': $x['ToggleNotification'] = $this->cdata; break; case 'LastPost': $x['LastPost'] = $this->cdata; break; case 'Moderator': $x['Moderator'] = $this->cdata; break; case 'CreateDate': $x['CreateDate'] = $this->cdata; break; case 'UpdateDate': $x['UpdateDate'] = $this->cdata; break; case 'UpdateUserId': $x['UpdateUserId'] = $this->cdata; break; case 'UserId': $x['UserId'] = $this->cdata; if ($this->entity == 'forum' && $this->forumArray) { //// @todo: Maybe problems if the forum xml is imported as content of a course // createSettings accesses superglobal $_GET array, which can cause problems // with public_notifications of block settings $this->forum->createSettings(); $forum_array = $this->getUserIdAndAlias($this->forumArray['UserId'], ''); // Store old user id $oldUsrId = $ilUser->getId(); // Manipulate user object $ilUser->setId($forum_array['usr_id']); // create frm_data $this->forum->saveData(array()); // Restore old user id $ilUser->setId($oldUsrId); $update_forum_array = $this->getUserIdAndAlias($this->forumArray['UpdateUserId'], ''); // Store old user id $oldUsrId = $_SESSION["AccountId"]; // Manipulate user object $_SESSION["AccountId"] = $update_forum_array['usr_id']; $this->forum->setTitle($this->forumArray["Title"]); $this->forum->setDescription($this->forumArray["Description"]); $this->forum->update(); // Restore old user id $_SESSION["AccountId"] = $oldUsrId; // create frm_settings $newObjProp = ilForumProperties::getInstance($this->forum->getId()); $newObjProp->setDefaultView((int) $this->forumArray['DefaultView']); $newObjProp->setAnonymisation((int) $this->forumArray['Pseudonyms']); $newObjProp->setStatisticsStatus((int) $this->forumArray['Statistics']); $newObjProp->setPostActivation((int) $this->forumArray['PostingActivation']); $newObjProp->setPresetSubject((int) $this->forumArray['PresetSubject']); $newObjProp->setAddReSubject((int) $this->forumArray['PresetRe']); $newObjProp->setNotificationType($this->forumArray['NotificationType'] ? $this->forumArray['NotificationType'] : 'all_users'); $newObjProp->setAdminForceNoti((int) $this->forumArray['ForceNotification']); $newObjProp->setUserToggleNoti((int) $this->forumArray['ToggleNotification']); $newObjProp->insert(); $id = $this->getNewForumPk(); $this->forum_obj_id = $newObjProp->getObjId(); $this->mapping['frm'][$this->forumArray['Id']] = $id; $this->lastHandledForumId = $id; unset($this->forumArray); } break; case 'Thread': $update_str = "{$this->lastHandledForumId}#{$this->lastHandledThreadId}#{$this->lastHandledPostId}"; $ilDB->manipulateF("UPDATE frm_threads\n\t\t\t\t\t\tSET thr_last_post = %s\n\t\t\t\t\tWHERE thr_pk = %s", array('text', 'integer'), array($update_str, $this->lastHandledThreadId)); break; case 'Subject': $x['Subject'] = $this->cdata; break; case 'Alias': $x['Alias'] = $this->cdata; break; case 'Sticky': $x['Sticky'] = $this->cdata; break; case 'Closed': $x['Closed'] = $this->cdata; if ($this->entity == 'thread' && $this->threadArray) { require_once 'Modules/Forum/classes/class.ilForumTopic.php'; $this->forumThread = new ilForumTopic(); $this->forumThread->setId($this->threadArray['Id']); $this->forumThread->setForumId($this->lastHandledForumId); $this->forumThread->setSubject($this->threadArray['Subject']); $this->forumThread->setSticky($this->threadArray['Sticky']); $this->forumThread->setClosed($this->threadArray['Closed']); $this->forumThread->setCreateDate($this->threadArray['CreateDate']); $this->forumThread->setChangeDate($this->threadArray['UpdateDate']); $this->forumThread->setImportName($this->threadArray['ImportName']); $usr_data = $this->getUserIdAndAlias($this->threadArray['UserId'], $this->threadArray['Alias']); $this->forumThread->setUserId($usr_data['usr_id']); $this->forumThread->setUserAlias($usr_data['usr_alias']); $this->forumThread->insert(); $this->mapping['thr'][$this->threadArray['Id']] = $this->forumThread->getId(); $this->lastHandledThreadId = $this->forumThread->getId(); unset($this->threadArray); } break; case 'Post': break; case 'Censorship': $x['Censorship'] = $this->cdata; break; case 'CensorshipMessage': $x['CensorshipMessage'] = $this->cdata; break; case 'Notification': $x['Notification'] = $this->cdata; break; case 'ImportName': $x['ImportName'] = $this->cdata; break; case 'Status': $x['Status'] = $this->cdata; break; case 'Message': $x['Message'] = $this->cdata; break; case 'Lft': $x['Lft'] = $this->cdata; break; case 'Rgt': $x['Rgt'] = $this->cdata; break; case 'Depth': $x['Depth'] = $this->cdata; break; case 'ParentId': $x['ParentId'] = $this->cdata; if ($this->entity == 'post' && $this->postArray) { require_once 'Modules/Forum/classes/class.ilForumPost.php'; $this->forumPost = new ilForumPost(); $this->forumPost->setId($this->postArray['Id']); $this->forumPost->setCensorship($this->postArray['Censorship']); $this->forumPost->setCensorshipComment($this->postArray['CensorshipMessage']); $this->forumPost->setNotification($this->postArray['Notification']); $this->forumPost->setImportName($this->postArray['ImportName']); $this->forumPost->setStatus($this->postArray['Status']); $this->forumPost->setMessage($this->postArray['Message']); $this->forumPost->setSubject($this->postArray['Subject']); $this->forumPost->setLft($this->postArray['Lft']); $this->forumPost->setRgt($this->postArray['Rgt']); $this->forumPost->setDepth($this->postArray['Depth']); $this->forumPost->setParentId($this->postArray['ParentId']); $this->forumPost->setThread($this->forumThread); $this->forumPost->setThreadId($this->lastHandledThreadId); $this->forumPost->setForumId($this->lastHandledForumId); $this->forumPost->setCreateDate($this->postArray['CreateDate']); $this->forumPost->setChangeDate($this->postArray['UpdateDate']); $usr_data = $this->getUserIdAndAlias($this->postArray['UserId'], $this->postArray['Alias']); $update_usr_data = $this->getUserIdAndAlias($this->postArray['UpdateUserId']); $this->forumPost->setUserId($usr_data['usr_id']); $this->forumPost->setUserAlias($usr_data['usr_alias']); $this->forumPost->setUpdateUserId($update_usr_data['usr_id']); $this->forumPost->insert(); if ($this->mapping['pos'][$this->postArray['ParentId']]) { $parentId = $this->mapping['pos'][$this->postArray['ParentId']]; } else { $parentId = 0; } $postTreeNodeId = $ilDB->nextId('frm_posts_tree'); $ilDB->insert('frm_posts_tree', array('fpt_pk' => array('integer', $postTreeNodeId), 'thr_fk' => array('integer', $this->lastHandledThreadId), 'pos_fk' => array('integer', $this->forumPost->getId()), 'parent_pos' => array('integer', $parentId), 'lft' => array('integer', $this->postArray['Lft']), 'rgt' => array('integer', $this->postArray['Rgt']), 'depth' => array('integer', $this->postArray['Depth']), 'fpt_date' => array('timestamp', date('Y-m-d H:i:s')))); $this->mapping['pos'][$this->postArray['Id']] = $this->forumPost->getId(); $this->lastHandledPostId = $this->forumPost->getId(); $media_objects_found = false; foreach ($this->mediaObjects as $mob_attr) { $importfile = $this->getImportDirectory() . '/' . $mob_attr['uri']; if (file_exists($importfile)) { $mob = ilObjMediaObject::_saveTempFileAsMediaObject(basename($importfile), $importfile, false); ilObjMediaObject::_saveUsage($mob->getId(), "frm:html", $this->forumPost->getId()); $this->forumPost->setMessage(str_replace(array("src=\"" . $mob_attr["label"] . "\"", "src=\"" . preg_replace("/(il)_[\\d]+_(mob)_([\\d]+)/", "\$1_0_\$2_\$3", $mob_attr["label"]) . "\""), "src=\"" . "il_" . IL_INST_ID . "_mob_" . $mob->getId() . "\"", $this->forumPost->getMessage())); $media_objects_found = true; } } if ($media_objects_found) { $this->forumPost->update(); } unset($this->postArray); } break; case 'Content': $x['content'] = $this->cdata; break; case 'Attachment': $filedata = new ilFileDataForum($this->forum->getId(), $this->lastHandledPostId); $importPath = $this->contentArray['content']; if (strlen($importPath)) { $importPath = $this->getImportDirectory() . '/' . $importPath; $newFilename = preg_replace("/^\\d+_\\d+(_.*)/ims", $this->forum->getId() . "_" . $this->lastHandledPostId . "\$1", basename($importPath)); $path = $filedata->getForumPath(); $newPath = $path . '/' . $newFilename; @copy($importPath, $newPath); } break; } $this->cdata = ''; return; }