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