Browse Source

WIP - Improve skill selection see BT#13586

jmontoyaa 7 years ago
parent
commit
dd489549ce
2 changed files with 111 additions and 53 deletions
  1. 79 23
      main/badge/assign.php
  2. 32 30
      main/inc/lib/skill.lib.php

+ 79 - 23
main/badge/assign.php

@@ -23,36 +23,23 @@ if (empty($userId)) {
 
 SkillManager::isAllow($userId);
 
+$user = api_get_user_entity($userId);
+
+if (!$user) {
+    api_not_allowed(true);
+}
+
 $entityManager = Database::getManager();
+$skillManager = new SkillManager();
 $skillRepo = $entityManager->getRepository('ChamiloCoreBundle:Skill');
 $skillRelSkill = $entityManager->getRepository('ChamiloCoreBundle:SkillRelSkill');
 $skillLevelRepo = $entityManager->getRepository('ChamiloSkillBundle:Level');
 $skillUserRepo = $entityManager->getRepository('ChamiloCoreBundle:SkillRelUser');
-$user = api_get_user_entity($userId);
-
-if (!$user) {
-    Display::addFlash(
-        Display::return_message(get_lang('NoUser'), 'error')
-    );
-
-    header('Location: '.api_get_path(WEB_PATH));
-    exit;
-}
 
 $skills = $skillRepo->findBy([
     'status' => Skill::STATUS_ENABLED
 ]);
 
-$url = api_get_path(WEB_CODE_PATH).'badge/assign.php?user='.$userId.'&id=';
-
-$htmlHeadXtra[] = '<script>
-$( document ).ready(function() {
-    $("#skill").on("change", function() {
-        $(location).attr("href", "'. $url.'"+$(this).val());
-    });
-});
-</script>';
-
 $skillsOptions = [];
 $acquiredLevel = [];
 $formDefaultValues = [];
@@ -61,8 +48,16 @@ foreach ($skills as $skill) {
     $skillsOptions[$skill->getId()] = $skill->getName();
 }
 
-$skillId = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : key($skillsOptions);
-$profile = $skillRepo->find($skillId)->getProfile();
+$skillIdFromGet = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0;
+$currentLevel = isset($_REQUEST['current']) ? (int) str_replace('assign_skill_sub_skill_id_', '', $_REQUEST['current']) : 0;
+$subSkillList = isset($_REQUEST['sub_skill_list']) ? explode(',', $_REQUEST['sub_skill_list']) : [];
+
+$skillId = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : key($skillsOptions);
+$skill = $skillRepo->find($skillId);
+$profile = false;
+if ($skill) {
+    $profile = $skill->getProfile();
+}
 
 if (!$profile) {
     $skillRelSkill = new SkillRelSkill();
@@ -102,7 +97,6 @@ if ($profile) {
         $profileId = key($profileLevel);
         $acquiredLevel[$profileId] = $profileLevel[$profileId];
     }
-
 }
 
 $formDefaultValues = ['skill' => $skillId];
@@ -111,6 +105,55 @@ $form = new FormValidator('assign_skill');
 $form->addHeader(get_lang('AssignSkill'));
 $form->addText('user_name', get_lang('UserName'), false);
 $form->addSelect('skill', get_lang('Skill'), $skillsOptions, ['id' => 'skill']);
+
+$newSubSkillList = [];
+if (!empty($skillIdFromGet)) {
+    if (empty($subSkillList)) {
+        $subSkillList[] = $skillIdFromGet;
+    }
+    $subSkillList = array_unique($subSkillList);
+    $oldSkill = $skillRepo->find($skillIdFromGet);
+    $counter = 0;
+    foreach ($subSkillList as $subSkillId) {
+        if ($skillIdFromGet == $subSkillId) {
+            //continue;
+        }
+
+        if (!empty($currentLevel)) {
+            if ($counter == $currentLevel) {
+                break;
+            }
+        }
+
+        $children = $skillManager->getChildren($subSkillId);
+
+        /*$oldSkill = $skillManager->getDirectParents($subSkillId);
+        $oldSkill = $oldSkill[0];*/
+
+        if (isset($subSkillList[$counter-1])) {
+            $oldSkill = $skillRepo->find($subSkillList[$counter]);
+        }
+
+        $skillsOptions = [$oldSkill->getId() => ' -- '.$oldSkill->getName()];
+        foreach ($children as $child) {
+            $skillsOptions[$child['id']] = $child['data']['name'];
+        }
+        $form->addSelect('sub_skill_id_'.$counter, get_lang('SubSkill'), $skillsOptions, ['class' => 'sub_skill']);
+
+        if (isset($subSkillList[$counter+1])) {
+            $nextSkill = $skillRepo->find($subSkillList[$counter+1]);
+            $formDefaultValues['sub_skill_id_'.$counter] = $nextSkill->getId();
+        }
+        $newSubSkillList[] = $subSkillId;
+        $counter++;
+    }
+    $subSkillList = $newSubSkillList;
+}
+var_dump($formDefaultValues);
+
+$subSkillListToString = implode(',', $subSkillList);
+$form->addHidden('sub_skill_list', $subSkillListToString);
+
 $form->addHidden('user', $user->getId());
 $form->addHidden('id', $skillId);
 $form->addRule('skill', get_lang('ThisFieldIsRequired'), 'required');
@@ -223,6 +266,19 @@ if (api_is_drh()) {
     );
 }
 
