Browse Source

Merge branch '1.11.x' of github.com:chamilo/chamilo-lms into 1.11.x

Julio 7 years ago
parent
commit
fea989db79

+ 10 - 2
main/admin/skill_edit.php

@@ -61,8 +61,16 @@ foreach ($allGradebooks as $gradebook) {
 /* Form */
 $editForm = new FormValidator('skill_edit');
 $editForm->addHeader(get_lang('SkillEdit'));
-$editForm->addText('name', get_lang('Name'), true, ['id' => 'name']);
-$editForm->addText('short_code', get_lang('ShortCode'), false, ['id' => 'short_code']);
+
+$translateNameUrl = api_get_path(WEB_CODE_PATH).'admin/skill_translate.php?'
+    .http_build_query(['skill' => $skillId, 'action' => 'name']);
+$translateCodeUrl = api_get_path(WEB_CODE_PATH).'admin/skill_translate.php?'
+    .http_build_query(['skill' => $skillId, 'action' => 'code']);
+$translateNameButton = Display::toolbarButton(get_lang('TranslateThisTerm'), $translateNameUrl, 'language', 'link');
+$translateCodeButton = Display::toolbarButton(get_lang('TranslateThisTerm'), $translateCodeUrl, 'language', 'link');
+
+$editForm->addText('name', [get_lang('Name'), $translateNameButton], true, ['id' => 'name']);
+$editForm->addText('short_code', [get_lang('ShortCode'), $translateCodeButton], false, ['id' => 'short_code']);
 $editForm->addSelect('parent_id', get_lang('Parent'), $skillList, ['id' => 'parent_id']);
 $editForm->addSelect(
     'gradebook_id',

+ 101 - 0
main/admin/skill_translate.php

@@ -0,0 +1,101 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+use \Chamilo\CoreBundle\Entity\ExtraField;
+use Chamilo\CoreBundle\Entity\Skill;
+use Chamilo\CoreBundle\Entity\Language;
+
+$cidReset = true;
+
+require_once __DIR__.'/../inc/global.inc.php';
+
+api_protect_admin_script();
+
+$em = Database::getManager();
+
+$skill = null;
+$extraFieldOption = null;
+$variableLanguage = null;
+$originalName = null;
+$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'name';
+
+if (isset($_GET['skill'])) {
+    /** @var Skill $skill */
+    $skill = $em->find('ChamiloCoreBundle:Skill', intval($_GET['skill']));
+
+    if ($action === 'name') {
+        $variableLanguage = '$Skill'.api_underscore_to_camel_case(
+            str_replace(' ', '_', $skill->getName(false))
+        );
+        $originalName = $skill->getName(false);
+    } elseif ($action === 'code') {
+        $variableLanguage = '$SkillCode'.api_underscore_to_camel_case(
+            str_replace(' ', '_', $skill->getShortCode(false))
+        );
+        $originalName = $skill->getShortCode(false);
+    }
+}
+
+if (!$skill || empty($variableLanguage)) {
+    api_not_allowed(true);
+}
+
+if (empty($originalName)) {
+    Display::addFlash(
+        Display::return_message(get_lang('CanNotTranslate'), 'error')
+    );
+    header('Location: '.api_get_path(WEB_CODE_PATH).'admin/skill_edit.php?id='.$skill->getId());
+    exit;
+}
+
+$languageId = isset($_GET['sub_language']) ? intval($_GET['sub_language']) : 0;
+
+$languages = $em
+    ->getRepository('ChamiloCoreBundle:Language')
+    ->findAllPlatformSubLanguages();
+
+$languagesOptions = [0 => get_lang('None')];
+
+/** @var Language $language */
+foreach ($languages as $language) {
+    $languagesOptions[$language->getId()] = $language->getOriginalName();
+}
+
+$translateUrl = api_get_path(WEB_CODE_PATH).'admin/sub_language_ajax.inc.php?skill='.$skill->getId();
+
+$form = new FormValidator('new_lang_variable', 'POST', $translateUrl);
+$form->addHeader(get_lang('AddWordForTheSubLanguage'));
+$form->addText('variable_language', get_lang('LanguageVariable'), false);
+$form->addText('original_name', get_lang('OriginalName'), false);
+$form->addSelect('sub_language', [get_lang('SubLanguage'), get_lang('OnlyActiveSubLanguagesAreListed')], $languagesOptions);
+
+if ($languageId) {
+    $languageInfo = api_get_language_info($languageId);
+
+    $form->addText('new_language', [get_lang('Translation'), get_lang('IfThisTranslationExistsThisWillReplaceTheTerm')]);
+    $form->addHidden('file_id', 0);
+    $form->addHidden('id', $languageInfo['parent_id']);
+    $form->addHidden('sub', $languageInfo['id']);
+    $form->addHidden('sub_language_id', $languageInfo['id']);
+    $form->addHidden('redirect', true);
+    $form->addButtonSave(get_lang('Save'));
+}
+
+$form->setDefaults([
+    'variable_language' => $variableLanguage,
+    'original_name' => $originalName,
+    'sub_language' => $languageId,
+    'new_language' => $action === 'code' ? $skill->getShortCode() : $skill->getName()
+]);
+$form->addRule('sub_language', get_lang('Required'), 'required');
+$form->freeze(['variable_language', 'original_name']);
+
+$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
+$interbreadcrumb[] = ['url' => 'skill_list.php', 'name' => get_lang('ManageSkills')];
+
+$view = new Template(get_lang('AddWordForTheSubLanguage'));
+$view->assign('form', $form->returnForm());
+$template = $view->get_template('extrafield/translate.tpl');
+$content = $view->fetch($template);
+$view->assign('content', $content);
+$view->display_one_col_template();

+ 31 - 19
main/admin/sub_language_ajax.inc.php

@@ -46,27 +46,39 @@ if (isset($new_language) && isset($language_variable) && isset($file_id)) {
         }
     }
 
-    if (isset($_REQUEST['redirect'], $_REQUEST['extra_field_type'])) {
-        Display::addFlash(
-            Display::return_message(get_lang('TheNewWordHasBeenAdded'), 'success')
-        );
-
-        $redirectUrl = api_get_path(WEB_CODE_PATH).'admin/extra_fields.php?type=';
-
-        switch ($_REQUEST['extra_field_type']) {
-            case ExtraField::USER_FIELD_TYPE:
-                $redirectUrl .= 'user';
-                break;
-            case ExtraField::COURSE_FIELD_TYPE:
-                $redirectUrl .= 'course';
-                break;
-            case ExtraField::SESSION_FIELD_TYPE:
-                $redirectUrl .= 'session';
-                break;
+    if (isset($_REQUEST['redirect'])) {
+        $message = Display::return_message(get_lang('TheNewWordHasBeenAdded'), 'success');
+
+        if (!empty($variables_with_problems)) {
+            Display::return_message(
+                $path_folder.' '.get_lang('IsNotWritable').'<br /> '.api_ucwords(get_lang('ErrorsFound'))
+                    .': <br />'.$variables_with_problems,
+                'error'
+            );
         }
 
-        header("Location: $redirectUrl");
-        exit;
+        Display::addFlash($message);
+
+        if (isset($_REQUEST['extra_field_type'])) {
+            $redirectUrl = api_get_path(WEB_CODE_PATH).'admin/extra_fields.php';
+
+            switch ($_REQUEST['extra_field_type']) {
+                case ExtraField::USER_FIELD_TYPE:
+                    header("Location: {$redirectUrl}?type=user");
+                    exit;
+                case ExtraField::COURSE_FIELD_TYPE:
+                    header("Location: {$redirectUrl}?type=course");
+                    exit;
+                case ExtraField::SESSION_FIELD_TYPE:
+                    header("Location: {$redirectUrl}?type=session");
+                    exit;
+            }
+        }
+
+        if (isset($_REQUEST['skill'])) {
+            header('Location: '.api_get_path(WEB_CODE_PATH).'admin/skill_list.php');
+            exit;
+        }
     }
 
     if (!empty($variables_with_problems)) {

+ 1 - 0
main/inc/ajax/skill.ajax.php

@@ -138,6 +138,7 @@ switch ($action) {
         echo $html;
         break;
     case 'get_skills_tree_json':
+        header('Content-Type: application/json');
         $userId = isset($_REQUEST['load_user']) && $_REQUEST['load_user'] == 1 ? api_get_user_id() : 0;
         $skill_id = isset($_REQUEST['skill_id']) ? intval($_REQUEST['skill_id']) : 0;
         $depth = isset($_REQUEST['main_depth']) ? intval($_REQUEST['main_depth']) : 2;

+ 13 - 0
main/inc/lib/diagnoser.lib.php

@@ -452,6 +452,19 @@ class Diagnoser
             get_lang('UploadMaxFilesizeInfo')
         );
 
+        $setting = ini_get('upload_tmp_dir');
+        $status = self::STATUS_OK;
+        $array[] = $this->build_setting(
+            $status,
+            '[INI]',
+            'upload_tmp_dir',
+            'http://www.php.net/manual/en/ini.core.php#ini.upload_tmp_dir',
+            $setting,
+            '',
+            null,
+            get_lang('UploadTmpDirInfo')
+        );
+
         $setting = ini_get('variables_order');
         $req_setting = 'GPCS';
         $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_ERROR;

+ 5 - 3
main/inc/lib/sessionmanager.lib.php

@@ -5386,7 +5386,7 @@ class SessionManager
                         WHERE id = '$session_id'";
                 Database::query($sql);
 
-                self::addClassesByName($session_id, $classes);
+                self::addClassesByName($session_id, $classes, false);
             }
         }
 
@@ -5401,8 +5401,9 @@ class SessionManager
      * Add classes (by their names) to a session
      * @param int $sessionId
      * @param array $classesNames
+     * @param bool $deleteClassSessions Optional. Empty the session list for the usergroup (class)
      */
-    private static function addClassesByName($sessionId, $classesNames)
+    private static function addClassesByName($sessionId, $classesNames, $deleteClassSessions = true)
     {
         if (!$classesNames) {
             return;
@@ -5413,7 +5414,8 @@ class SessionManager
         foreach ($classesNames as $className) {
             $usergroup->subscribe_sessions_to_usergroup(
                 $usergroup->get_id_by_name($className),
-                [$sessionId]
+                [$sessionId],
+                $deleteClassSessions
             );
         }
     }

+ 54 - 8
main/inc/lib/skill.lib.php

@@ -657,6 +657,8 @@ class Skill extends Model
         $result['img_mini'] = Display::img($iconBig, $result['name'], ['width' => ICON_SIZE_MEDIUM]);
         $result['img_big'] = Display::img($iconBig, $result['name']);
         $result['img_small'] = Display::img($iconSmall, $result['name']);
+        $result['name'] = self::translateName($result['name']);
+        $result['short_code'] = self::translateCode($result['short_code']);
 
         return $result;
     }
@@ -734,20 +736,22 @@ class Skill extends Model
                 WHERE id IN ('$skill_list') ";
 
         $result = Database::query($sql);
-        $users  = Database::store_result($result, 'ASSOC');
+        $skills  = Database::store_result($result, 'ASSOC');
 
-        foreach ($users as &$user) {
-            if (!$user['icon']) {
+        foreach ($skills as &$skill) {
+            if (!$skill['icon']) {
                 continue;
             }
 
-            $user['icon_small'] = sprintf(
+            $skill['icon_small'] = sprintf(
                 "badges/%s-small.png",
-                sha1($user['name'])
+                sha1($skill['name'])
             );
+            $skill['name'] = self::translateName($skill['name']);
+            $skill['short_code'] = self::translateCode($skill['short_code']);
         }
 
-        return $users;
+        return $skills;
     }
 
     /**
@@ -797,6 +801,8 @@ class Skill extends Model
         $webPath = api_get_path(WEB_UPLOAD_PATH);
         if (Database::num_rows($result)) {
             while ($row = Database::fetch_array($result, 'ASSOC')) {
+                $row['name'] = self::translateName($row['name']);
+                $row['short_code'] = self::translateCode($row['short_code']);
                 $skillRelSkill = new SkillRelSkill();
                 $parents = $skillRelSkill->getSkillParents($row['id']);
                 $row['level'] = count($parents) - 1;
@@ -1018,6 +1024,9 @@ class Skill extends Model
         if (!isset($params['parent_id'])) {
             $params['parent_id'] = 1;
         }
+
+        $params['gradebook_id'] = isset($params['gradebook_id']) ? $params['gradebook_id'] : [];
+
         $skillRelSkill = new SkillRelSkill();
         $skillRelGradebook = new SkillRelGradebook();
 
@@ -1147,7 +1156,7 @@ class Skill extends Model
 
             $tableRow = array(
                 'skill_badge' => $resultData['img_mini'],
-                'skill_name' => $resultData['name'],
+                'skill_name' => Skill::translate($resultData['name']),
                 'achieved_at' => api_get_local_time($resultData['acquired_skill_at']),
                 'course_image' => '',
                 'course_name' => ''
@@ -1704,6 +1713,7 @@ class Skill extends Model
         $result = Database::query($sql);
 
         while ($row = Database::fetch_assoc($result)) {
+            $row['skill_name'] = self::translateName($row['skill_name']);
             $list[] = $row;
         }
 
@@ -1747,6 +1757,7 @@ class Skill extends Model
 
         $result = Database::query($sql);
         while ($row = Database::fetch_assoc($result)) {
+            $row['skill_name'] = self::translateName($row['skill_name']);
             $list[] = $row;
         }
 
@@ -1931,6 +1942,41 @@ class Skill extends Model
 
         $result = Database::query($sql);
 
-        return Database::store_result($result, 'ASSOC');
+        $skills = [];
+
+        foreach ($result as $item) {
+            $skills[] = [
+                'name' => self::translateName($item['name']),
+                'acquired_skill_at' => $item['acquired_skill_at']
+            ];
+        }
+
+        return $skills;
+    }
+
+    /**
+     * @param string $name
+     * @return string
+     */
+    public static function translateName($name)
+    {
+        $camelCase = 'Skill'.api_underscore_to_camel_case(
+            str_replace(' ', '_', $name)
+        );
+
+        return isset($GLOBALS[$camelCase]) ? $GLOBALS[$camelCase] : $name;
+    }
+
+    public static function translateCode($code)
+    {
+        if (empty($code)) {
+            return '';
+        }
+
+        $camelCase = 'SkillCode'.api_underscore_to_camel_case(
+            str_replace(' ', '_', $code)
+        );
+
+        return isset($GLOBALS[$camelCase]) ? $GLOBALS[$camelCase] : $code;
     }
 }

+ 21 - 18
main/inc/lib/usergroup.lib.php

@@ -629,10 +629,11 @@ class UserGroup extends Model
 
     /**
      * Subscribes sessions to a group  (also adding the members of the group in the session and course)
-     * @param   int   $usergroup_id  usergroup id
-     * @param   array  $list list of session ids
+     * @param   int $usergroup_id usergroup id
+     * @param   array $list list of session ids
+     * @param bool $deleteCurrentSessions Optional. Empty the session list for the usergroup (class)
      */
-    public function subscribe_sessions_to_usergroup($usergroup_id, $list)
+    public function subscribe_sessions_to_usergroup($usergroup_id, $list, $deleteCurrentSessions = true)
     {
         $current_list = self::get_sessions_by_usergroup($usergroup_id);
         $user_list = self::get_users_by_usergroup($usergroup_id);
@@ -645,26 +646,28 @@ class UserGroup extends Model
                 }
             }
         }
-        if (!empty($current_list)) {
-            foreach ($current_list as $session_id) {
-                if (!in_array($session_id, $list)) {
-                    $delete_items[] = $session_id;
+        if ($deleteCurrentSessions) {
+            if (!empty($current_list)) {
+                foreach ($current_list as $session_id) {
+                    if (!in_array($session_id, $list)) {
+                        $delete_items[] = $session_id;
+                    }
                 }
             }
-        }
 
-        // Deleting items
-        if (!empty($delete_items)) {
-            foreach ($delete_items as $session_id) {
-                if (!empty($user_list)) {
-                    foreach ($user_list as $user_id) {
-                        SessionManager::unsubscribe_user_from_session($session_id, $user_id);
+            // Deleting items
+            if (!empty($delete_items)) {
+                foreach ($delete_items as $session_id) {
+                    if (!empty($user_list)) {
+                        foreach ($user_list as $user_id) {
+                            SessionManager::unsubscribe_user_from_session($session_id, $user_id);
+                        }
                     }
+                    Database::delete(
+                        $this->usergroup_rel_session_table,
+                        array('usergroup_id = ? AND session_id = ?' => array($usergroup_id, $session_id))
+                    );
                 }
-                Database::delete(
-                    $this->usergroup_rel_session_table,
-                    array('usergroup_id = ? AND session_id = ?' => array($usergroup_id, $session_id))
-                );
             }
         }
 

+ 1 - 1
main/social/my_skills_report.php

@@ -61,7 +61,7 @@ if ($isStudent) {
         while ($resultData = Database::fetch_assoc($result)) {
             $tableRow = array(
                 'completeName' => $followedStudents[$selectedStudent]['completeName'],
-                'skillName' => $resultData['name'],
+                'skillName' => Skill::translateName($resultData['name']),
                 'achievedAt' => api_format_date($resultData['acquired_skill_at'], DATE_FORMAT_NUMBER),
                 'courseImage' => Display::return_icon(
                     'course.png',

+ 20 - 2
src/Chamilo/CoreBundle/Entity/Skill.php

@@ -118,10 +118,19 @@ class Skill
     /**
      * Get name
      *
+     * @param bool $translated Optional. Get the name translated when is it exists in a sub-language. By default is true
      * @return string
      */
-    public function getName()
+    public function getName($translated = true)
     {
+        if ($translated) {
+            $camelCase = 'Skill'.api_underscore_to_camel_case(
+                str_replace(' ', '_', $this->name)
+            );
+
+            return isset($GLOBALS[$camelCase]) ? $GLOBALS[$camelCase] : $this->name;
+        }
+
         return $this->name;
     }
 
@@ -141,10 +150,19 @@ class Skill
     /**
      * Get shortCode
      *
+     * @param bool $translated Optional. Get the code translated when is it exists in a sub-language. By default is true
      * @return string
      */
-    public function getShortCode()
+    public function getShortCode($translated = true)
     {
+        if ($translated && !empty($this->shortCode)) {
+            $camelCase = 'SkillCode'.api_underscore_to_camel_case(
+                str_replace(' ', '_', $this->shortCode)
+            );
+
+            return isset($GLOBALS[$camelCase]) ? $GLOBALS[$camelCase] : $this->shortCode;
+        }
+
         return $this->shortCode;
     }