public function loadAdditionalSkillData() { require_once 'Services/Skill/classes/class.ilBasicSkill.php'; require_once 'Services/Skill/classes/class.ilSkillTree.php'; $this->setSkillTitle(ilBasicSkill::_lookupTitle($this->getSkillBaseId(), $this->getSkillTrefId())); $tree = new ilSkillTree(); $path = $tree->getSkillTreePath($this->getSkillBaseId(), $this->getSkillTrefId()); $nodes = array(); foreach ($path as $node) { if ($node['child'] > 1 && $node['skill_id'] != $this->getSkillBaseId()) { $nodes[] = $node['title']; } } $this->setSkillPath(implode(' > ', $nodes)); }
/** * Get skill presentation HTML * * @return */ function getSkillHTML($a_top_skill_id, $a_user_id = 0, $a_edit = false) { global $ilUser, $lng, $ilCtrl, $ilSetting; $this->tooltips = array(); if ($a_user_id == 0) { $user = $ilUser; } else { $user = new ilObjUser($a_user_id); } $tpl = new ilTemplate("tpl.skill_pres.html", true, true, "Services/Skill"); include_once "./Services/UIComponent/Tooltip/classes/class.ilTooltipGUI.php"; include_once "./Services/Skill/classes/class.ilSkillTree.php"; $stree = new ilSkillTree(); include_once "./Services/Skill/classes/class.ilSkillTreeNode.php"; include_once "./Services/Skill/classes/class.ilSkillTreeNodeFactory.php"; // general settings for the action drop down include_once "Services/UIComponent/AdvancedSelectionList/classes/class.ilAdvancedSelectionListGUI.php"; $act_list = new ilAdvancedSelectionListGUI(); $act_list->setListTitle($lng->txt("actions")); $act_list->setSelectionHeaderClass("small"); // $act_list->setLinksMode("il_ContainerItemCommand2"); $act_list->setHeaderIcon(ilAdvancedSelectionListGUI::DOWN_ARROW_DARK); $act_list->setUseImages(false); $b_skills = ilSkillTreeNode::getSkillTreeNodes($a_top_skill_id, true); foreach ($b_skills as $bs) { $path = $stree->getSkillTreePath($bs["id"], $bs["tref"]); // check draft foreach ($path as $p) { if ($p["draft"]) { continue 2; } } reset($path); $se_level = ilPersonalSkill::getSelfEvaluation($user->getId(), $a_top_skill_id, $bs["tref"], $bs["id"]); $skill = ilSkillTreeNodeFactory::getInstance($bs["id"]); $level_data = $skill->getLevelData(); // check, if current self eval level is in current level data $valid_sel_level = false; if ($se_level > 0) { foreach ($level_data as $k => $v) { if ($v["id"] == $se_level) { $valid_sel_level = true; } } } reset($level_data); $found = false; foreach ($level_data as $k => $v) { // level $tpl->setCurrentBlock("level_td"); $tpl->setVariable("VAL_LEVEL", $v["title"]); $tt_id = "skmg_skl_tt_" . self::$skill_tt_cnt; self::$skill_tt_cnt++; $tpl->setVariable("TT_ID", $tt_id); if ($v["description"] != "") { ilTooltipGUI::addTooltip($tt_id, $v["description"]); } $tpl->parseCurrentBlock(); // self evaluation $tpl->setCurrentBlock("self_eval_td"); if ($valid_sel_level && !$found) { $tpl->setVariable("VAL_SELF_EVAL", "x"); $tpl->setVariable("CLASS_SELF_EVAL", "ilSkillSelf"); } else { $tpl->setVariable("VAL_SELF_EVAL", " "); } $tpl->parseCurrentBlock(); if ($v["id"] == $se_level) { $found = true; } // assigned materials if ($this->use_materials) { $mat_cnt = ilPersonalSkill::countAssignedMaterial($user->getId(), $bs["tref"], $v["id"]); if ($mat_cnt == 0) { $tpl->setCurrentBlock("material_td"); $tpl->setVariable("VAL_MATERIAL", " "); $tpl->parseCurrentBlock(); } else { // links to material files $tpl->setCurrentBlock("material_links"); $mat_tt = array(); $cnt = 1; foreach (ilPersonalSkill::getAssignedMaterial($user->getId(), $bs["tref"], $v["id"]) as $item) { $mat_data = $this->getMaterialInfo($item["wsp_id"]); $tpl->setVariable("URL_MATERIAL", $mat_data[1]); $tpl->setVariable("TXT_MATERIAL", $cnt); // tooltip $mat_tt_id = "skmg_skl_tt_mat_" . self::$skill_tt_cnt; self::$skill_tt_cnt++; $tpl->setVariable("TOOLTIP_MATERIAL_ID", $mat_tt_id); if (!$this->offline_mode) { ilTooltipGUI::addTooltip($mat_tt_id, $mat_data[0]); } else { $this->tooltips[] = ilTooltipGUI::getTooltip($mat_tt_id, $mat_data[0]); } $tpl->parseCurrentBlock(); $cnt++; } $tpl->setCurrentBlock("material_td"); $tpl->setVariable("CLASS_MAT", "ilSkillMat"); $tpl->parseCurrentBlock(); } } } $title = $sep = ""; $found = false; foreach ($path as $p) { if ($found) { $title .= $sep . $p["title"]; $sep = " > "; } if ($a_top_skill_id == $p["child"]) { $found = true; } } $tpl->setCurrentBlock("skill"); $tpl->setVariable("BSKILL_TITLE", $title); $tpl->setVariable("TXT_LEVEL", $lng->txt("skmg_level")); $tpl->setVariable("TXT_SELF_EVAL", $lng->txt("skmg_self_evaluation")); if ($this->use_materials) { $tpl->setVariable("TXT_MATERIAL", $lng->txt("skmg_material")); } if ($a_edit) { $act_list->flush(); $act_list->setId("act_" . $a_top_skill_id . "_" . $bs["id"]); $ilCtrl->setParameterByClass("ilpersonalskillsgui", "skill_id", $a_top_skill_id); $ilCtrl->setParameterByClass("ilpersonalskillsgui", "tref_id", $bs["tref"]); $ilCtrl->setParameterByClass("ilpersonalskillsgui", "basic_skill_id", $bs["id"]); if ($this->use_materials) { $act_list->addItem($lng->txt('skmg_assign_materials'), "", $ilCtrl->getLinkTargetByClass("ilpersonalskillsgui", "assignMaterials")); } $act_list->addItem($lng->txt('skmg_self_evaluation'), "", $ilCtrl->getLinkTargetByClass("ilpersonalskillsgui", "selfEvaluation")); $tpl->setVariable("ACTIONS2", $act_list->getHTML()); } $tpl->parseCurrentBlock(); } $tpl->setVariable("SKILL_TITLE", ilSkillTreeNode::_lookupTitle($a_top_skill_id)); if ($a_edit) { $act_list->flush(); $act_list->setId("act_" . $a_top_skill_id); $ilCtrl->setParameterByClass("ilpersonalskillsgui", "skill_id", $a_top_skill_id); // $act_list->addItem($lng->txt('skmg_assign_materials'), "", // $ilCtrl->getLinkTargetByClass("ilpersonalskillsgui", "assignMaterials")); $act_list->addItem($lng->txt('skmg_remove_skill'), "", $ilCtrl->getLinkTargetByClass("ilpersonalskillsgui", "confirmSkillRemove")); $tpl->setVariable("ACTIONS1", $act_list->getHTML()); } return $tpl->get(); }
/** * Get gap analysis html * * @param * @return */ function getGapAnalysisHTML($a_user_id = 0, $a_skills = null) { global $ilUser, $lng; // $this->setTabs("list_skills"); if ($a_user_id == 0) { $user_id = $ilUser->getId(); } else { $user_id = $a_user_id; } $skills = array(); if ($this->getProfileId() > 0) { $profile = new ilSkillProfile($this->getProfileId()); $this->profile_levels = $profile->getSkillLevels(); foreach ($this->profile_levels as $l) { $skills[] = array("base_skill_id" => $l["base_skill_id"], "tref_id" => $l["tref_id"], "level_id" => $l["level_id"]); } } else { if (is_array($a_skills)) { $skills = $a_skills; } } // get actual levels for gap analysis $this->actual_levels = array(); include_once "./Services/Skill/classes/class.ilBasicSkill.php"; foreach ($skills as $sk) { $bs = new ilBasicSkill($sk["base_skill_id"]); if ($this->gap_mode == "max_per_type") { $max = $bs->getMaxLevelPerType($sk["tref_id"], $this->gap_mode_type, $user_id); $this->actual_levels[$sk["base_skill_id"]][$sk["tref_id"]] = $max; } else { if ($this->gap_mode == "max_per_object") { $max = $bs->getMaxLevelPerObject($sk["tref_id"], $this->gap_mode_obj_id, $user_id); $this->actual_levels[$sk["base_skill_id"]][$sk["tref_id"]] = $max; } } } $incl_self_eval = false; if (count($this->getGapAnalysisSelfEvalLevels() > 0)) { $incl_self_eval = true; $self_vals = $this->getGapAnalysisSelfEvalLevels(); } // output spider stuff if (count($skills) >= 3) { $max_cnt = 0; $leg_labels = array(); //var_dump($this->profile_levels); //foreach ($this->profile_levels as $k => $l) // write target, actual and self counter to skill array foreach ($skills as $k => $l) { //$bs = new ilBasicSkill($l["base_skill_id"]); $bs = new ilBasicSkill($l["base_skill_id"]); $leg_labels[] = $bs->getTitle(); $levels = $bs->getLevelData(); $cnt = 0; foreach ($levels as $lv) { $cnt++; if ($l["level_id"] == $lv["id"]) { $skills[$k]["target_cnt"] = $cnt; } if ($this->actual_levels[$l["base_skill_id"]][$l["tref_id"]] == $lv["id"]) { $skills[$k]["actual_cnt"] = $cnt; } if ($incl_self_eval) { if ($self_vals[$l["base_skill_id"]][$l["tref_id"]] == $lv["id"]) { $skills[$k]["self_cnt"] = $cnt; } } $max_cnt = max($max_cnt, $cnt); } } // $leg_labels = array("AAAAA", "BBBBB", "CCCCC"); //var_dump($this->profile_levels); //var_dump($this->actual_levels); include_once "./Services/Chart/classes/class.ilChart.php"; $chart = new ilChart("gap_chart", 600, 300); $chart->setYAxisMax($max_cnt); $chart->setLegLabels($leg_labels); // target level $cd = new ilChartData("spider"); $cd->setLabel($lng->txt("skmg_target_level")); $cd->setFill("true", "#A0A0A0"); // other users $cd2 = new ilChartData("spider"); if ($this->gap_cat_title != "") { $cd2->setLabel($this->gap_cat_title); } else { if ($this->gap_mode == "max_per_type") { $cd2->setLabel($lng->txt("objs_" . $this->gap_mode_type)); } else { if ($this->gap_mode == "max_per_object") { $cd2->setLabel(ilObject::_lookupTitle($this->gap_mode_obj_id)); } } } $cd2->setFill("true", "#8080FF"); // self evaluation if ($incl_self_eval) { $cd3 = new ilChartData("spider"); $cd3->setLabel($lng->txt("skmg_self_evaluation")); $cd3->setFill("true", "#FF8080"); } // fill in data $cnt = 0; foreach ($skills as $pl) { $cd->addPoint($cnt, (int) $pl["target_cnt"]); $cd2->addPoint($cnt, (int) $pl["actual_cnt"]); if ($incl_self_eval) { $cd3->addPoint($cnt, (int) $pl["self_cnt"]); } $cnt++; } // add data to chart if ($this->getProfileId() > 0) { $chart->addData($cd); } $chart->addData($cd2); if ($incl_self_eval && count($this->getGapAnalysisSelfEvalLevels()) > 0) { $chart->addData($cd3); } $lg = new ilChartLegend(); $chart->setLegend($lg); $chart_html = $chart->getHTML(); } $stree = new ilSkillTree(); $html = ""; foreach ($skills as $s) { $path = $stree->getSkillTreePath($s["base_skill_id"]); // check draft foreach ($path as $p) { if ($p["draft"]) { continue 2; } } $html .= $this->getSkillHTML($s["base_skill_id"], $user_id, false, $s["tref_id"]); } // list skills // include_once("./Services/Skill/classes/class.ilPersonalSkillTableGUI.php"); // $sktab = new ilPersonalSkillTableGUI($this, "listSkills"); return $chart_html . $html; }
/** * Find skills * * @param * @return */ public static function findSkills($a_term) { global $ilDB; $res = array(); $candidates = array(); $skill_tree = new ilSkillTree(); $sql = "SELECT * " . " FROM skl_tree_node" . " WHERE " . $ilDB->like("title", "text", "%" . $a_term . "%"); $sql .= " ORDER BY title"; $set = $ilDB->query($sql); include_once "./Services/Skill/classes/class.ilSkillTemplateReference.php"; while ($row = $ilDB->fetchAssoc($set)) { if (in_array($row["type"], array("sctp", "sktp"))) { // need to get "top template" first! (if it is already the top level, do not use it!) $path = $skill_tree->getSkillTreePath($row["obj_id"]); if ($path[1]["child"] != $row["obj_id"]) { $trefs = ilSkillTemplateReference::_lookupTrefIdsForTopTemplateId($path[1]["child"]); foreach ($trefs as $tref) { $candidates[] = array("tref_id" => $tref, "skill_id" => $row["obj_id"], "title" => $row["title"]); } } } else { if ($row["type"] == "sktr") { // works $candidates[] = array("tref_id" => $row["obj_id"], "skill_id" => ilSkillTemplateReference::_lookupTemplateId($row["obj_id"]), "title" => $row["title"]); } else { // works $candidates[] = array("tref_id" => 0, "skill_id" => $row["obj_id"], "title" => $row["title"]); } } } foreach ($candidates as $c) { // if we get a path array, and the array has items try to use the data $path = $skill_tree->getSkillTreePath($c["skill_id"], $c["tref_id"]); $use = false; if (is_array($path) && count($path) > 0) { $use = true; } // if any inactive/outdated -> do not use the data if (is_array($path)) { foreach ($path as $p) { if ($p["status"] > 0) { $use = false; } } } if ($use) { if (!in_array($c["title"], $res)) { $res[] = $c["title"]; } } } return $res; }