+$url = api_get_path(WEB_CODE_PATH).'badge/assign.php?user='.$userId.'&id='.$skillIdFromGet;
+
+$htmlHeadXtra[] = '<script>
+$( document ).ready(function() {
+    $("#skill").on("change", function() {
+        $(location).attr("href", "'. $url.'"+$(this).val());
+    });
+    $(".sub_skill").on("change", function() {
+        $(location).attr("href", "'.$url.'&current="+$(this).attr("id")+"&sub_skill_list='.$subSkillListToString.',"+$(this).val());
+    });
+});
+</script>';
+
 $template = new Template(get_lang('AddSkill'));
 $template->assign('content', $form->returnForm());
 $template->display_one_col_template();

+ 32 - 30
main/inc/lib/skill.lib.php

@@ -766,12 +766,12 @@ class Skill extends Model
      */
     public function getChildren($skill_id, $load_user_data = false)
     {
-        $skill_rel_skill = new SkillRelSkill();
+        $skillRelSkill = new SkillRelSkill();
         if ($load_user_data) {
             $user_id = api_get_user_id();
-            $skills = $skill_rel_skill->getChildren($skill_id, true, $user_id);
+            $skills = $skillRelSkill->getChildren($skill_id, true, $user_id);
         } else {
-            $skills = $skill_rel_skill->getChildren($skill_id);
+            $skills = $skillRelSkill->getChildren($skill_id);
         }
         return $skills;
     }
