Clean course category code:

- Use id instead of code
- Use entities
- Fix migrations
- Fix course category image #3801
pull/3890/head
Julio Montoya 5 years ago
parent b2e3596315
commit 511b661666
  1. 186
      public/main/admin/course_category.php
  2. 5
      public/main/admin/course_import.php
  3. 470
      public/main/inc/lib/course_category.lib.php
  4. 15
      public/main/inc/lib/extra_field_value.lib.php
  5. 8
      public/main/install/data.sql
  6. 7
      public/main/session/session_add.php
  7. 2
      src/CoreBundle/Entity/AccessUrlRelCourseCategory.php
  8. 2
      src/CoreBundle/Entity/CourseCategory.php
  9. 2
      src/CoreBundle/Migrations/Schema/V200/Version20170628122900.php
  10. 2
      src/CoreBundle/Migrations/Schema/V200/Version20191101132000.php
  11. 14
      src/CoreBundle/Repository/AssetRepository.php
  12. 10
      src/CoreBundle/Repository/CourseCategoryRepository.php

@ -2,78 +2,95 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Framework\Container;
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_admin_script();
$category = isset($_GET['category']) ? $_GET['category'] : null;
$action = isset($_GET['action']) ? $_GET['action'] : null;
$category = $_GET['category'] ?? null;
$action = $_GET['action'] ?? null;
$categoryId = isset($_GET['id']) ? Security::remove_XSS($_GET['id']) : null;
$assetRepo = Container::getAssetRepository();
$urlId = api_get_current_access_url_id();
$categoryInfo = [];
$parentInfo = [];
if (!empty($category)) {
$parentInfo = CourseCategory::getCategory($category);
}
if (!empty($categoryId)) {
$categoryInfo = CourseCategory::getCategory($categoryId);
$categoryInfo = $parentInfo = CourseCategory::getCategoryById($categoryId);
}
$parentId = $parentInfo ? $parentInfo['id'] : null;
switch ($action) {
case 'delete':
// If multiple URLs and not main URL, prevent deletion and inform user
if (api_get_multiple_access_url() && 1 != $urlId) {
echo Display::return_message(
get_lang(
'Course categories are global over multiple portals configurations. Changes are only allowed in the main administrative portal.'
),
'warning'
);
}
$myCourseListAsCategory = api_get_configuration_value('my_courses_list_as_category');
if (!empty($action)) {
if ('delete' === $action) {
CourseCategory::delete($categoryId);
Display::addFlash(Display::return_message(get_lang('Deleted')));
header('Location: '.api_get_self().'?category='.Security::remove_XSS($category));
exit();
} elseif (('add' === $action || 'edit' === $action) && isset($_POST['formSent']) && $_POST['formSent']) {
if ('add' === $action) {
$ret = CourseCategory::addNode(
break;
case 'moveUp':
CourseCategory::moveNodeUp($categoryId, $_GET['tree_pos'], $category);
header('Location: '.api_get_self().'?category='.Security::remove_XSS($category));
Display::addFlash(Display::return_message(get_lang('Update successful')));
exit();
break;
case 'add':
if (isset($_POST['formSent']) && $_POST['formSent']) {
$categoryEntity = CourseCategory::add(
$_POST['code'],
$_POST['name'],
$_POST['auth_course_child'],
$parentInfo ? $parentInfo['id'] : null
$_POST['description'],
$parentId,
);
$errorMsg = Display::return_message(get_lang('Created'));
} else {
$ret = CourseCategory::editNode(
$_POST['code'],
$_POST['name'],
$_POST['auth_course_child'],
$categoryId
if (isset($_FILES['image']) && $categoryEntity) {
CourseCategory::saveImage($categoryEntity, $_FILES['image']);
}
$message = Display::return_message(get_lang('Created'));
Display::addFlash($message);
header('Location: '.api_get_path(WEB_CODE_PATH).'admin/course_category.php?id='.$parentId);
exit;
}
break;
case 'edit':
if (isset($_POST['formSent']) && $_POST['formSent']) {
$categoryEntity = CourseCategory::edit(
$categoryId,
$_REQUEST['name'],
$_REQUEST['auth_course_child'],
$_REQUEST['code'],
$_REQUEST['description']
);
$categoryInfo = CourseCategory::getCategory($_POST['code']);
$ret = $categoryInfo['id'];
//Delete Picture Category
/*$deletePicture = isset($_POST['delete_picture']) ? $_POST['delete_picture'] : '';
// Delete Picture Category
$deletePicture = $_POST['delete_picture'] ?? '';
if ($deletePicture) {
CourseCategory::deletePictureCategory($ret);
}*/
CourseCategory::deleteImage($categoryEntity);
}
$errorMsg = Display::return_message(get_lang('Update successful'));
}
if (!$ret) {
$errorMsg = Display::return_message(get_lang('This category is already used'), 'error');
} else {
if ($myCourseListAsCategory) {
/*if (isset($_FILES['image'])) {
CourseCategory::saveImage($ret, $_FILES['image']);
}*/
CourseCategory::saveDescription($ret, $_POST['description']);
if (isset($_FILES['image']) && $categoryEntity) {
CourseCategory::saveImage($categoryEntity, $_FILES['image']);
}
}
Display::addFlash($errorMsg);
header('Location: '.api_get_path(WEB_CODE_PATH).'admin/course_category.php');
exit;
} elseif ('moveUp' === $action) {
CourseCategory::moveNodeUp($categoryId, $_GET['tree_pos'], $category);
header('Location: '.api_get_self().'?category='.Security::remove_XSS($category));
Display::addFlash(Display::return_message(get_lang('Update successful')));
exit();
}
$message = Display::return_message(get_lang('Update successful'));
Display::addFlash($message);
header('Location: '.api_get_path(WEB_CODE_PATH).'admin/course_category.php?id='.$parentId);
exit;
}
break;
}
$tool_name = get_lang('Courses categories');
@ -83,21 +100,19 @@ $interbreadcrumb[] = [
];
Display::display_header($tool_name);
$urlId = api_get_current_access_url_id();
if ('add' === $action || 'edit' === $action) {
$actions = Display::url(
Display::return_icon('folder_up.png', get_lang('Back'), '', ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'admin/course_category.php?category='.Security::remove_XSS($category)
api_get_path(WEB_CODE_PATH).'admin/course_category.php?id='.$categoryId
);
echo Display::toolbarAction('categories', [$actions]);
$form_title = 'add' === $action ? get_lang('Add category') : get_lang('Edit this category');
if (!empty($category)) {
$form_title .= ' '.get_lang('Into').' '.Security::remove_XSS($category);
if (!empty($categoryInfo)) {
$form_title .= ' '.get_lang('Into').' '.$categoryInfo['name'];
}
$url = api_get_self().'?action='.Security::remove_XSS($action).
'&category='.Security::remove_XSS($category).'&id='.Security::remove_XSS($categoryId);
$url = api_get_self().'?action='.Security::remove_XSS($action).'&id='.Security::remove_XSS($categoryId);
$form = new FormValidator('course_category', 'post', $url);
$form->addElement('header', '', $form_title);
$form->addElement('hidden', 'formSent', 1);
@ -135,31 +150,28 @@ if ('add' === $action || 'edit' === $action) {
];
$form->addGroup($group, null, get_lang('Allow adding courses in this category?'));
if ($myCourseListAsCategory) {
$form->addHtmlEditor(
'description',
get_lang('Description'),
false,
false,
['ToolbarSet' => 'Minimal']
);
/*$form->addFile('image', get_lang('Image'), ['id' => 'picture', 'class' => 'picture-form', 'accept' => 'image/*', 'crop_image' => true]);
if ('edit' === $action && !empty($categoryInfo['image'])) {
$form->addElement('checkbox', 'delete_picture', null, get_lang('Delete picture'));
$form->addHtml('
<div class="form-group row">
<div class="offset-md-2 col-sm-8">'.
Display::img(
api_get_path(WEB_UPLOAD_PATH).$categoryInfo['image'],
get_lang('Image'),
['width' => 256, 'class' => 'img-thumbnail']
).'</div>
</div>
');
}*/
$form->addHtmlEditor(
'description',
get_lang('Description'),
false,
false,
['ToolbarSet' => 'Minimal']
);
$form->addFile(
'image',
get_lang('Image'),
['id' => 'picture', 'class' => 'picture-form', 'accept' => 'image/*', 'crop_image' => true]
);
if ('edit' === $action && !empty($categoryInfo['image'])) {
$form->addElement('checkbox', 'delete_picture', null, get_lang('Delete picture'));
$asset = $assetRepo->find($categoryInfo['image']);
$image = $assetRepo->getAssetUrl($asset);
$form->addLabel(get_lang('Image'), "<img src=$image />");
}
if (!empty($categoryInfo)) {
if ('edit' === $action && !empty($categoryInfo)) {
$class = 'save';
$text = get_lang('Save');
$form->setDefaults($categoryInfo);
@ -172,30 +184,21 @@ if ('add' === $action || 'edit' === $action) {
}
$form->display();
} else {
// If multiple URLs and not main URL, prevent deletion and inform user
if ('delete' == $action && api_get_multiple_access_url() && 1 != $urlId) {
echo Display::return_message(
get_lang(
'Course categories are global over multiple portals configurations. Changes are only allowed in the main administrative portal.'
),
'warning'
);
}
$actions = '';
$link = null;
if (!empty($parentInfo)) {
$realParentInfo = $parentInfo['parent_id'] ? CourseCategory::getCategoryById($parentInfo['parent_id']) : [];
$realParentCode = $realParentInfo ? $realParentInfo['code'] : '';
$realParentCode = $realParentInfo ? $realParentInfo['id'] : 0;
$actions .= Display::url(
Display::return_icon('back.png', get_lang('Back'), '', ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'admin/course_category.php?category='.$realParentCode
api_get_path(WEB_CODE_PATH).'admin/course_category.php?id='.$realParentCode
);
}
if (empty($parentInfo) || 'TRUE' == $parentInfo['auth_cat_child']) {
if (empty($parentInfo) || 'TRUE' === $parentInfo['auth_cat_child']) {
$newCategoryLink = Display::url(
Display::return_icon('new_folder.png', get_lang('Add category'), '', ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'admin/course_category.php?action=add&category='.Security::remove_XSS($category)
api_get_path(WEB_CODE_PATH).'admin/course_category.php?action=add&id='.$categoryId
);
if (!empty($parentInfo) && $parentInfo['access_url_id'] != $urlId) {
@ -207,9 +210,8 @@ if ('add' === $action || 'edit' === $action) {
if (!empty($parentInfo)) {
echo Display::page_subheader($parentInfo['name'].' ('.$parentInfo['code'].')');
}
echo CourseCategory::listCategories(
CourseCategory::getCategory($category)
);
echo CourseCategory::listCategories($categoryInfo);
}
Display::display_footer();

@ -63,11 +63,10 @@ function validate_courses_data($courses)
if (!empty($course['CourseCategory'])) {
$categoryInfo = CourseCategory::getCategory($course['CourseCategory']);
if (empty($categoryInfo)) {
CourseCategory::addNode(
CourseCategory::add(
$course['CourseCategory'],
$course['CourseCategoryName'] ?: $course['CourseCategory'],
'TRUE',
null
'TRUE'
);
}
} else {

@ -2,35 +2,18 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Asset;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CoreBundle\Entity\CourseCategory as CourseCategoryEntity;
use Doctrine\Common\Collections\Criteria;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Class CourseCategory.
*/
class CourseCategory
{
/**
* Returns the category fields from the database from an int ID.
*
* @param int $categoryId The category ID
*
* @return array
*/
public static function getCategoryById($categoryId)
{
$table = Database::get_main_table(TABLE_MAIN_CATEGORY);
$categoryId = (int) $categoryId;
$sql = "SELECT * FROM $table WHERE id = $categoryId";
$result = Database::query($sql);
if (Database::num_rows($result)) {
return Database::fetch_array($result, 'ASSOC');
}
return [];
}
/**
* Get category details from a simple category code.
@ -68,71 +51,35 @@ class CourseCategory
}
/**
* @param int|null $category Optional. Parent category ID.
* Returns the category fields from the database from an int ID.
*
* @return CourseCategoryEntity[]
* @param int $categoryId The category ID
*
* @return array
*/
public static function getCategories($category = null)
public static function getCategoryById($categoryId)
{
$repo = Container::getCourseCategoryRepository();
$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;
return $repo->findAllInAccessUrl(
api_get_current_access_url_id(),
api_get_configuration_value('allow_base_course_category'),
$category
);
/*
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
$conditions = " INNER JOIN $table a ON (t1.id = a.course_category_id)";
$whereCondition = " AND a.access_url_id = ".api_get_current_access_url_id();
$allowBaseCategories = api_get_configuration_value('allow_base_course_category');
if ($allowBaseCategories) {
$whereCondition = " AND (a.access_url_id = ".api_get_current_access_url_id()." OR a.access_url_id = 1) ";
}
$parentIdCondition = " AND (t1.parent_id IS NULL OR t1.parent_id = '' )";
$table = Database::get_main_table(TABLE_MAIN_CATEGORY);
$categoryId = (int) $categoryId;
$sql = "SELECT * FROM $table WHERE id = $categoryId";
$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 ($category) {
$parentIdCondition = " AND t1.parent_id = $category ";
return $category;
}
}
$sql = "SELECT
t1.name,
t1.code,
t1.parent_id,
t1.tree_pos,
t1.children_count,
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_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
$whereCondition
GROUP BY t1.name,
t1.code,
t1.parent_id,
t1.tree_pos,
t1.children_count
ORDER BY t1.tree_pos
";
$result = Database::query($sql);
return Database::store_result($result, 'ASSOC');*/
return [];
}
/**
@ -186,50 +133,55 @@ class CourseCategory
* @param string $code
* @param string $name
* @param string $canHaveCourses
* @param int $parent_id
*
* @return bool
* @param null|int $parentId
*/
public static function addNode($code, $name, $canHaveCourses, $parent_id)
public static function add($code, $name, $canHaveCourses, $description, $parentId = null): ?CourseCategoryEntity
{
$table = Database::get_main_table(TABLE_MAIN_CATEGORY);
$code = trim($code);
$name = trim($name);
$parent_id = (int) $parent_id;
$parentId = (int) $parentId;
$code = CourseManager::generate_course_code($code);
$sql = "SELECT 1 FROM $table
WHERE code = '".Database::escape_string($code)."'";
$result = Database::query($sql);
if (Database::num_rows($result)) {
return false;
return null;
}
$result = Database::query("SELECT MAX(tree_pos) AS maxTreePos FROM $table");
$row = Database::fetch_array($result);
$tree_pos = $row['maxTreePos'] + 1;
$parentId = empty($parentId) ? null : $parentId;
$params = [
'name' => $name,
'code' => $code,
'parent_id' => empty($parent_id) ? null : $parent_id,
'tree_pos' => $tree_pos,
'children_count' => 0,
'auth_course_child' => $canHaveCourses,
'auth_cat_child' => 'TRUE',
];
$categoryId = Database::insert($table, $params);
$repo = Container::getCourseCategoryRepository();
$category = new CourseCategoryEntity();
$category
->setName($name)
->setCode($code)
->setDescription($description)
->setTreePos($tree_pos)
->setAuthCourseChild($canHaveCourses)
->setAuthCatChild('TRUE');
if (!empty($parentId)) {
$category->setParent($repo->find($parentId));
}
$repo->save($category);
$categoryId = $category->getId();
if ($categoryId) {
self::updateParentCategoryChildrenCount($parent_id, 1);
self::updateParentCategoryChildrenCount($parentId, 1);
UrlManager::addCourseCategoryListToUrl(
[$categoryId],
[api_get_current_access_url_id()]
);
return $categoryId;
return $category;
}
return false;
return null;
}
/**
@ -302,38 +254,28 @@ class CourseCategory
}*/
}
/**
* @param string $code
* @param string $name
* @param string $canHaveCourses
* @param string $old_code
*
* @return bool
*/
public static function editNode($code, $name, $canHaveCourses, $old_code)
public static function edit($categoryId, $name, $canHaveCourses, $code, $description): CourseCategoryEntity
{
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
$code = trim(Database::escape_string($code));
$name = trim(Database::escape_string($name));
$old_code = Database::escape_string($old_code);
$canHaveCourses = Database::escape_string($canHaveCourses);
$code = CourseManager::generate_course_code($code);
// Updating category
$sql = "UPDATE $tbl_category SET
name='$name',
code='$code',
auth_course_child = '$canHaveCourses'
WHERE code = '$old_code'";
Database::query($sql);
$repo = Container::getCourseCategoryRepository();
$category = $repo->find($categoryId);
$category
->setCode($name)
->setName($name)
->setDescription($description)
->setAuthCourseChild($canHaveCourses);
$repo->save($category);
// Updating children
$sql = "UPDATE $tbl_category SET parent_id = '$code'
/*$sql = "UPDATE $tbl_category SET parent_id = '$code'
WHERE parent_id = '$old_code'";
Database::query($sql);
Database::query($sql);*/
return true;
return $category;
}
/**
@ -415,6 +357,28 @@ class CourseCategory
return $children;
}
/**
* @param string $categoryCode
*
* @return string|null
*/
public static function getParentsToString($categoryCode)
{
$parents = self::getParents($categoryCode);
if (!empty($parents)) {
$parents = array_reverse($parents);
$categories = [];
foreach ($parents as $category) {
$categories[] = $category['code'];
}
return implode(' > ', $categories).' > ';
}
return null;
}
/**
* @param string $categoryCode
*
@ -444,28 +408,6 @@ class CourseCategory
return $children;
}
/**
* @param string $categoryCode
*
* @return string|null
*/
public static function getParentsToString($categoryCode)
{
$parents = self::getParents($categoryCode);
if (!empty($parents)) {
$parents = array_reverse($parents);
$categories = [];
foreach ($parents as $category) {
$categories[] = $category['code'];
}
return implode(' > ', $categories).' > ';
}
return null;
}
public static function listCategories(array $categorySource = []): string
{
$categories = self::getCategories($categorySource ? $categorySource['id'] : null);
@ -509,27 +451,29 @@ class CourseCategory
$urlId = api_get_current_access_url_id();
foreach ($categories as $category) {
$categoryId = $category->getId();
$code = $category->getCode();
$editUrl = $mainUrl.'&id='.$code.'&action=edit';
$moveUrl = $mainUrl.'&id='.$code.'&action=moveUp&tree_pos='.$category->getTreePos();
$deleteUrl = $mainUrl.'&id='.$category->getId().'&action=delete';
$editUrl = $mainUrl.'&id='.$categoryId.'&action=edit';
$moveUrl = $mainUrl.'&id='.$categoryId.'&action=moveUp&tree_pos='.$category->getTreePos();
$deleteUrl = $mainUrl.'&id='.$categoryId.'&action=delete';
$actions = [];
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('status', User::STUDENT));
$inUrl = $category->getUrls()->filter( function($entry) use ($urlId) {
return $entry->getUrl()->getId() === $urlId;
});
$inUrl = $category->getUrls()->filter(
function ($entry) use ($urlId) {
return $entry->getUrl()->getId() === $urlId;
}
);
//if ($urlId == $category['access_url_id']) {
if ($inUrl->count()> 0) {
if ($inUrl->count() > 0) {
$actions[] = Display::url($editIcon, $editUrl);
$actions[] = Display::url($moveIcon, $moveUrl);
$actions[] = Display::url($deleteIcon, $deleteUrl);
}
$url = api_get_path(WEB_CODE_PATH).'admin/course_category.php?category='.$code;
$url = api_get_path(WEB_CODE_PATH).'admin/course_category.php?id='.$categoryId;
$title = Display::url(
Display::return_icon(
'folder_document.gif',
@ -540,7 +484,6 @@ class CourseCategory
$url
);
//$countCourses = self::countCoursesInCategory($code, null, false);
$countCourses = $category->getCourses()->count();
$content = [
$title,
@ -559,7 +502,71 @@ class CourseCategory
return $table->toHtml();
}
return Display::return_message(get_lang('NoCategories'), 'warning');
return Display::return_message(get_lang('There are no categories here'), 'warning');
}
/**
* @param int|null $category Optional. Parent category ID.
*
* @return CourseCategoryEntity[]
*/
public static function getCategories($category = null)
{
$repo = Container::getCourseCategoryRepository();
$category = (int) $category;
return $repo->findAllInAccessUrl(
api_get_current_access_url_id(),
api_get_configuration_value('allow_base_course_category'),
$category
);
/*
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
$conditions = " INNER JOIN $table a ON (t1.id = a.course_category_id)";
$whereCondition = " AND a.access_url_id = ".api_get_current_access_url_id();
$allowBaseCategories = api_get_configuration_value('allow_base_course_category');
if ($allowBaseCategories) {
$whereCondition = " AND (a.access_url_id = ".api_get_current_access_url_id()." OR a.access_url_id = 1) ";
}
$parentIdCondition = " AND (t1.parent_id IS NULL OR t1.parent_id = '' )";
if ($category) {
$parentIdCondition = " AND t1.parent_id = $category ";
}
$sql = "SELECT
t1.name,
t1.code,
t1.parent_id,
t1.tree_pos,
t1.children_count,
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_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
$whereCondition
GROUP BY t1.name,
t1.code,
t1.parent_id,
t1.tree_pos,
t1.children_count
ORDER BY t1.tree_pos
";
$result = Database::query($sql);
return Database::store_result($result, 'ASSOC');*/
}
/**
@ -615,6 +622,7 @@ class CourseCategory
/**
* @param string $category_code
* @param string $keyword
*
* @paran bool $avoidCourses
* @paran array $conditions
*
@ -629,8 +637,13 @@ class CourseCategory
return self::getCoursesInCategory($category_code, $keyword, $avoidCourses, $conditions, true);
}
public static function getCoursesInCategory($category_code = '', $keyword = '', $avoidCourses = true, $conditions = [], $getCount = false)
{
public static function getCoursesInCategory(
$category_code = '',
$keyword = '',
$avoidCourses = true,
$conditions = [],
$getCount = false
) {
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
$tblCourseCategory = Database::get_main_table(TABLE_MAIN_CATEGORY);
$keyword = Database::escape_string($keyword);
@ -829,6 +842,48 @@ class CourseCategory
return $html;
}
/**
* Get li HTML of page number.
*
* @param $pageNumber
* @param $pageLength
* @param array $liAttributes
* @param string $content
*
* @return string
*/
public static function getPageNumberItem(
$pageNumber,
$pageLength,
$liAttributes = [],
$content = ''
) {
// Get page URL
$url = self::getCourseCategoryUrl(
$pageNumber,
$pageLength
);
// If is current page ('active' class) clear URL
if (isset($liAttributes) && is_array($liAttributes) && isset($liAttributes['class'])) {
if (false !== strpos('active', $liAttributes['class'])) {
$url = '';
}
}
$content = !empty($content) ? $content : $pageNumber;
return Display::tag(
'li',
Display::url(
$content,
$url,
['class' => 'page-link']
),
$liAttributes
);
}
/**
* Return URL to course catalog.
*
@ -855,7 +910,9 @@ class CourseCategory
$action = 'subscribe';
}
$categoryCodeRequest = isset($_REQUEST['category_code']) ? Security::remove_XSS($_REQUEST['category_code']) : null;
$categoryCodeRequest = isset($_REQUEST['category_code']) ? Security::remove_XSS(
$_REQUEST['category_code']
) : null;
$categoryCode = isset($categoryCode) ? Security::remove_XSS($categoryCode) : $categoryCodeRequest;
$hiddenLinksRequest = isset($_REQUEST['hidden_links']) ? Security::remove_XSS($_REQUEST['hidden_links']) : null;
$hiddenLinks = isset($hiddenLinks) ? Security::remove_XSS($hiddenLinksRequest) : $categoryCodeRequest;
@ -884,48 +941,6 @@ class CourseCategory
return $pageUrl;
}
/**
* Get li HTML of page number.
*
* @param $pageNumber
* @param $pageLength
* @param array $liAttributes
* @param string $content
*
* @return string
*/
public static function getPageNumberItem(
$pageNumber,
$pageLength,
$liAttributes = [],
$content = ''
) {
// Get page URL
$url = self::getCourseCategoryUrl(
$pageNumber,
$pageLength
);
// If is current page ('active' class) clear URL
if (isset($liAttributes) && is_array($liAttributes) && isset($liAttributes['class'])) {
if (false !== strpos('active', $liAttributes['class'])) {
$url = '';
}
}
$content = !empty($content) ? $content : $pageNumber;
return Display::tag(
'li',
Display::url(
$content,
$url,
['class' => 'page-link']
),
$liAttributes
);
}
/**
* Return the name tool by action.
*
@ -958,16 +973,42 @@ class CourseCategory
return $nameTools;
}
public static function deleteImage(CourseCategoryEntity $category)
{
$assetRepo = Container::getAssetRepository();
$assetId = $category->getImage();
$asset = $assetRepo->find($assetId);
$assetRepo->delete($asset);
$category->setImage('');
$repo = Container::getCourseCategoryRepository();
$repo->save($category);
}
/**
* Save image for a course category.
*
* @deprecated
*
* @param int $categoryId Course category ID
* @param array $fileData File data from $_FILES
* @param array $fileData File data from $_FILES
*/
public static function saveImage($categoryId, $fileData)
public static function saveImage(CourseCategoryEntity $category, $fileData)
{
if (isset($fileData['tmp_name']) && !empty($fileData['tmp_name'])) {
$categoryId = $category->getId();
$extension = getextension($fileData['name']);
$fileName = "cc_$categoryId.{$extension[0]}";
$repo = Container::getAssetRepository();
$asset = new Asset();
$asset
->setCategory(Asset::COURSE_CATEGORY)
->setTitle($fileName);
$asset = $repo->createFromRequest($asset, $fileData);
$category->setImage($asset->getId());
$repo = Container::getCourseCategoryRepository();
$repo->save($category);
}
/*
$categoryInfo = self::getCategoryById($categoryId);
if (empty($categoryInfo)) {
@ -999,24 +1040,15 @@ class CourseCategory
}
/**
* @param $categoryId
* @param $category
* @param string $description
*
* @return string
*/
public static function saveDescription($categoryId, $description)
public static function saveDescription(CourseCategoryEntity $category, $description)
{
$categoryInfo = self::getCategoryById($categoryId);
if (empty($categoryInfo)) {
return false;
}
$table = Database::get_main_table(TABLE_MAIN_CATEGORY);
Database::update(
$table,
['description' => $description],
['id = ?' => $categoryId]
);
return true;
$repo = Container::getCourseCategoryRepository();
$category->setDescription($description);
$repo->save($category);
}
}

@ -279,23 +279,19 @@ class ExtraFieldValue extends Model
}*/
$fileName = ExtraField::FIELD_TYPE_FILE_IMAGE."_{$params['item_id']}.png";
if (!empty($value['tmp_name']) && isset($value['error']) && 0 == $value['error']) {
$mimeType = mime_content_type($value['tmp_name']);
$file = new UploadedFile($value['tmp_name'], $fileName, $mimeType, null, true);
$repo = Container::getAssetRepository();
$asset = new Asset();
$asset
->setCategory(Asset::EXTRA_FIELD)
->setTitle($fileName)
->setFile($file)
;
$cropVariable = 'extra_'.$field_variable.'_crop_result';
if (isset($params[$cropVariable])) {
$asset->setCrop($params[$cropVariable]);
}
$em->persist($asset);
$em->flush();
$assetId = $asset->getId();
//$repo = Container::getAssetRepository();
if ($assetId) {
$asset = $repo->createFromRequest($asset, $value);
if ($asset) {
$assetId = $asset->getId();
// Crop the image to adjust 16:9 ratio
/*$imageExtraField = new Image($value['tmp_name']);
$imageExtraField->resize(400);
@ -337,9 +333,6 @@ class ExtraFieldValue extends Model
$cleanedName = api_replace_dangerous_char($value['name']);
$fileName = ExtraField::FIELD_TYPE_FILE."_{$params['item_id']}_$cleanedName";
/*if (!file_exists($fileDir)) {
mkdir($fileDir, $dirPermissions, true);
}*/
if (!empty($value['tmp_name']) && isset($value['error']) && 0 == $value['error']) {
/*$cleanedName = api_replace_dangerous_char($value['name']);

@ -74,10 +74,10 @@ UPDATE language SET parent_id = 18 WHERE english_name = 'occitan';
UPDATE language SET parent_id = 40 WHERE english_name = 'brazilian';
UPDATE language SET parent_id = 45 WHERE english_name = 'trad_chinese';
INSERT INTO course_category (name, code, parent_id, tree_pos, children_count, auth_course_child, auth_cat_child) VALUES
('Language skills','LANG',NULL,1,0,'TRUE','TRUE'),
('PC Skills','PC',NULL,2,0,'TRUE','TRUE'),
('Projects','PROJ',NULL,3,0,'TRUE','TRUE');
-- INSERT INTO course_category (name, code, parent_id, tree_pos, children_count, auth_course_child, auth_cat_child) VALUES
-- ('Language skills','LANG',NULL,1,0,'TRUE','TRUE'),
-- ('PC Skills','PC',NULL,2,0,'TRUE','TRUE'),
-- ('Projects','PROJ',NULL,3,0,'TRUE','TRUE');
INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible_to_self, changeable, created_at) VALUES (1, 1, 'legal_accept','Legal',0,0, NOW());
INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible_to_self, changeable, created_at) VALUES (1, 1, 'already_logged_in','Already logged in',0,0, NOW());

@ -2,6 +2,9 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Asset;
use Chamilo\CoreBundle\Framework\Container;
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
@ -400,8 +403,8 @@ if ($form->validate()) {
);
if ($extraFieldValueData) {
$repo = \Chamilo\CoreBundle\Framework\Container::getAssetRepository();
/** @var \Chamilo\CoreBundle\Entity\Asset $asset */
$repo = Container::getAssetRepository();
/** @var Asset $asset */
$asset = $repo->find($extraFieldValueData);
if ($asset) {
$extraFields['extra_image']['id'] = $extraFieldValueData;

@ -31,7 +31,7 @@ class AccessUrlRelCourseCategory
/**
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\CourseCategory", inversedBy="urls", cascade={"persist"})
* @ORM\JoinColumn(name="course_category_id", referencedColumnName="id")
* @ORM\JoinColumn(name="course_category_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected CourseCategory $courseCategory;

@ -71,7 +71,7 @@ class CourseCategory
/**
* @ORM\ManyToOne(targetEntity="CourseCategory", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected ?CourseCategory $parent = null;

@ -119,7 +119,7 @@ class Version20170628122900 extends AbstractMigrationChamilo
}
if (false === $table->hasForeignKey('FK_3545C2A66628AD36')) {
$this->addSql(
'ALTER TABLE access_url_rel_course_category ADD CONSTRAINT FK_3545C2A66628AD36 FOREIGN KEY (course_category_id) REFERENCES course_category (id)'
'ALTER TABLE access_url_rel_course_category ADD CONSTRAINT FK_3545C2A66628AD36 FOREIGN KEY (course_category_id) REFERENCES course_category (id) ON DELETE CASCADE'
);
}
if (false === $table->hasIndex('IDX_3545C2A673444FD5')) {

@ -101,7 +101,7 @@ class Version20191101132000 extends AbstractMigrationChamilo
$table = $schema->getTable('course_category');
if (false === $table->hasForeignKey('FK_AFF87497727ACA70')) {
$this->addSql(
'ALTER TABLE course_category ADD CONSTRAINT FK_AFF87497727ACA70 FOREIGN KEY (parent_id) REFERENCES course_category (id);'
'ALTER TABLE course_category ADD CONSTRAINT FK_AFF87497727ACA70 FOREIGN KEY (parent_id) REFERENCES course_category (id) ON DELETE CASCADE'
);
}
if (!$table->hasColumn('image')) {

@ -11,6 +11,7 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use League\Flysystem\FilesystemOperator;
use PhpZip\ZipFile;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Routing\RouterInterface;
use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
@ -94,6 +95,19 @@ class AssetRepository extends ServiceEntityRepository
return '/assets'.$helper->asset($asset);
}
public function createFromRequest(Asset $asset, $file): Asset
{
if (isset($file['tmp_name']) && !empty($file['tmp_name'])) {
$mimeType = mime_content_type($file['tmp_name']);
$file = new UploadedFile($file['tmp_name'], $asset->getTitle(), $mimeType, null, true);
$asset->setFile($file);
$this->getEntityManager()->persist($asset);
$this->getEntityManager()->flush();
}
return $asset;
}
/*public function getFileContent(Asset $asset): string
{
try {

@ -13,6 +13,7 @@ use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\Persistence\ManagerRegistry;
use PhpCsFixer\Fixer\ControlStructure\TrailingCommaInMultilineFixer;
class CourseCategoryRepository extends ServiceEntityRepository
{
@ -46,6 +47,8 @@ class CourseCategoryRepository extends ServiceEntityRepository
if (!empty($parentId)) {
$qb->andWhere($qb->expr()->eq('c.parent', $parentId));
} else {
$qb->andWhere($qb->expr()->isNull('c.parent'));
}
$query = $qb->getQuery();
@ -139,4 +142,11 @@ class CourseCategoryRepository extends ServiceEntityRepository
$em->remove($category);
$em->flush();
}
public function save(CourseCategory $category): void
{
$em = $this->getEntityManager();
$em->persist($category);
$em->flush();
}
}

Loading…
Cancel
Save