diff --git a/main/admin/skill_edit.php b/main/admin/skill_edit.php index 9813c9652f..cf64d6721f 100644 --- a/main/admin/skill_edit.php +++ b/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', diff --git a/main/admin/skill_translate.php b/main/admin/skill_translate.php new file mode 100644 index 0000000000..342876cb52 --- /dev/null +++ b/main/admin/skill_translate.php @@ -0,0 +1,101 @@ +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(); diff --git a/main/admin/sub_language_ajax.inc.php b/main/admin/sub_language_ajax.inc.php index 9288599fdf..bfc7be3ea0 100755 --- a/main/admin/sub_language_ajax.inc.php +++ b/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').'
'.api_ucwords(get_lang('ErrorsFound')) + .':
'.$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)) { diff --git a/main/inc/ajax/skill.ajax.php b/main/inc/ajax/skill.ajax.php index 203a2c533f..eaf32b8208 100755 --- a/main/inc/ajax/skill.ajax.php +++ b/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; diff --git a/main/inc/lib/diagnoser.lib.php b/main/inc/lib/diagnoser.lib.php index f3802837f4..aa0c3caf42 100755 --- a/main/inc/lib/diagnoser.lib.php +++ b/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; diff --git a/main/inc/lib/sessionmanager.lib.php b/main/inc/lib/sessionmanager.lib.php index d26ee4ca08..b16e69d7f2 100755 --- a/main/inc/lib/sessionmanager.lib.php +++ b/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 ); } } diff --git a/main/inc/lib/skill.lib.php b/main/inc/lib/skill.lib.php index 8a7353e4b1..e67e083460 100755 --- a/main/inc/lib/skill.lib.php +++ b/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; } } diff --git a/main/inc/lib/usergroup.lib.php b/main/inc/lib/usergroup.lib.php index 7997795ad5..2f0c028d0a 100755 --- a/main/inc/lib/usergroup.lib.php +++ b/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)) - ); } } diff --git a/main/social/my_skills_report.php b/main/social/my_skills_report.php index 7fafb4c390..2056333572 100644 --- a/main/social/my_skills_report.php +++ b/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', diff --git a/src/Chamilo/CoreBundle/Entity/Skill.php b/src/Chamilo/CoreBundle/Entity/Skill.php index acd05c5124..329efe47c6 100644 --- a/src/Chamilo/CoreBundle/Entity/Skill.php +++ b/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; }