Merge pull request #3466 from lcubas/2807

WIP: Migrations: Change relationships in entities Course and CourseCategoRy and create migration course_rel_category
pull/3464/head
Julio Montoya 5 years ago committed by GitHub
commit 0d12296e6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 42
      public/main/admin/course_add.php
  2. 67
      public/main/admin/course_edit.php
  3. 31
      public/main/admin/course_list.php
  4. 4
      public/main/inc/ajax/course.ajax.php
  5. 35
      public/main/inc/lib/add_course.lib.inc.php
  6. 11
      public/main/inc/lib/api.lib.php
  7. 109
      public/main/inc/lib/course_category.lib.php
  8. 1
      public/main/inc/lib/database.constants.inc.php
  9. 42
      src/CoreBundle/Entity/Course.php
  10. 2
      src/CoreBundle/Entity/CourseCategory.php
  11. 60
      src/CoreBundle/Repository/CourseCategoryRepository.php
  12. 45
      src/Migrations/Version20200821224242.php

@ -55,40 +55,16 @@ $form->addText(
$form->applyFilter('visual_code', 'api_strtoupper'); $form->applyFilter('visual_code', 'api_strtoupper');
$form->applyFilter('visual_code', 'html_filter'); $form->applyFilter('visual_code', 'html_filter');
$form->addSelectAjax(
$countCategories = $courseCategoriesRepo->countAllInAccessUrl( 'course_categories',
$accessUrlId, get_lang('Categories'),
api_get_configuration_value('allow_base_course_category') null,
[
'url' => api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=search_category',
'multiple' => 'multiple',
]
); );
if ($countCategories >= 100) {
// Category code
$url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=search_category';
$form->addElement(
'select_ajax',
'category_id',
get_lang('Category'),
null,
['url' => $url]
);
} else {
$categories = $courseCategoriesRepo->findAllInAccessUrl(
$accessUrlId,
api_get_configuration_value('allow_base_course_category')
);
$categoriesOptions = [0 => get_lang('None')];
/** @var CourseCategory $category */
foreach ($categories as $category) {
$categoriesOptions[$category->getId()] = (string) $category;
}
$form->addSelect(
'category_id',
get_lang('Category'),
$categoriesOptions
);
}
$form->addRule( $form->addRule(
'visual_code', 'visual_code',
get_lang('max. 20 characters, e.g. <i>INNOV21</i>'), get_lang('max. 20 characters, e.g. <i>INNOV21</i>'),
@ -227,8 +203,6 @@ if ($form->validate()) {
$course['teachers'] = $course_teachers; $course['teachers'] = $course_teachers;
$course['wanted_code'] = $course['visual_code']; $course['wanted_code'] = $course['visual_code'];
$course['gradebook_model_id'] = isset($course['gradebook_model_id']) ? $course['gradebook_model_id'] : null; $course['gradebook_model_id'] = isset($course['gradebook_model_id']) ? $course['gradebook_model_id'] : null;
// Fixing category code
$course['category_id'] = isset($course['category_id']) ? (int) $course['category_id'] : '';
include_once api_get_path(SYS_CODE_PATH).'lang/english/trad4all.inc.php'; include_once api_get_path(SYS_CODE_PATH).'lang/english/trad4all.inc.php';
$file_to_include = api_get_path(SYS_CODE_PATH).'lang/'.$course['course_language'].'/trad4all.inc.php'; $file_to_include = api_get_path(SYS_CODE_PATH).'lang/'.$course['course_language'].'/trad4all.inc.php';

@ -6,6 +6,7 @@ use Chamilo\CoreBundle\Entity\CourseCategory;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Repository\CourseCategoryRepository; use Chamilo\CoreBundle\Repository\CourseCategoryRepository;
use Chamilo\CoreBundle\Repository\CourseRepository; use Chamilo\CoreBundle\Repository\CourseRepository;
use Chamilo\CoreBundle\Framework\Container;
$cidReset = true; $cidReset = true;
@ -16,11 +17,8 @@ api_protect_admin_script();
$course_table = Database::get_main_table(TABLE_MAIN_COURSE); $course_table = Database::get_main_table(TABLE_MAIN_COURSE);
$em = Database::getManager(); $em = Database::getManager();
/** @var CourseRepository $courseRepo */ $courseCategoriesRepo = Container::getCourseCategoryRepository();
$courseRepo = $em->getRepository('ChamiloCoreBundle:CourseCategory');
/** @var CourseCategoryRepository $courseCategoriesRepo */
$courseCategoriesRepo = $em->getRepository('ChamiloCoreBundle:CourseCategory');
// Get all possible teachers.
$urlId = api_get_current_access_url_id(); $urlId = api_get_current_access_url_id();
$courseId = isset($_GET['id']) ? $_GET['id'] : null; $courseId = isset($_GET['id']) ? $_GET['id'] : null;
@ -146,44 +144,31 @@ $form->addText(
$form->applyFilter('visual_code', 'strtoupper'); $form->applyFilter('visual_code', 'strtoupper');
$form->applyFilter('visual_code', 'html_filter'); $form->applyFilter('visual_code', 'html_filter');
$countCategories = $courseCategoriesRepo->countAllInAccessUrl( $categories = $courseCategoriesRepo->getCategoriesByCourseIdAndAccessUrlId(
$urlId, $urlId,
$courseId,
api_get_configuration_value('allow_base_course_category') api_get_configuration_value('allow_base_course_category')
); );
if ($countCategories >= 100) {
// Category code
$url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=search_category';
$categorySelect = $form->addSelectAjax(
'category_id',
get_lang('Category'),
null,
['url' => $url]
);
if (!empty($courseInfo['categoryCode'])) { $courseCategoryNames = [];
$data = \CourseCategory::getCategory($courseInfo['categoryCode']); $courseCategoryIds = [];
$categorySelect->addOption($data['name'], $data['code']);
}
} else {
$categories = $courseCategoriesRepo->findAllInAccessUrl(
$urlId,
api_get_configuration_value('allow_base_course_category')
);
$categoriesOptions = [0 => get_lang('None')];
/** @var CourseCategory $category */
foreach ($categories as $category) {
$categoriesOptions[$category->getId()] = (string) $category;
}
$form->addSelect( foreach ($categories as $category) {
'category_id', $courseCategoryNames[$category->getId()] = $category->getName();
get_lang('Category'), $courseCategoryIds[] = $category->getId();
$categoriesOptions
);
} }
$form->addSelectAjax(
'course_categories',
get_lang('Categories'),
$courseCategoryNames,
[
'url' => api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=search_category',
'multiple' => 'multiple'
]
);
$courseInfo['course_categories'] = $courseCategoryIds;
$courseTeacherNames = []; $courseTeacherNames = [];
foreach ($course_teachers as $courseTeacherId) { foreach ($course_teachers as $courseTeacherId) {
@ -355,18 +340,12 @@ if ($form->validate()) {
} }
$teachers = isset($course['course_teachers']) ? $course['course_teachers'] : ''; $teachers = isset($course['course_teachers']) ? $course['course_teachers'] : '';
$categoryId = isset($course['category_id']) && !empty($course['category_id']) ? (int) $course['category_id'] : null;
$department_url = $course['department_url']; $department_url = $course['department_url'];
if (!stristr($department_url, 'http://')) { if (!stristr($department_url, 'http://')) {
$department_url = 'http://'.$department_url; $department_url = 'http://'.$department_url;
} }
$category = null;
if (!empty($categoryId)) {
$category = $courseCategoriesRepo->find($categoryId);
}
/** @var \Chamilo\CoreBundle\Entity\Course $courseEntity */ /** @var \Chamilo\CoreBundle\Entity\Course $courseEntity */
$courseEntity = $courseInfo['entity']; $courseEntity = $courseInfo['entity'];
$courseEntity $courseEntity
@ -379,12 +358,14 @@ if ($form->validate()) {
->setSubscribe($course['subscribe']) ->setSubscribe($course['subscribe'])
->setUnsubscribe($course['unsubscribe']) ->setUnsubscribe($course['unsubscribe'])
->setVisibility($visibility) ->setVisibility($visibility)
->setCategory($category)
; ;
$em->persist($courseEntity); $em->persist($courseEntity);
$em->flush(); $em->flush();
// Updating course categories
$courseCategoriesRepo->updateCourseRelCategoryByCourse($courseEntity, $course);
// update the extra fields // update the extra fields
$courseFieldValue = new ExtraFieldValue('course'); $courseFieldValue = new ExtraFieldValue('course');
$courseFieldValue->saveFieldValues($course); $courseFieldValue->saveFieldValues($course);

@ -40,13 +40,13 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
{ {
$course_table = Database::get_main_table(TABLE_MAIN_COURSE); $course_table = Database::get_main_table(TABLE_MAIN_COURSE);
$tblCourseCategory = Database::get_main_table(TABLE_MAIN_CATEGORY); $tblCourseCategory = Database::get_main_table(TABLE_MAIN_CATEGORY);
$tblCourseRelCategory = Database::get_main_table(TABLE_MAIN_COURSE_REL_CATEGORY);
$select = "SELECT $select = "SELECT
course.code AS col0, course.code AS col0,
title AS col1, title AS col1,
course.code AS col2, course.code AS col2,
course_language AS col3, course_language AS col3,
category.code AS col4,
subscribe AS col5, subscribe AS col5,
unsubscribe AS col6, unsubscribe AS col6,
course.code AS col7, course.code AS col7,
@ -60,8 +60,12 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
$select = 'SELECT COUNT(DISTINCT(course.id)) as count '; $select = 'SELECT COUNT(DISTINCT(course.id)) as count ';
} }
$sql = "$select FROM $course_table course $sql = "$select FROM $course_table course ";
LEFT JOIN $tblCourseCategory category ON course.category_id = category.id ";
if (isset($_GET['keyword_category']) && !empty($_GET['keyword_category'])) {
$sql .= "INNER JOIN $tblCourseRelCategory course_rel_category ON course.id = course_rel_category.course_id
INNER JOIN $tblCourseCategory category ON course_rel_category.course_category_id = category.id ";
}
if ((api_is_platform_admin() || api_is_session_admin()) && if ((api_is_platform_admin() || api_is_session_admin()) &&
api_is_multiple_url_enabled() && -1 != api_get_current_access_url_id() api_is_multiple_url_enabled() && -1 != api_get_current_access_url_id()
@ -83,7 +87,7 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
$keyword_code = Database::escape_string('%'.$_GET['keyword_code'].'%'); $keyword_code = Database::escape_string('%'.$_GET['keyword_code'].'%');
$keyword_title = Database::escape_string('%'.$_GET['keyword_title'].'%'); $keyword_title = Database::escape_string('%'.$_GET['keyword_title'].'%');
$keyword_category = isset($_GET['keyword_category']) $keyword_category = isset($_GET['keyword_category'])
? Database::escape_string('%'.$_GET['keyword_category'].'%') ? Database::escape_string($_GET['keyword_category'])
: null; : null;
$keyword_language = Database::escape_string('%'.$_GET['keyword_language'].'%'); $keyword_language = Database::escape_string('%'.$_GET['keyword_language'].'%');
$keyword_visibility = Database::escape_string('%'.$_GET['keyword_visibility'].'%'); $keyword_visibility = Database::escape_string('%'.$_GET['keyword_visibility'].'%');
@ -99,7 +103,7 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
unsubscribe LIKE '".$keyword_unsubscribe."'"; unsubscribe LIKE '".$keyword_unsubscribe."'";
if (!empty($keyword_category)) { if (!empty($keyword_category)) {
$sql .= " AND category.code LIKE '".$keyword_category."' "; $sql .= " AND category.id = ".$keyword_category . " ";
} }
} }
@ -111,6 +115,7 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
} }
if ($getCount) { if ($getCount) {
$sql .= "GROUP BY course.code";
$res = Database::query($sql); $res = Database::query($sql);
$row = Database::fetch_array($res); $row = Database::fetch_array($res);
if ($row) { if ($row) {
@ -120,6 +125,7 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
return 0; return 0;
} }
$sql .= "GROUP BY course.code";
$sql .= " ORDER BY col$column $direction "; $sql .= " ORDER BY col$column $direction ";
$sql .= " LIMIT $from, $number_of_items"; $sql .= " LIMIT $from, $number_of_items";
@ -132,6 +138,17 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
while ($course = Database::fetch_array($res)) { while ($course = Database::fetch_array($res)) {
$courseInfo = api_get_course_info_by_id($course['id']); $courseInfo = api_get_course_info_by_id($course['id']);
// get categories
$sqlCategoriesByCourseId = "SELECT category.name FROM $tblCourseCategory category
INNER JOIN $tblCourseRelCategory course_rel_category ON category.id = course_rel_category.course_category_id
WHERE course_rel_category.course_id = " . $course['id'];
$resultCategories = Database::query($sqlCategoriesByCourseId);
$categories = [];
while ($category = Database::fetch_array($resultCategories)) {
$categories[] = $category['name'];
}
// Place colour icons in front of courses. // Place colour icons in front of courses.
$show_visual_code = $course['visual_code'] != $course[2] ? Display::label($course['visual_code'], 'info') : null; $show_visual_code = $course['visual_code'] != $course[2] ? Display::label($course['visual_code'], 'info') : null;
$course[1] = get_course_visibility_icon($course[8]).PHP_EOL $course[1] = get_course_visibility_icon($course[8]).PHP_EOL
@ -179,7 +196,7 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
$course[1], $course[1],
$course[2], $course[2],
$language, $language,
$course[4], implode(", ", $categories),
$course[5], $course[5],
$course[6], $course[6],
implode(PHP_EOL, $actions), implode(PHP_EOL, $actions),
@ -541,7 +558,7 @@ if (isset($_GET['search']) && 'advanced' === $_GET['search']) {
$table->set_header(1, get_lang('Title'), true, null, ['class' => 'title']); $table->set_header(1, get_lang('Title'), true, null, ['class' => 'title']);
$table->set_header(2, get_lang('Course code')); $table->set_header(2, get_lang('Course code'));
$table->set_header(3, get_lang('Language'), false, 'width="70px"'); $table->set_header(3, get_lang('Language'), false, 'width="70px"');
$table->set_header(4, get_lang('Category')); $table->set_header(4, get_lang('Categories'));
$table->set_header(5, get_lang('Registr. allowed'), true, 'width="60px"'); $table->set_header(5, get_lang('Registr. allowed'), true, 'width="60px"');
$table->set_header(6, get_lang('UnsubscribeAllowed'), false, 'width="50px"'); $table->set_header(6, get_lang('UnsubscribeAllowed'), false, 'width="50px"');
$table->set_header( $table->set_header(

@ -124,8 +124,8 @@ switch ($action) {
$list = []; $list = [];
foreach ($categories as $item) { foreach ($categories as $item) {
$list['items'][] = [ $list['items'][] = [
'id' => $item['code'], 'id' => $item['id'],
'text' => '('.$item['code'].') '.strip_tags($item['name']), 'text' => strip_tags($item['name']),
]; ];
} }

@ -652,7 +652,6 @@ class AddCourse
$visual_code = $params['visual_code']; $visual_code = $params['visual_code'];
$directory = $params['directory']; $directory = $params['directory'];
$tutor_name = isset($params['tutor_name']) ? $params['tutor_name'] : null; $tutor_name = isset($params['tutor_name']) ? $params['tutor_name'] : null;
$categoryId = isset($params['category_id']) ? (int) $params['category_id'] : '';
$course_language = isset($params['course_language']) && !empty($params['course_language']) ? $params['course_language'] : api_get_setting( $course_language = isset($params['course_language']) && !empty($params['course_language']) ? $params['course_language'] : api_get_setting(
'platformLanguage' 'platformLanguage'
); );
@ -678,9 +677,10 @@ class AddCourse
$unsubscribe = isset($params['unsubscribe']) ? (int) $params['unsubscribe'] : 0; $unsubscribe = isset($params['unsubscribe']) ? (int) $params['unsubscribe'] : 0;
$expiration_date = isset($params['expiration_date']) ? $params['expiration_date'] : null; $expiration_date = isset($params['expiration_date']) ? $params['expiration_date'] : null;
$teachers = isset($params['teachers']) ? $params['teachers'] : null; $teachers = isset($params['teachers']) ? $params['teachers'] : null;
$status = isset($params['status']) ? $params['status'] : null; $categories = isset($params['course_categories']) ? $params['course_categories'] : null;
$TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER); $TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$TABLECOURSERELCATEGORY = Database::get_main_table(TABLE_MAIN_COURSE_REL_CATEGORY);
$ok_to_register_course = true; $ok_to_register_course = true;
// Check whether all the needed parameters are present. // Check whether all the needed parameters are present.
@ -735,17 +735,15 @@ class AddCourse
if ($ok_to_register_course) { if ($ok_to_register_course) {
$repo = Container::getCourseRepository(); $repo = Container::getCourseRepository();
$course = new \Chamilo\CoreBundle\Entity\Course(); $categoryRepo = Container::getCourseCategoryRepository();
/** @var \Chamilo\CoreBundle\Entity\CourseCategory $courseCategory */
$courseCategory = Container::getCourseCategoryRepository()->find($categoryId);
$course = new \Chamilo\CoreBundle\Entity\Course();
$course $course
->setCode($code) ->setCode($code)
->setDirectory($directory) ->setDirectory($directory)
->setCourseLanguage($course_language) ->setCourseLanguage($course_language)
->setTitle($title) ->setTitle($title)
->setDescription(get_lang('Course Description')) ->setDescription(get_lang('Course Description'))
->setCategory($courseCategory)
->setVisibility($visibility) ->setVisibility($visibility)
->setShowScore(1) ->setShowScore(1)
->setDiskQuota($disk_quota) ->setDiskQuota($disk_quota)
@ -757,6 +755,23 @@ class AddCourse
->setUnsubscribe($unsubscribe) ->setUnsubscribe($unsubscribe)
->setVisualCode($visual_code) ->setVisualCode($visual_code)
; ;
if (!empty($categories)) {
if (!is_array($categories)) {
$categories = [$categories];
}
foreach ($categories as $key) {
if (empty($key)) {
continue;
}
$category = $categoryRepo->find($key);
$course->addCategory($category);
}
}
$repo->getEntityManager()->persist($course); $repo->getEntityManager()->persist($course);
$repo->getEntityManager()->flush(); $repo->getEntityManager()->flush();
@ -795,12 +810,12 @@ class AddCourse
if (empty($key)) { if (empty($key)) {
continue; continue;
} }
$sql = "INSERT INTO ".$TABLECOURSUSER." SET $sql = "INSERT INTO " . $TABLECOURSUSER . " SET
c_id = '".Database::escape_string($course_id)."', c_id = '" . Database::escape_string($course_id) . "',
user_id = '".Database::escape_string($key)."', user_id = '" . Database::escape_string($key) . "',
status = '1', status = '1',
is_tutor = '0', is_tutor = '0',
sort = '".($sort + 1)."', sort = '" . ($sort + 1) . "',
relation_type = 0, relation_type = 0,
user_course_cat = '0'"; user_course_cat = '0'";
Database::query($sql); Database::query($sql);

@ -2355,18 +2355,7 @@ function api_format_course_array(Course $course = null)
return []; return [];
} }
$category = $course->getCategory();
$courseData = []; $courseData = [];
$courseData['categoryCode'] = '';
$courseData['categoryName'] = '';
$courseData['category_id'] = 0;
if ($category) {
$courseData['categoryCode'] = $category->getCode();
$courseData['categoryName'] = $category->getName();
$courseData['category_id'] = $category->getId();
}
$courseData['id'] = $courseData['real_id'] = $course->getId(); $courseData['id'] = $courseData['real_id'] = $course->getId();
// Added // Added

@ -30,29 +30,32 @@ class CourseCategory
/** /**
* Get category details from a simple category code. * Get category details from a simple category code.
* *
* @param string $categoryCode The literal category code * @param string|null $categoryCode The literal category code
* *
* @return array * @return array
*/ */
public static function getCategory($categoryCode) public static function getCategory(string $categoryCode = null)
{ {
$table = Database::get_main_table(TABLE_MAIN_CATEGORY); if (!empty($categoryCode)) {
$categoryCode = Database::escape_string($categoryCode); $table = Database::get_main_table(TABLE_MAIN_CATEGORY);
$sql = "SELECT * FROM $table WHERE code ='$categoryCode'"; $categoryCode = Database::escape_string($categoryCode);
$result = Database::query($sql); $sql = "SELECT * FROM $table WHERE code ='$categoryCode'";
if (Database::num_rows($result)) { $result = Database::query($sql);
$category = Database::fetch_array($result, 'ASSOC');
if ($category) {
// Get access url id
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
$sql = "SELECT * FROM $table WHERE course_category_id = ".$category['id'];
$result = Database::query($sql);
$result = Database::fetch_array($result);
if ($result) {
$category['access_url_id'] = $result['access_url_id'];
}
return $category; if (Database::num_rows($result)) {
$category = Database::fetch_array($result, 'ASSOC');
if ($category) {
// Get access url id
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
$sql = "SELECT * FROM $table WHERE course_category_id = ".$category['id'];
$result = Database::query($sql);
$result = Database::fetch_array($result);
if ($result) {
$category['access_url_id'] = $result['access_url_id'];
}
return $category;
}
} }
} }
@ -68,6 +71,7 @@ class CourseCategory
{ {
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY); $tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
$tbl_course_rel_category = Database::get_main_table(TABLE_MAIN_COURSE_REL_CATEGORY);
$category = (int) $category; $category = (int) $category;
$conditions = null; $conditions = null;
@ -80,6 +84,7 @@ class CourseCategory
} }
$parentIdCondition = " AND (t1.parent_id IS NULL OR t1.parent_id = '' )"; $parentIdCondition = " AND (t1.parent_id IS NULL OR t1.parent_id = '' )";
if ($category) { if ($category) {
$parentIdCondition = " AND t1.parent_id = $category "; $parentIdCondition = " AND t1.parent_id = $category ";
} }
@ -90,14 +95,16 @@ class CourseCategory
t1.parent_id, t1.parent_id,
t1.tree_pos, t1.tree_pos,
t1.children_count, t1.children_count,
COUNT(DISTINCT t3.code) AS nbr_courses, COUNT(DISTINCT t4.code) AS nbr_courses,
a.access_url_id a.access_url_id
FROM $tbl_category t1 FROM $tbl_category t1
$conditions $conditions
LEFT JOIN $tbl_category t2 LEFT JOIN $tbl_category t2
ON t1.id = t2.parent_id ON t1.id = t2.parent_id
LEFT JOIN $tbl_course t3 LEFT JOIN $tbl_course_rel_category t3
ON t3.category_id = t1.id ON t1.id = t3.course_category_id
LEFT JOIN $tbl_course t4
ON t3.course_id = t4.id
WHERE WHERE
1 = 1 1 = 1
$parentIdCondition $parentIdCondition
@ -107,12 +114,12 @@ class CourseCategory
t1.parent_id, t1.parent_id,
t1.tree_pos, t1.tree_pos,
t1.children_count t1.children_count
ORDER BY t1.tree_pos"; ORDER BY t1.tree_pos
";
$result = Database::query($sql); $result = Database::query($sql);
$categories = Database::store_result($result, 'ASSOC');
return $categories; return Database::store_result($result, 'ASSOC');
} }
/** /**
@ -136,25 +143,25 @@ class CourseCategory
} }
$sql = "SELECT $sql = "SELECT
t1.id, t1.id,
t1.name, t1.name,
t1.code, t1.code,
t1.parent_id, t1.parent_id,
t1.tree_pos, t1.tree_pos,
t1.children_count, t1.children_count,
COUNT(DISTINCT t3.code) AS number_courses COUNT(DISTINCT t3.code) AS number_courses
FROM $tbl_category t1 FROM $tbl_category t1
$conditions $conditions
LEFT JOIN $tbl_course t3 LEFT JOIN $tbl_course t3
ON t3.category_id=t1.id ON t3.category_id=t1.id
WHERE 1=1 WHERE 1=1
$whereCondition $whereCondition
GROUP BY GROUP BY
t1.name, t1.name,
t1.code, t1.code,
t1.parent_id, t1.parent_id,
t1.tree_pos, t1.tree_pos,
t1.children_count t1.children_count
ORDER BY t1.parent_id, t1.tree_pos"; ORDER BY t1.parent_id, t1.tree_pos";
$result = Database::query($sql); $result = Database::query($sql);
@ -301,9 +308,9 @@ class CourseCategory
$code = CourseManager::generate_course_code($code); $code = CourseManager::generate_course_code($code);
// Updating category // Updating category
$sql = "UPDATE $tbl_category SET $sql = "UPDATE $tbl_category SET
name='$name', name='$name',
code='$code', code='$code',
auth_course_child = '$canHaveCourses' auth_course_child = '$canHaveCourses'
WHERE code = '$old_code'"; WHERE code = '$old_code'";
Database::query($sql); Database::query($sql);
@ -388,14 +395,14 @@ class CourseCategory
if (empty($categoryId)) { if (empty($categoryId)) {
return 0; return 0;
} }
$sql = "SELECT id, code FROM $table $sql = "SELECT id, code FROM $table
WHERE parent_id = $categoryId"; WHERE parent_id = $categoryId";
$result = Database::query($sql); $result = Database::query($sql);
while ($row = Database::fetch_array($result)) { while ($row = Database::fetch_array($result)) {
$count += self::courseCategoryChildrenCount($row['id']); $count += self::courseCategoryChildrenCount($row['id']);
} }
$sql = "UPDATE $table SET $sql = "UPDATE $table SET
children_count = $count children_count = $count
WHERE id = $categoryId"; WHERE id = $categoryId";
Database::query($sql); Database::query($sql);
@ -411,7 +418,7 @@ class CourseCategory
{ {
$table = Database::get_main_table(TABLE_MAIN_CATEGORY); $table = Database::get_main_table(TABLE_MAIN_CATEGORY);
$categoryCode = Database::escape_string($categoryCode); $categoryCode = Database::escape_string($categoryCode);
$sql = "SELECT code, id FROM $table $sql = "SELECT code, id FROM $table
WHERE parent_id = '$categoryCode'"; WHERE parent_id = '$categoryCode'";
$result = Database::query($sql); $result = Database::query($sql);
$children = []; $children = [];
@ -437,7 +444,7 @@ class CourseCategory
$table = Database::get_main_table(TABLE_MAIN_CATEGORY); $table = Database::get_main_table(TABLE_MAIN_CATEGORY);
$categoryCode = Database::escape_string($categoryCode); $categoryCode = Database::escape_string($categoryCode);
$sql = "SELECT code, parent_id $sql = "SELECT code, parent_id
FROM $table FROM $table
WHERE code = '$categoryCode'"; WHERE code = '$categoryCode'";
@ -476,6 +483,8 @@ class CourseCategory
} }
/** /**
* @param array
*
* @return string * @return string
*/ */
public static function listCategories(array $categorySource = []) public static function listCategories(array $categorySource = [])
@ -636,15 +645,15 @@ class CourseCategory
$searchFilter = ''; $searchFilter = '';
if (!empty($searchTerm)) { if (!empty($searchTerm)) {
$searchFilter = ' AND ( $searchFilter = ' AND (
course.code LIKE "%'.$searchTerm.'%" OR course.code LIKE "%'.$searchTerm.'%" OR
course.title LIKE "%'.$searchTerm.'%" OR course.title LIKE "%'.$searchTerm.'%" OR
course.tutor_name LIKE "%'.$searchTerm.'%" course.tutor_name LIKE "%'.$searchTerm.'%"
) '; ) ';
} }
$urlCondition = ' url_rel_course.access_url_id = '.api_get_current_access_url_id().' AND'; $urlCondition = ' url_rel_course.access_url_id = '.api_get_current_access_url_id().' AND';
$tbl_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); $tbl_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
$sql = "SELECT count(course.id) as count $sql = "SELECT count(course.id) as count
FROM $tbl_course as course FROM $tbl_course as course
INNER JOIN $tbl_url_rel_course as url_rel_course INNER JOIN $tbl_url_rel_course as url_rel_course
ON (url_rel_course.c_id = course.id) ON (url_rel_course.c_id = course.id)

@ -23,6 +23,7 @@ define('TABLE_MAIN_COURSE_USER', 'course_rel_user');
define('TABLE_MAIN_COURSE_CATALOGUE_USER', 'course_rel_user_catalogue'); define('TABLE_MAIN_COURSE_CATALOGUE_USER', 'course_rel_user_catalogue');
define('TABLE_MAIN_CLASS_USER', 'class_user'); define('TABLE_MAIN_CLASS_USER', 'class_user');
define('TABLE_MAIN_CATEGORY', 'course_category'); define('TABLE_MAIN_CATEGORY', 'course_category');
define('TABLE_MAIN_COURSE_REL_CATEGORY', 'course_rel_category');
define('TABLE_MAIN_SYSTEM_ANNOUNCEMENTS', 'sys_announcement'); define('TABLE_MAIN_SYSTEM_ANNOUNCEMENTS', 'sys_announcement');
define('TABLE_MAIN_SYSTEM_ANNOUNCEMENTS_GROUPS', 'announcement_rel_group'); define('TABLE_MAIN_SYSTEM_ANNOUNCEMENTS_GROUPS', 'announcement_rel_group');
define('TABLE_MAIN_LANGUAGE', 'language'); define('TABLE_MAIN_LANGUAGE', 'language');

@ -226,13 +226,17 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
protected $description; protected $description;
/** /**
* @var CourseCategory * @var ArrayCollection
* @ApiSubresource() * @ApiSubresource()
* @Groups({"course:read", "course:write"}) * @Groups({"course:read", "course:write"})
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\CourseCategory", inversedBy="courses") * @ORM\ManyToMany(targetEntity="Chamilo\CoreBundle\Entity\CourseCategory", inversedBy="courses")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id") * @ORM\JoinTable(
* name="course_rel_category",
* joinColumns={@ORM\JoinColumn(name="course_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="course_category_id", referencedColumnName="id")}
* )
*/ */
protected $category; protected $categories;
/** /**
* @var int Course visibility * @var int Course visibility
@ -391,6 +395,7 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
$this->users = new ArrayCollection(); $this->users = new ArrayCollection();
$this->urls = new ArrayCollection(); $this->urls = new ArrayCollection();
$this->tools = new ArrayCollection(); $this->tools = new ArrayCollection();
$this->categories = new ArrayCollection();
$this->gradebookCategories = new ArrayCollection(); $this->gradebookCategories = new ArrayCollection();
$this->gradebookEvaluations = new ArrayCollection(); $this->gradebookEvaluations = new ArrayCollection();
$this->gradebookLinks = new ArrayCollection(); $this->gradebookLinks = new ArrayCollection();
@ -756,23 +761,32 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
/** /**
* Set category. * Set category.
* *
* @param CourseCategory $category * @param ArrayCollection $categories
*
* @return Course
*/ */
public function setCategory(CourseCategory $category = null): self public function setCategories(ArrayCollection $categories): self
{ {
$this->category = $category; $this->categories = $categories;
return $this; return $this;
} }
/** public function getCategories()
* Get category. {
* return $this->categories;
* @return CourseCategory }
*/
public function getCategory(): ?CourseCategory public function addCategory(CourseCategory $category): self
{
$this->categories[] = $category;
return $this;
}
public function removeCategory(CourseCategory $category)
{ {
return $this->category; $this->categories->removeElement($category);
} }
/** /**

@ -125,7 +125,7 @@ class CourseCategory
/** /**
* @var ArrayCollection * @var ArrayCollection
* *
* @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\Course", mappedBy="category") * @ORM\ManyToMany(targetEntity="Chamilo\CoreBundle\Entity\Course", mappedBy="categories")
*/ */
protected $courses; protected $courses;

@ -4,10 +4,12 @@
namespace Chamilo\CoreBundle\Repository; namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\CourseCategory; use Chamilo\CoreBundle\Entity\CourseCategory;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Query\Expr\Join;
use Doctrine\Common\Collections\ArrayCollection;
/** /**
* Class CCourseCategoryRepository. * Class CCourseCategoryRepository.
@ -42,7 +44,7 @@ class CourseCategoryRepository extends ServiceEntityRepository
) )
->where($qb->expr()->eq('a.url', $accessUrl)) ->where($qb->expr()->eq('a.url', $accessUrl))
->orderBy('c.treePos', 'ASC') ->orderBy('c.treePos', 'ASC')
; ;
if ($allowBaseCategories) { if ($allowBaseCategories) {
$qb->orWhere($qb->expr()->eq('a.url', 1)); $qb->orWhere($qb->expr()->eq('a.url', 1));
@ -53,6 +55,34 @@ class CourseCategoryRepository extends ServiceEntityRepository
return $query->getResult(); return $query->getResult();
} }
/**
* Get all categories in an access url and course id.
*
* @param int $accessUrl
* @param int $courseId
* @param bool $allowBaseCategories
*
* @return array
*/
public function getCategoriesByCourseIdAndAccessUrlId($accessUrl, $courseId, $allowBaseCategories = false)
{
$qb = $this->createQueryBuilder('c');
$qb
->join('c.courses', 'a')
->join('c.urls', 'b')
->where($qb->expr()->eq('a.id', $courseId))
->andWhere($qb->expr()->eq('b.url', $accessUrl))
;
if ($allowBaseCategories) {
$qb->orWhere($qb->expr()->eq('b.url', 1));
}
$query = $qb->getQuery();
return $query->getResult();
}
/** /**
* Get the number of course categories in an access url. * Get the number of course categories in an access url.
* *
@ -83,4 +113,32 @@ class CourseCategoryRepository extends ServiceEntityRepository
return (int) $count; return (int) $count;
} }
public function updateCourseRelCategoryByCourse(Course $course, $courseData)
{
$em = $this->getEntityManager();
// Remove current categories
foreach ($course->getCategories() as $category) {
$course->removeCategory($category);
}
$em->persist($course);
$em->flush();
// Add new categories
$courseCategories = new ArrayCollection();
if (isset($courseData['course_categories'])) {
foreach ($courseData['course_categories'] as $categoryId) {
$courseCategory = $this->find($categoryId);
$courseCategories->add($courseCategory);
}
}
$course->setCategories($courseCategories);
$em->persist($course);
$em->flush();
}
} }

@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200821224242 extends AbstractMigration
{
public function getDescription() : string
{
return '';
}
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('CREATE TABLE course_rel_category (course_id INT NOT NULL, course_category_id INT NOT NULL, INDEX IDX_8EB34CC5591CC992 (course_id), INDEX IDX_8EB34CC56628AD36 (course_category_id), PRIMARY KEY(course_id, course_category_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB ROW_FORMAT = DYNAMIC');
$this->addSql('ALTER TABLE course_rel_category ADD CONSTRAINT FK_8EB34CC5591CC992 FOREIGN KEY (course_id) REFERENCES course (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE course_rel_category ADD CONSTRAINT FK_8EB34CC56628AD36 FOREIGN KEY (course_category_id) REFERENCES course_category (id) ON DELETE CASCADE');
$this->addSql('DROP TABLE version');
$this->addSql('ALTER TABLE course DROP FOREIGN KEY FK_169E6FB912469DE2');
$this->addSql('DROP INDEX IDX_169E6FB912469DE2 ON course');
$this->addSql('ALTER TABLE course DROP category_id');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('CREATE TABLE version (id INT UNSIGNED AUTO_INCREMENT NOT NULL, version VARCHAR(20) CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_general_ci`, UNIQUE INDEX version (version), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB COMMENT = \'\' ');
$this->addSql('DROP TABLE course_rel_category');
$this->addSql('ALTER TABLE course ADD category_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE course ADD CONSTRAINT FK_169E6FB912469DE2 FOREIGN KEY (category_id) REFERENCES course_category (id)');
$this->addSql('CREATE INDEX IDX_169E6FB912469DE2 ON course (category_id)');
}
}
Loading…
Cancel
Save