ILIAS  trunk Revision v11.0_alpha-1713-gd8962da2f67
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
class.ContainerSkillManager.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 namespace ILIAS\Container\Skills;
22 
24 
29 {
30  protected int $cont_obj_id;
31  protected int $cont_ref_id;
38  protected \ilSkillManagementSettings $skmg_settings;
39 
40  public function __construct(
41  int $cont_obj_id,
42  int $cont_ref_id,
43  ?ContainerSkillDBRepository $cont_skill_repo = null,
44  ?ContainerMemberSkillDBRepository $cont_member_skill_repo = null,
45  ?SkillService\SkillTreeService $tree_service = null,
46  ?SkillService\SkillProfileService $profile_service = null,
47  ?SkillService\SkillPersonalService $personal_service = null,
48  ?SkillInternalFactoryService $factory_service = null,
49  ?\ilSkillManagementSettings $skmg_settings = null
50  ) {
51  global $DIC;
52 
53  $this->cont_obj_id = $cont_obj_id;
54  $this->cont_ref_id = $cont_ref_id;
55  $this->cont_skill_repo = ($cont_skill_repo)
56  ?: $DIC->skills()->internalContainer()->repo()->getContainerSkillRepo();
57  $this->cont_member_skill_repo = ($cont_member_skill_repo)
58  ?: $DIC->skills()->internalContainer()->repo()->getContainerMemberSkillRepo();
59  $this->tree_service = ($tree_service) ?: $DIC->skills()->tree();
60  $this->profile_service = ($profile_service) ?: $DIC->skills()->profile();
61  $this->personal_service = ($personal_service) ?: $DIC->skills()->personal();
62  $this->factory_service = ($factory_service) ?: $DIC->skills()->internalContainer()->factory();
63  $this->skmg_settings = ($skmg_settings) ?: new \ilSkillManagementSettings();
64  }
65 
69 
70  public function addSkillForContainer(int $skill_id, int $tref_id): void
71  {
72  $this->cont_skill_repo->add($this->cont_obj_id, $skill_id, $tref_id);
73  }
74 
75  public function removeSkillFromContainer(int $skill_id, int $tref_id): void
76  {
77  $this->cont_skill_repo->remove($this->cont_obj_id, $skill_id, $tref_id);
78  }
79 
83  public function getSkillsForContainerOrdered(): array
84  {
85  $skills_as_array = [];
86  foreach ($this->getSkillsForContainer() as $skill) {
87  $skills_as_array[$skill->getBaseSkillId() . "-" . $skill->getTrefId()] = [
88  "skill_id" => $skill->getBaseSkillId(),
89  "tref_id" => $skill->getTrefId()
90  ];
91  }
92 
93  $vtree = $this->tree_service->getGlobalVirtualSkillTree();
94  $skills_ordered = $vtree->getOrderedNodeset($skills_as_array, "skill_id", "tref_id");
95 
96  $skills_obj_ordered = [];
97  foreach ($skills_ordered as $s) {
98  $skills_obj_ordered[] = $this->factory_service->containerSkill()->skill(
99  $s["skill_id"],
100  $s["tref_id"],
101  $this->cont_obj_id
102  );
103  }
104 
105  return $skills_obj_ordered;
106  }
107 
111  public function getSkillsForContainer(): array
112  {
113  return $this->cont_skill_repo->getAll($this->cont_obj_id);
114  }
115 
116 
120 
121  public function addMemberSkillForContainer(int $user_id, int $skill_id, int $tref_id, int $level_id): void
122  {
123  $this->cont_member_skill_repo->add($this->cont_obj_id, $user_id, $skill_id, $tref_id, $level_id);
124  }
125 
126  public function removeMemberSkillFromContainer(int $user_id, int $skill_id, int $tref_id): void
127  {
128  $this->cont_member_skill_repo->remove($this->cont_obj_id, $user_id, $skill_id, $tref_id);
129  }
130 
131  public function removeAllMemberSkillsFromContainer(int $user_id): void
132  {
134  $user_id,
135  $this->cont_obj_id,
136  false,
137  (string) $this->cont_obj_id
138  );
139 
140  $this->cont_member_skill_repo->removeAll($this->cont_obj_id, $user_id);
141  }
142 
143  public function publishMemberSkills(int $user_id): bool
144  {
146  $user_id,
147  $this->cont_obj_id,
148  false,
149  (string) $this->cont_obj_id
150  );
151 
152  foreach ($this->getMemberSkillsForContainer($user_id) as $l) {
153  $changed = true;
155  $l->getLevelId(),
156  $user_id,
158  $l->getTrefId(),
160  false,
161  false,
162  (string) $this->cont_obj_id
163  );
164 
165  if ($l->getTrefId() > 0) {
166  $this->personal_service->addPersonalSkill($user_id, $l->getTrefId());
167  } else {
168  $this->personal_service->addPersonalSkill($user_id, $l->getBaseSkillId());
169  }
170  }
171 
172  //write profile completion entries if fulfilment status has changed
173  $this->profile_service->writeCompletionEntryForAllProfiles($user_id);
174 
175  $this->cont_member_skill_repo->publish($this->cont_obj_id, $user_id);
176 
177  return $changed;
178  }
179 
180  public function getPublished(int $user_id): bool
181  {
182  return $this->cont_member_skill_repo->getPublished($this->cont_obj_id, $user_id);
183  }
184 
189  {
190  $skill_levels = array_map(static function (ContainerMemberSkill $a): array {
191  return ["level_id" => $a->getLevelId(), "skill_id" => $a->getBaseSkillId(), "tref_id" => $a->getTrefId(),
192  "published" => $a->getPublished()];
193  }, $this->getMemberSkillsForContainer($user_id));
194 
195  $vtree = $this->tree_service->getGlobalVirtualSkillTree();
196  $skill_levels_ordered = $vtree->getOrderedNodeset($skill_levels, "skill_id", "tref_id");
197 
198  $skill_levels_obj_ordered = [];
199  foreach ($skill_levels_ordered as $s) {
200  $skill_levels_obj_ordered[] = $this->factory_service->containerSkill()->memberSkill(
201  $this->cont_obj_id,
202  $user_id,
203  $s["skill_id"],
204  $s["tref_id"],
205  $s["level_id"],
206  $s["published"]
207  );
208  }
209 
210  return $skill_levels_obj_ordered;
211  }
212 
216  public function getMemberSkillsForContainer(int $user_id): array
217  {
218  return $this->cont_member_skill_repo->getAll($this->cont_obj_id, $user_id);
219  }
220 
221  public function getMemberSkillLevel(int $user_id, int $skill_id, int $tref_id): ?int
222  {
223  return $this->cont_member_skill_repo->getLevel($this->cont_obj_id, $user_id, $skill_id, $tref_id);
224  }
225 
226 
230 
234  public function getSkillsForTableGUI(): array
235  {
236  // Get single and profile skills and DO NOT remove multiple occurrences when merging
237 
238  $skills = array_merge($this->getSingleSkills(), $this->getProfileSkills());
239 
240  $skills_as_array = [];
241  foreach ($skills as $s) {
242  $skills_as_array[] = [
243  "base_skill_id" => $s->getBaseSkillId(),
244  "tref_id" => $s->getTrefId(),
245  "title" => $s->getTitle(),
246  "profile_title" => ($s->getProfile()) ? $s->getProfile()->getTitle() : null
247  ];
248  }
249 
250  // order skills per virtual skill tree
251  $vtree = $this->tree_service->getGlobalVirtualSkillTree();
252  $skills = $vtree->getOrderedNodeset($skills_as_array, "base_skill_id", "tref_id");
253 
254  return $skills;
255  }
256 
260  public function getSkillsForPresentationGUI(): array
261  {
262  // Get single and profile skills and DO remove multiple occurrences when merging
263 
264  $s_skills = [];
265  foreach ($this->getSingleSkills() as $s) {
266  $s_skills[$s->getBaseSkillId() . "-" . $s->getTrefId()] = $s;
267  }
268 
269  $p_skills = [];
270  foreach ($this->getProfileSkills() as $ps) {
271  $p_skills[$ps->getBaseSkillId() . "-" . $ps->getTrefId()] = $ps;
272  }
273 
274  $skills = array_merge($s_skills, $p_skills);
275 
276  return $skills;
277  }
278 
282  protected function getSingleSkills(): array
283  {
284  $s_skills = array_map(function (ContainerSkill $v): ContainerSkill {
285  return $this->factory_service->containerSkill()->skill(
286  $v->getBaseSkillId(),
287  $v->getTrefId(),
290  );
291  }, $this->getSkillsForContainer());
292 
293  return $s_skills;
294  }
295 
299  protected function getProfileSkills(): array
300  {
301  $cont_member_role_id = \ilParticipants::getDefaultMemberRole($this->cont_ref_id);
302  $p_skills = [];
303  // Global skills
304  if ($this->skmg_settings->getLocalAssignmentOfProfiles()) {
305  foreach ($this->profile_service->getGlobalProfilesOfRole($cont_member_role_id) as $gp) {
306  $sklvs = $this->profile_service->getSkillLevels($gp->getId());
307  foreach ($sklvs as $s) {
308  $p_skills[] = $this->factory_service->containerSkill()->skill(
309  $s->getBaseSkillId(),
310  $s->getTrefId(),
312  \ilBasicSkill::_lookupTitle($s->getBaseSkillId(), $s->getTrefId()),
313  $gp
314  );
315  }
316  }
317  }
318 
319  // Local skills
320  if ($this->skmg_settings->getAllowLocalProfiles()) {
321  foreach ($this->profile_service->getLocalProfilesOfRole($cont_member_role_id) as $lp) {
322  $sklvs = $this->profile_service->getSkillLevels($lp->getId());
323  foreach ($sklvs as $s) {
324  $p_skills[] = $this->factory_service->containerSkill()->skill(
325  $s->getBaseSkillId(),
326  $s->getTrefId(),
328  \ilBasicSkill::_lookupTitle($s->getBaseSkillId(), $s->getTrefId()),
329  $lp
330  );
331  }
332  }
333  }
334 
335  return $p_skills;
336  }
337 }
ContainerMemberSkillDBRepository $cont_member_skill_repo
static _lookupTitle(int $a_obj_id, int $a_tref_id=0)
static removeAllUserSkillLevelStatusOfObject(int $a_user_id, int $a_trigger_obj_id, bool $a_self_eval=false, string $a_unique_identifier="")
static getDefaultMemberRole(int $a_ref_id)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
removeMemberSkillFromContainer(int $user_id, int $skill_id, int $tref_id)
addMemberSkillForContainer(int $user_id, int $skill_id, int $tref_id, int $level_id)
global $DIC
Definition: shib_login.php:22
static writeUserSkillLevelStatus(int $a_level_id, int $a_user_id, int $a_trigger_ref_id, int $a_tref_id=0, int $a_status=ilBasicSkill::ACHIEVED, bool $a_force=false, bool $a_self_eval=false, string $a_unique_identifier="", float $a_next_level_fulfilment=0.0, string $trigger_user_id="")
getMemberSkillLevel(int $user_id, int $skill_id, int $tref_id)
__construct(int $cont_obj_id, int $cont_ref_id, ?ContainerSkillDBRepository $cont_skill_repo=null, ?ContainerMemberSkillDBRepository $cont_member_skill_repo=null, ?SkillService\SkillTreeService $tree_service=null, ?SkillService\SkillProfileService $profile_service=null, ?SkillService\SkillPersonalService $personal_service=null, ?SkillInternalFactoryService $factory_service=null, ?\ilSkillManagementSettings $skmg_settings=null)
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples