1<?php 2 3/* Copyright (c) 1998-2017 ILIAS open source, Extended GPL, see docs/LICENSE */ 4 5/** 6 * Skills of a container 7 * 8 * @author Alex Killing <killing@leifos.de> 9 */ 10class ilContainerMemberSkills 11{ 12 13 /** 14 * @var ilDB 15 */ 16 protected $db; 17 18 /** 19 * @var array 20 */ 21 protected $skills = array(); 22 23 /** 24 * @var int object id 25 */ 26 protected $obj_id; 27 28 /** 29 * @var int 30 */ 31 protected $user_id; 32 33 /** 34 * @var array 35 */ 36 protected $skill_levels = array(); 37 38 /** 39 * @var bool 40 */ 41 protected $published = false; 42 43 /** 44 * Constrictor 45 * 46 * @param int $a_obj_id 47 */ 48 public function __construct($a_obj_id, $a_user_id) 49 { 50 global $DIC; 51 52 $this->db = $DIC->database(); 53 54 $this->setObjId($a_obj_id); 55 $this->setUserId($a_user_id); 56 if ($a_obj_id > 0 && $a_user_id > 0) { 57 $this->read(); 58 } 59 } 60 61 /** 62 * Set object id 63 * 64 * @param int $a_val object id 65 */ 66 public function setObjId($a_val) 67 { 68 $this->obj_id = $a_val; 69 } 70 71 /** 72 * Get object id 73 * 74 * @return int 75 */ 76 public function getObjId() 77 { 78 return $this->obj_id; 79 } 80 81 /** 82 * Set user id 83 * 84 * @param int $a_val user id 85 */ 86 public function setUserId($a_val) 87 { 88 $this->user_id = $a_val; 89 } 90 91 /** 92 * Get user id 93 * 94 * @return int 95 */ 96 public function getUserId() 97 { 98 return $this->user_id; 99 } 100 101 /** 102 * Read 103 */ 104 public function read() 105 { 106 $db = $this->db; 107 108 $set = $db->query( 109 "SELECT * FROM cont_member_skills " . 110 " WHERE obj_id = " . $db->quote($this->getObjId(), "integer") . 111 " AND user_id = " . $db->quote($this->getUserId(), "integer") 112 ); 113 $this->skill_levels = array(); 114 while ($rec = $this->db->fetchAssoc($set)) { 115 $this->skill_levels[$rec["skill_id"] . ":" . $rec["tref_id"]] = $rec["level_id"]; 116 $this->published = $rec["published"]; // this is a little weak, but the value should be the same for all save skills 117 } 118 } 119 120 /** 121 * Get Skill levels 122 * 123 * @return array (key is skill_id:tref_id, value is level id) 124 */ 125 public function getSkillLevels() 126 { 127 return $this->skill_levels; 128 } 129 130 /** 131 * Get ordered skill levels 132 * 133 * @return array[] each item comes with keys "level_id", "skill_id", "tref_id" 134 */ 135 public function getOrderedSkillLevels() 136 { 137 $skill_levels = array_map(function ($a, $k) { 138 $s = explode(":", $k); 139 return array("level_id" => $a, "skill_id" => $s[0], "tref_id" => $s[1]); 140 }, $this->getSkillLevels(), array_keys($this->getSkillLevels())); 141 142 include_once("./Services/Skill/classes/class.ilVirtualSkillTree.php"); 143 $vtree = new ilVirtualSkillTree(); 144 return $vtree->getOrderedNodeset($skill_levels, "skill_id", "tref_id"); 145 } 146 147 148 /** 149 * Get published 150 * 151 * @return bool 152 */ 153 public function getPublished() 154 { 155 return $this->published; 156 } 157 158 /** 159 * Save levels for skills 160 * 161 * @param array $a_level_data (key is skill_id:tref_id, value is level id) 162 */ 163 public function saveLevelForSkills($a_level_data) 164 { 165 $db = $this->db; 166 167 $this->delete(); 168 foreach ($a_level_data as $k => $v) { 169 $sk = explode(":", $k); 170 $db->manipulate("INSERT INTO cont_member_skills " . 171 "(obj_id, user_id, skill_id, tref_id, level_id, published) VALUES (" . 172 $db->quote($this->getObjId(), "integer") . "," . 173 $db->quote($this->getUserId(), "integer") . "," . 174 $db->quote($sk[0], "integer") . "," . 175 $db->quote($sk[1], "integer") . "," . 176 $db->quote($v, "integer") . "," . 177 $db->quote(0, "integer") . 178 ")"); 179 } 180 181 $this->skill_levels = $a_level_data; 182 } 183 184 /** 185 * Delete all level data for current user 186 * 187 * @param 188 */ 189 public function delete() 190 { 191 $db = $this->db; 192 193 $db->manipulate("DELETE FROM cont_member_skills WHERE " . 194 " obj_id = " . $db->quote($this->getObjId(), "integer") . 195 " AND user_id = " . $db->quote($this->getUserId(), "integer")); 196 } 197 198 /** 199 * Publish 200 */ 201 public function publish($a_ref_id) 202 { 203 $db = $this->db; 204 205 $changed = ilBasicSkill::removeAllUserSkillLevelStatusOfObject( 206 $this->getUserId(), 207 $this->getObjId(), 208 false, 209 $this->getObjId() 210 ); 211 212 foreach ($this->skill_levels as $sk => $l) { 213 $changed = true; 214 $sk = explode(":", $sk); 215 ilBasicSkill::writeUserSkillLevelStatus( 216 $l, 217 $this->user_id, 218 $a_ref_id, 219 $sk[1], 220 ilBasicSkill::ACHIEVED, 221 false, 222 false, 223 $this->obj_id 224 ); 225 226 if ($sk[1] > 0) { 227 ilPersonalSkill::addPersonalSkill($this->getUserId(), $sk[1]); 228 } else { 229 ilPersonalSkill::addPersonalSkill($this->getUserId(), $sk[0]); 230 } 231 } 232 233 $db->manipulate("UPDATE cont_member_skills SET " . 234 " published = " . $db->quote(1, "integer") . 235 " WHERE obj_id = " . $db->quote($this->getObjId(), "integer") . 236 " AND user_id = " . $db->quote($this->getUserId(), "integer")); 237 238 return $changed; 239 } 240 241 242 /** 243 * Remove all skill levels 244 */ 245 public function removeAllSkillLevels() 246 { 247 ilBasicSkill::removeAllUserSkillLevelStatusOfObject( 248 $this->getUserId(), 249 $this->getObjId(), 250 false, 251 $this->getObjId() 252 ); 253 254 $this->delete(); 255 } 256} 257