@@ -783,8 +783,8 @@ class Skill extends Model
      */
     public function getAllChildren($skillId)
     {
-        $skill_rel_skill = new SkillRelSkill();
-        $children = $skill_rel_skill->getChildren($skillId);
+        $skillRelSkill = new SkillRelSkill();
+        $children = $skillRelSkill->getChildren($skillId);
         foreach ($children as $child) {
             $subChildren = $this->getAllChildren($child['skill_id']);
         }
@@ -799,10 +799,10 @@ class Skill extends Model
     /**
      * Gets all parents from from the wanted skill
      */
-    public function get_parents($skill_id)
+    public function get_parents($skillId)
     {
-        $skill_rel_skill = new SkillRelSkill();
-        $skills = $skill_rel_skill->getSkillParents($skill_id, true);
+        $skillRelSkill = new SkillRelSkill();
+        $skills = $skillRelSkill->getSkillParents($skillId, true);
         foreach ($skills as &$skill) {
             $skill['data'] = self::get($skill['skill_id']);
         }
@@ -811,14 +811,16 @@ class Skill extends Model
 
     /**
      * All direct parents
+     * @param int $skillId
+     * @return int
      */
-    public function getDirectParents($skill_id)
+    public function getDirectParents($skillId)
     {
-        $skill_rel_skill = new SkillRelSkill();
-        $skills = $skill_rel_skill->getDirectParents($skill_id, true);
+        $skillRelSkill = new SkillRelSkill();
+        $skills = $skillRelSkill->getDirectParents($skillId, true);
         foreach ($skills as &$skill) {
             $skill['data'] = self::get($skill['skill_id']);
-            $skill_info2 = $skill_rel_skill->getSkillInfo($skill['skill_id']);
+            $skill_info2 = $skillRelSkill->getSkillInfo($skill['skill_id']);
             $skill['data']['parent_id'] = $skill_info2['parent_id'];
         }
         return $skills;
@@ -839,15 +841,15 @@ class Skill extends Model
             $params['parent_id'] = array($params['parent_id']);
         }
 
-        $skill_rel_skill = new SkillRelSkill();
-        $skill_rel_gradebook = new SkillRelGradebook();
+        $skillRelSkill = new SkillRelSkill();
+        $skillRelGradebook = new SkillRelGradebook();
 
         // Saving name, description
         $skill_id = $this->save($params);
         if ($skill_id) {
             //Saving skill_rel_skill (parent_id, relation_type)
             foreach ($params['parent_id'] as $parent_id) {
-                $relation_exists = $skill_rel_skill->relationExists($skill_id, $parent_id);
+                $relation_exists = $skillRelSkill->relationExists($skill_id, $parent_id);
                 if (!$relation_exists) {
                     $attributes = array(
                         'skill_id' => $skill_id,
@@ -855,7 +857,7 @@ class Skill extends Model
                         'relation_type' => (isset($params['relation_type']) ? $params['relation_type'] : 0),
                         //'level'         => $params['level'],
                     );
-                    $skill_rel_skill->save($attributes);
+                    $skillRelSkill->save($attributes);
                 }
             }
 
@@ -864,7 +866,7 @@ class Skill extends Model
                     $attributes = array();
                     $attributes['gradebook_id'] = $gradebook_id;
                     $attributes['skill_id'] = $skill_id;
-                    $skill_rel_gradebook->save($attributes);
+                    $skillRelGradebook->save($attributes);
                 }
             }
             return $skill_id;
@@ -918,16 +920,16 @@ class Skill extends Model
     {
         /*$params = array('skill_id' => $skill_id);
 
-        $skill_rel_skill     = new SkillRelSkill();
-        $skills = $skill_rel_skill->get_all(array('where'=>array('skill_id = ?' =>$skill_id)));
+        $skillRelSkill     = new SkillRelSkill();
+        $skills = $skillRelSkill->get_all(array('where'=>array('skill_id = ?' =>$skill_id)));
 
         $skill_rel_profile     = new SkillRelProfile();
-        $skill_rel_gradebook = new SkillRelGradebook();
+        $skillRelGradebook = new SkillRelGradebook();
         $skill_rel_user     = new SkillRelUser();
 
         $this->delete($skill_id);
 
-        $skill_rel_gradebook->delete($params);*/
+        $skillRelGradebook->delete($params);*/
     }
 
     /**
@@ -939,8 +941,8 @@ class Skill extends Model
         if (!isset($params['parent_id'])) {
             $params['parent_id'] = 1;
         }
-        $skill_rel_skill = new SkillRelSkill();
-        $skill_rel_gradebook = new SkillRelGradebook();
+        $skillRelSkill = new SkillRelSkill();
+        $skillRelGradebook = new SkillRelGradebook();
 
         //Saving name, description
         $this->update($params);
@@ -955,7 +957,7 @@ class Skill extends Model
             }
 
             foreach ($params['parent_id'] as $parent_id) {
-                $relation_exists = $skill_rel_skill->relationExists($skill_id, $parent_id);
+                $relation_exists = $skillRelSkill->relationExists($skill_id, $parent_id);
                 if (!$relation_exists) {
                     $attributes = array(
                         'skill_id' => $skill_id,
@@ -963,11 +965,11 @@ class Skill extends Model
                         'relation_type' => $params['relation_type'],
                         //'level'         => $params['level'],
                     );
-                    $skill_rel_skill->updateBySkill($attributes);
+                    $skillRelSkill->updateBySkill($attributes);
                 }
             }
 
-            $skill_rel_gradebook->updateGradeBookListBySkill(
+            $skillRelGradebook->updateGradeBookListBySkill(
                 $skill_id,
                 $params['gradebook_id']
             );
@@ -1369,19 +1371,19 @@ class Skill extends Model
     }
 
     /**
-     * @param int $skill_id
+     * @param int $skillId
      * @return array
      */
-    public function getCoursesBySkill($skill_id)
+    public function getCoursesBySkill($skillId)
     {
-        $skill_id = intval($skill_id);
+        $skillId = intval($skillId);
         $sql = "SELECT c.title, c.code
                 FROM {$this->table_gradebook} g
                 INNER JOIN {$this->table_skill_rel_gradebook} sg
                 ON g.id = sg.gradebook_id
                 INNER JOIN {$this->table_course} c
                 ON c.code = g.course_code
-                WHERE sg.skill_id = $skill_id
+                WHERE sg.skill_id = $skillId
                 AND (g.session_id IS NULL OR g.session_id = 0)";
         $result = Database::query($sql);