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', 'html_filter');
$countCategories = $courseCategoriesRepo->countAllInAccessUrl(
$accessUrlId,
api_get_configuration_value('allow_base_course_category')
$form->addSelectAjax(
'course_categories',
get_lang('Categories'),
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(
'visual_code',
get_lang('max. 20 characters, e.g. <i>INNOV21</i>'),
@ -227,8 +203,6 @@ if ($form->validate()) {
$course['teachers'] = $course_teachers;
$course['wanted_code'] = $course['visual_code'];
$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';
$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\Repository\CourseCategoryRepository;
use Chamilo\CoreBundle\Repository\CourseRepository;
use Chamilo\CoreBundle\Framework\Container;
$cidReset = true;
@ -16,11 +17,8 @@ api_protect_admin_script();
$course_table = Database::get_main_table(TABLE_MAIN_COURSE);
$em = Database::getManager();
/** @var CourseRepository $courseRepo */
$courseRepo = $em->getRepository('ChamiloCoreBundle:CourseCategory');
/** @var CourseCategoryRepository $courseCategoriesRepo */
$courseCategoriesRepo = $em->getRepository('ChamiloCoreBundle:CourseCategory');
// Get all possible teachers.
$courseCategoriesRepo = Container::getCourseCategoryRepository();
$urlId = api_get_current_access_url_id();
$courseId = isset($_GET['id']) ? $_GET['id'] : null;
@ -146,44 +144,31 @@ $form->addText(
$form->applyFilter('visual_code', 'strtoupper');
$form->applyFilter('visual_code', 'html_filter');
$countCategories = $courseCategoriesRepo->countAllInAccessUrl(
$categories = $courseCategoriesRepo->getCategoriesByCourseIdAndAccessUrlId(
$urlId,
$courseId,
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'])) {
$data = \CourseCategory::getCategory($courseInfo['categoryCode']);
$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;
}
$courseCategoryNames = [];
$courseCategoryIds = [];
$form->addSelect(
'category_id',
get_lang('Category'),
$categoriesOptions
);
foreach ($categories as $category) {
$courseCategoryNames[$category->getId()] = $category->getName();
$courseCategoryIds[] = $category->getId();
}
$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 = [];
foreach ($course_teachers as $courseTeacherId) {
@ -355,18 +340,12 @@ if ($form->validate()) {
}
$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'];
if (!stristr($department_url, 'http://')) {
$department_url = 'http://'.$department_url;
}
$category = null;
if (!empty($categoryId)) {
$category = $courseCategoriesRepo->find($categoryId);
}
/** @var \Chamilo\CoreBundle\Entity\Course $courseEntity */
$courseEntity = $courseInfo['entity'];
$courseEntity
@ -379,12 +358,14 @@ if ($form->validate()) {
->setSubscribe($course['subscribe'])
->setUnsubscribe($course['unsubscribe'])
->setVisibility($visibility)
->setCategory($category)
;
$em->persist($courseEntity);
$em->flush();
// Updating course categories
$courseCategoriesRepo->updateCourseRelCategoryByCourse($courseEntity, $course);
// update the extra fields
$courseFieldValue = new ExtraFieldValue('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);
$tblCourseCategory = Database::get_main_table(TABLE_MAIN_CATEGORY);
$tblCourseRelCategory = Database::get_main_table(TABLE_MAIN_COURSE_REL_CATEGORY);
$select = "SELECT
course.code AS col0,
title AS col1,
course.code AS col2,
course_language AS col3,
category.code AS col4,
subscribe AS col5,
unsubscribe AS col6,
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 ';
}
$sql = "$select FROM $course_table course
LEFT JOIN $tblCourseCategory category ON course.category_id = category.id ";
$sql = "$select FROM $course_table course ";
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()) &&
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_title = Database::escape_string('%'.$_GET['keyword_title'].'%');
$keyword_category = isset($_GET['keyword_category'])
? Database::escape_string('%'.$_GET['keyword_category'].'%')
? Database::escape_string($_GET['keyword_category'])
: null;
$keyword_language = Database::escape_string('%'.$_GET['keyword_language'].'%');
$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."'";
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) {
$sql .= "GROUP BY course.code";
$res = Database::query($sql);
$row = Database::fetch_array($res);
if ($row) {
@ -120,6 +125,7 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
return 0;
}
$sql .= "GROUP BY course.code";
$sql .= " ORDER BY col$column $direction ";
$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)) {
$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.
$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
@ -179,7 +196,7 @@ function get_course_data($from, $number_of_items, $column, $direction, $dataFunc
$course[1],
$course[2],
$language,
$course[4],
implode(", ", $categories),
$course[5],
$course[6],
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(2, get_lang('Course code'));
$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(6, get_lang('UnsubscribeAllowed'), false, 'width="50px"');
$table->set_header(

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

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

@ -2355,18 +2355,7 @@ function api_format_course_array(Course $course = null)
return [];
}
$category = $course->getCategory();
$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();
// Added

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

@ -226,13 +226,17 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
protected $description;
/**
* @var CourseCategory
* @var ArrayCollection
* @ApiSubresource()
* @Groups({"course:read", "course:write"})
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\CourseCategory", inversedBy="courses")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
* @ORM\ManyToMany(targetEntity="Chamilo\CoreBundle\Entity\CourseCategory", inversedBy="courses")
* @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
@ -391,6 +395,7 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
$this->users = new ArrayCollection();
$this->urls = new ArrayCollection();
$this->tools = new ArrayCollection();
$this->categories = new ArrayCollection();
$this->gradebookCategories = new ArrayCollection();
$this->gradebookEvaluations = new ArrayCollection();
$this->gradebookLinks = new ArrayCollection();
@ -756,23 +761,32 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
/**
* 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;
}
/**
* Get category.
*
* @return CourseCategory
*/
public function getCategory(): ?CourseCategory
public function getCategories()
{
return $this->categories;
}
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
*
* @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\Course", mappedBy="category")
* @ORM\ManyToMany(targetEntity="Chamilo\CoreBundle\Entity\Course", mappedBy="categories")
*/
protected $courses;

@ -4,10 +4,12 @@
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\CourseCategory;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Class CCourseCategoryRepository.
@ -42,7 +44,7 @@ class CourseCategoryRepository extends ServiceEntityRepository
)
->where($qb->expr()->eq('a.url', $accessUrl))
->orderBy('c.treePos', 'ASC')
;
;
if ($allowBaseCategories) {
$qb->orWhere($qb->expr()->eq('a.url', 1));
@ -53,6 +55,34 @@ class CourseCategoryRepository extends ServiceEntityRepository
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.
*
@ -83,4 +113,32 @@ class CourseCategoryRepository extends ServiceEntityRepository
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